{"componentChunkName":"component---src-pages-blogs-index-en-js","path":"/en/blogs/","result":{"data":{"site":{"siteMetadata":{"title":"LaiOffer","description":"Develop technical knowledge. Improve programming skills. Build your career in software engineering.","url":"https://www.laioffer.com"}},"news":{"edges":[{"node":{"title":"谷歌/亚马逊/脸书/苹果等一线科技公司面试必备，最全软件工程师求职准备清单","path":"/en/news/2021-05-06-software-engineer-checklist/","node_locale":"en-US","id":"5ddafae3-090a-5177-a258-6bddb960b61d","contentful_id":"3vgd45XZqWCXs7sV1eLX5M","date":"2021-05-06T12:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Google","Amazon","Facebook","Apple","Software Engineer"],"description":{"description":"在美国求职软件工程师的小伙伴们经常询问：“我好想去谷歌/亚马逊/脸书/苹果公司工作，但是一直过不了技术面试！真的好难啊！”其实想要通过FLAG级别的公司面试，最需要的就是软硬实力兼具！"},"thumbnail":{"id":"fddff505-6e75-5913-9731-93f00189581c","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/5fSToTForDwDJlsmRNaLB4/663424fe26e6ed2ed8f411f221bd393b/gafa-826x459.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/5fSToTForDwDJlsmRNaLB4/663424fe26e6ed2ed8f411f221bd393b/gafa-826x459.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Google, Amazon, Facebook, Apple, Software Engineer","authorProfile":null,"body":{"id":"34d52364-be89-5fc4-b56f-e6a14d6c8dc3","body":"在美国求职软件工程师的小伙伴们经常询问：“我好想去谷歌/亚马逊/脸书/苹果公司工作，但是一直过不了技术面试！真的好难啊！”\n\n其实想要通过FLAG级别的公司面试，最需要的就是软硬实力兼具！尤其是像谷歌/亚马逊这样的公司，对技术方面的要求极高。\n\n在谷歌面试的6个环节中，技术面试一直是权重最大的，以其难度大、出题灵活性，以及种类多变的现场互动闻名。今天我们就以谷歌/亚麻技术面试为例，分别从硬实力和软实力两个维度去刨析拿下技术面试的关键点。\n\n## Part 1: 硬实力\n\n所谓硬实力，就是候选人所应具备的技术能力。尤其是对于软件工程师这样的岗位，技术就是根本，可以从写码、系统设计、网络、Debug、数据结构、算法等角度来准备。\n\n### __1. Coding（写码能力）__\n\n首先作为一名软件工程师，要有一门自己绝对擅长的语言，并能在既定的时间内，用代码来解决现实社会中的问题，并具备高效性（效率最大化）、易读性（代码不复杂）、和可维护性（能够长期使用）。\n\n当具备这样的能力之后进行面试，面试官还会就候选人的理解和逻辑能力进行进一步的考察。\n\n### __2. System/OODesign（系统/面向对象设计）__\n\n面向对象设计和系统设计可以说是技术面试中很多同学最担心的部分了。尤其是像亚麻这样的公司，即使是new grad，对于系统/OOD题目也几乎是必考。\n\n通常情况下，面试官会考察候选人能否将一个模糊的需求细化、抽象成计算机能够模拟和解决的问题，是否了解要设计一个大型系统，应该考虑哪些方面。\n\n比如说，亚麻就有一道面试真题是这样问的：\n\n*Interview Question：Design a system for a parking lot where drivers can also have memberships (but also support guest drivers). The parking lot has counter screens on each row.*\n*面试问题：如何为停车场设计一个系统，让司机可以作为会员停车，同时也支持非会员停车，并可以让停车场的每一排都有一个自助柜台？*\n\n像这样的问题就对面试者计算机知识储备和在复杂情况下的全局设计能力有很高要求。\n\n面向对象、数据库、分布式系统、多线程等知识缺一不可，也是需要同学们日积月累才能形成的知识结构。\n\n### __3. Networking（网络）__ \n\n如果你的求职方向是网络工程师，那这一部分的技术需要你对web application的常见网络架构有一定理解，经典的题目有：\n\n*面试问题：*\n*从浏览器输入一个 URL 到页面渲染完成，需要经过哪些步骤？*\n*DNS 的基本原理是什么？*\n\n不过具体如何准备还是要看岗位要求，把job description上的所有需求都掌握，才能更好拿捏面试官想要考察的知识。\n\n### __4. Debug（故障排除）__\n\nTroubleshooting考查的是现实工作场景中如何debug的能力，也是作为软件工程师必备的能力。\n\n一套标准的Troubleshooting工作需要遵照以下顺序：\n\n- Examine（识别、跟踪、确认故障）\n- Diagnose（推算潜在风险、验证推断、反复验算）\n- Test or treat（评估风险等级后安排debug优先级、在emergency情形下需要将“止损”作为首要目标）\n\n对于测试部分的要求大多为单元测试，要求面试者能够自己写test来验证代码的正确性。\n\n### __5. Data structure & Algorithms（数据结构&算法）__\n\n对于数据结构和算法的考察在面试中非常常见。面试者要能够深度理解各种数据结构和算法，对应选择高效的解决方案，并能够向面试官阐明原因。\n\n数据结构部分会知识点会包括但不限于：\n\n- 二叉树 Binary Tree\n- 栈 Stack\n- 队列 Queue\n- 哈希表 Hash Table\n- 链表 Linked List\n- ……\n\n算法部分的考察会包括但不限于以下知识点：\n\n- 动态规划 Dynamic Programming\n- 递归 Recursion\n- 图搜索算法 Graph Search \n- 分治 Divide Conquer \n- 二分查找 Binary Search\n- ……\n\n能够从实操层面上真正理解好以上知识点，才是面试通过的关键。\n\n## Part 2: 软实力\n\n软实力是候选人技术水平以外的综合能力，代表了软件工程师沟通、表达，和团队协作的能力。在大厂面试中，软实力起到的作用不亚于技术能力。同学们可以从沟通技巧、提问话术、开放式思维、提出假设和解决问题的能力来入手提高。\n\n### __1. Communication（沟通能力）__\n\n或许很多人已经觉得老生常谈，沟通能力有什么难的？在面试里又如何体现呢？\n\n其实，很多细节都可以暴露出候选者的沟通能力，比如在解题前，面试者是否有跟面试官沟通明确题目要求，有没有分析各种可能的情形？\n\n而在得到面试问题后的3-5分钟，面试者又是否主动阐述自己想法，与面试官确认好题目的scope和corner cases了呢？这些都是面试官考察面试则沟通能力的细节。\n\n我们这里为大家列举了一些常见的提问，比如：\n\n*面试问题：*\n*这个题的数据规模有多大？会超出正常内存容量上限吗？*\n*这个题的输入保证是valid data吗？*\n*网络断开的情况要考虑吗？*\n*这个corner case有一定歧义，怎样输出比较合理？*\n\n在谷歌的技术面试里，很多面试题是“故意”设计成开放式问题的。面对这种问题时，应该多向面试官提问，获得一些关键的hints，来解锁一些隐藏解题路线。\n\n面试官考察的是你能否从一个基本的解开始，不断进行优化，直到达到最优解。\n\n### __2. CART四部曲（解题思路）__\n\n面试过程中，解题思路比结果重要。\n\n比如，Think out loud就是面试官最看重的品质之一，指的是在解题过程中，要将你的解题思路清晰地呈现给面试官。\n\n为了达到这一点，在面试过程中我们可以使用CART原则，即Clarify，Assumption，Result，Test。\n\n- Clarify（即听清问题的重点，询问有歧义或不明确的部分）\n- Assumption（提出自己的假设）\n- Result（提出自己的解决方案）\n- Test（验证自己的方法和代码的正确性）\n\n这样一步一步清楚阐明自己的解题思路，可以让候选人的思路过程清晰地呈现给面试官，更容易让面试官了解到面试者不仅有很强的技术，也是个拥有着极强逻辑思维和软实力的人。\n\n还想知道哪里可以学到硬核软件工程师求职技能？以及如何培养软硬实力，提升程序员面试通过率，上岸FLAG大厂？\n\n来Offer[【软件工程师旗舰核心课程】](https://www.laioffer.com/zh/course/software-development/)6月2日，免费试听\n点击了解课程详情：https://www.laioffer.com/zh/course/software-development/\n"}}},{"node":{"title":"别再做一个“不会说话”的程序员! 脸书Tech Lead总结4大软件工程师面试技巧, 你都具备吗？","path":"/en/news/2021-04-22-facebook-software-engineer-communication/","node_locale":"en-US","id":"b8b619fc-2200-58fb-b835-3e44ab0b2a56","contentful_id":"45SUPU9L0IJ7ahDFhDRwzz","date":"2021-04-22T12:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Facebook","Software Engineer","Interview","Communication"],"description":{"description":"不少人都会对软件工程师有不擅交流的刻板印象，认为他们大部分工作内容都是面对电脑，不需要考虑怎么提升交流能力。其实对于软件工程师来说，交流沟通能力是和硬实力同样重要的核心技能。同时，面试官也格外青睐有优秀交流能力的求职者，不少公司都将“communication skill”列在了软件工程师岗位的必备能力中......\n"},"thumbnail":{"id":"fe0088ea-bf52-5b91-9021-c952f5b4f98f","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/4YOab3B6A8sgUQzLvezcNe/d8a4c094ebe635cf1a46200009865664/100.png?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/4YOab3B6A8sgUQzLvezcNe/d8a4c094ebe635cf1a46200009865664/100.png?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/4YOab3B6A8sgUQzLvezcNe/d8a4c094ebe635cf1a46200009865664/100.png?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/4YOab3B6A8sgUQzLvezcNe/d8a4c094ebe635cf1a46200009865664/100.png?w=1600&h=1100&q=50&fit=fill 2x"}},"thumbnailAlt":"Facebook, Software Engineer, Interview, Communication","authorProfile":null,"body":{"id":"086bde92-a804-5de9-9b65-a5fa1e900f20","body":"不少人都会对软件工程师有不擅交流的刻板印象，认为他们大部分工作内容都是面对电脑，不需要考虑怎么提升交流能力。\n\n其实对于软件工程师来说，__交流沟通能力是和硬实力同样重要的核心技能__。同时，面试官也格外青睐有优秀交流能力的求职者，不少公司都将__“communication skill”__列在了软件工程师岗位的必备能力中：\n\n![Google Microsoft Job Description Communication](//images.ctfassets.net/04k2xg9gplcj/zjZWBbsV5vLMcwY2RtN5O/cf49b4d0e74221426e8bbc3f49765b4d/001.png)\n\n那么如何才能在面试中展示自己优秀的交流能力呢？来自__Facebook的技术主管Sean Viswanathan__就总结出以下几条程序员面试中的沟通技巧，让我们一起来看看吧。\n\n*（以下内容节选自Sean的文章\"How To Improve Communication During A Coding Interview\"）*\n\n## 1. 让面试官知道你在干什么，\"Think Out Loud\" \n\n不与面试官同步自己的想法和思路是很多面试者都会犯的一个错误。面试官不是监考官，他们不仅需要确认你有能力解出算法题，而且需要了解你做题的思路和逻辑。\n\n想要确保面试官和自己思路同步，面试者可以使用亚里士多德的交流三步法：\n\n- Tell them what you’re going to tell them（告诉面试官你即将用什么算法解决问题）\n- Then tell them（详细解释你的算法）\n- And then tell them what you told them（解释为何你的算法能够解决这个问题）\n\n同时，面试者也可以通过时常询问 “请问我刚才解释清楚我的思路了吗？” 、“请问到目前为止有什么问题吗？” 来确保面试官和自己思路同步。\n\n这样做也可以让面试官及时发现纠正你的错误，并且在你遇到困难时知道该如何给予帮助。\n\n## 2. 有逻辑地回答问题，避免思维过分跳跃\n\n很多人在面试时都会犯一个常见错误，那就是思维“过分跳跃”。下面我们就用一个面试真题来举例，来看看面试者应该如何在面试中保持逻辑性。\n\n> 面试问题：How to check if a tree is balanced？\n\n要有逻辑的解决这个问题，面试者需要做到以下几点：\n\n- Working through some examples（尝试举例分析）\n- Discussing step-by-step process（一步步解释如何分析树）\n- Avoid recursive case without explaining（避免在未解释的情况下跳到某个递归的情况）\n\n如果你在思考时担心自己的思路还不够缜密有逻辑，你可以在白板（whiteboard）或文档（doc）中做笔记，并告知面试官自己需要几分钟的时间整理思绪。\n\n有时候适当的停顿和思考可以帮助你理清自己的解题逻辑。\n\n## 3. 利用白板辅助回答，解题思路\"可视化\"\n\n白板（Whiteboard）是在回答问题过程中清晰表达逻辑的利器。在线上面试中，我们虽然无法使用传统白板去展示自己的想法，但仍然可以借助一些线上的文档编辑器或画图工具，来将自己的思路“可视化”。\n\n通过白板来展示思路，面试者就能写出更有逻辑、更清晰简洁的代码。同时，在编写代码的过程中，面试者还需要考虑到以下这些面试官会关注的要点：\n\n- 你是否将一个冗长复杂的函数分解成了小的辅助函数？\n- 你是否能通过连接每个小部分来解决一个大问题，还是会因为一些不重要的小部分而分心？\n- 你是否花费太多的精力在无关紧要的信息上？\n- 这段代码可以重复使用吗？它是一个通用算法吗？\n- 你是否考虑清楚了用例和代码的环境？\n\n## 4. 谨慎衡量各种解题思路，权衡法与替代法\n\n很多面试者在拿到编程算法题后，一有思路就开始埋头苦写，反而没有全面地去思考为什么选择这种解题方法，这种解法又最终会对结果造成怎样的影响。\n\n在面试中，我们可以使用权衡法和替代法来从众多解题方法中做出选择。与其使用脑海中蹦出来的第一种解题思路，面试者需要先仔细思考一下是否有其他思路也可以解答这道算法题。\n\n在想到两种或以上的解题思路后，再考虑这些思路的利弊，并根据实际的应用情景作出最佳的判断。\n\n看完以上这些与面试官的交流技巧，你是否觉得自己的面试能力还有待提升呢？\n\n想要了解更多谷歌、亚马逊、脸书、微软等一线科技公司软件工程师求职必备技能吗？想要快速提升CS技术能力，成功上岸吗？\n\n来Offer[【软件工程师旗舰核心课程】](https://www.laioffer.com/zh/course/software-development/)4月29日，免费试听\n点击了解课程详情：[https://www.laioffer.com/zh/course/software-development/](https://www.laioffer.com/zh/course/software-development/)\n"}}},{"node":{"title":"谷歌数据科学岗位面试指南：产品、统计、coding全都要考？！","path":"/en/news/2020-11-20-google-data-science-interview/","node_locale":"en-US","id":"dbc14507-eeda-577a-a4a8-ec03e0274d98","contentful_id":"EzbPNBxXU30pMBM4MXHu1","date":"2020-11-20T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Google","Data Scientist","Product Analyst","Interview","Virtual Onsite"],"description":{"description":"作为世界顶尖的科技公司之一，谷歌拥有多款超过10亿活跃用户的产品，由此也产生了庞大的数据量。为了高效应对和处理，谷歌也专门设有数据科学团队，从中挖掘宝贵的信息，为公司提供战略支持。那么，数据科学家在谷歌到底是一个怎样的角色？想要面试谷歌数据科学岗位，要如何做准备？"},"thumbnail":{"id":"10f2a984-6368-5d1c-a03f-0376b0a99648","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3j41l310hdforoM0IygzLi/30e8185464e8b218ce40d9d0dd1de167/google-data-scientist-interview.png?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/3j41l310hdforoM0IygzLi/30e8185464e8b218ce40d9d0dd1de167/google-data-scientist-interview.png?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/3j41l310hdforoM0IygzLi/30e8185464e8b218ce40d9d0dd1de167/google-data-scientist-interview.png?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/3j41l310hdforoM0IygzLi/30e8185464e8b218ce40d9d0dd1de167/google-data-scientist-interview.png?w=1600&h=1100&q=50&fit=fill 2x"}},"thumbnailAlt":"Google, Data Scientist, Product Analyst, Interview, Virtual Onsite","authorProfile":null,"body":{"id":"18b6592c-9ba3-553c-8ef2-de2d9631dfe4","body":"作为世界顶尖的科技公司之一，谷歌拥有多款超过10亿活跃用户的产品。拿搜索举例，根据2019的数据统计，谷歌平均每秒处理超过40,000个搜索查询，相当于每天35亿次的搜索量。应对如此巨大的数据量，谷歌也专门设有__数据科学团队__，从中__挖掘宝贵的信息，为公司提供战略支持__。\n\n那么，数据科学家在谷歌到底是一个怎样的角色？想要面试谷歌数据科学岗位，要如何做准备？\n\n## 在Google，数据科学家是什么角色？\n\n在谷歌，和数据相关的岗位有很多，包括__数据科学家、机器学习工程师、产品分析师__等等。\n\n其中，数据科学家的工作主要以定量分析为主，__利用分析、机器学习理论以及统计学概念和方法来确定产品开发方向、改善用户体验__。\n\n在不同的团队，数据科学家的工作侧重点也有所不同。比如在Search Ads，数据科学家主要负责设计和分析测试实验，以了解系统更改的影响并提供建议。同时与分析师和软件工程师合作研究核心算法，以改善客户体验。\n\n## Google数据科学岗位面试流程\n\n谷歌的面试非常标准化，主要由__Recruiter电话面试、技术面试和Onsite__三部分组成。由于疫情的影响，目前onsite已经改成了__虚拟面试（VO）__。\n\n#### Recruiter电面（30min左右）\n\n在这轮面试中，recruiter会和你阐述关于该职位的细节。同时，他/她也会进一步了解你的兴趣和目标，与公司文化、价值观的契合程度，以便将你安置在不同团队。\n\n#### 技术面试（45min左右）\n\n技术面试将通过Google Hangouts进行，该轮面试由__数据科学家或招聘主管__作为面试官主导进行。面试内容包括__实验设计，统计、coding__等各方面的技术问题。同时，面试官也会针对你过去的研究经验或工作经验进行技术讨论。\n\n__*问题举例*__\n\n- A statistics question (computational stats) or causal inference question\n- Coding question on a shared code editor\n- Describe a past data science based project.\n- What problems did you encounter? What approach would you have used if the data was different?\n\n#### Virtual Onsite（原onsite）\n\n和传统的onsite一样，谷歌的VO也是分__5轮__进行，不过VO不再有传统onsite中包含的lunch break环节。\n\n在每轮面试中，你将分别和一位面试官进行1v1的交流，长度也在45min左右。其中__既包括技术面试，也涉及BQ方面的问题__。\n\n1. 技术面试：\n\n技术面试将由不同的面试官从__机器学习、统计概率、产品、编程__等不同的维度对求职者进行提问。\n\n__*问题举例*__\n\n__Machine Learning：__\n- What is the difference between K-mean and EM?\n- Why use feature selection? If two predictors are highly correlated, what is the effect on the coefficients in the logistic regression? What are the confidence intervals of the coefficients?\n\n__Statistics & Probality：__\n- For a sample size of N, the margin of error is 3. How many more samples do we need for the margin of error to hit 0.3?\n- What is the assumption of error in linear regression?\n- How can you tell if a given coin is biased?\n\n__Product & Business：__\n- How would you detect inappropriate content on Youtube?\n- How do you test if a new feature has increased engagement in Google's ecosystem?\n- If the outcome of an experiment results in one group clicking 5% more than the other, is that a good result?\n\n__Programming：__\n- Write a function to generate N samples from a normal distribution and plot the histogram.\n\n2. BQ面试：\n\nBQ问题有可能平均分散在各轮面试中，也有拎出来作为单独的一轮。在准备BQ时，建议大家重点关注谷歌的四个Behavior要点：__General cognitive ability, Leadership, Googleyness, Role-related knowledge__，面试的时候尽量将自己的符合公司文化的那一面展现出来。\n\n## Google数据科学岗位面试Tips\n\n1. 谷歌DS的很多面试题都是基于自家产品的真实情境。面试前，求职者可以__对谷歌的一系列产品做好research__，提前设想一下可以如何改进产品或测试产品。\n\n2. 我们前面提到过，谷歌的数据科学家岗位侧重量化分析，因此在面试考察时也很__重视统计&概率方面的问题__，大家在面试前要做好充足的准备。\n\n3. 是的，__数据岗位也是要考coding的__！\n\n4. 近年来谷歌对于BQ越来越重视，这也是在你技术关达标后，最终是否能拿到offer的关键因素，重要性不容小觑。\n\n来Offer[【人工智能与数据科学强化课程】](https://www.laioffer.com/zh/course/ai-and-data-engineering/)12月2日，免费试听\n点击了解课程学详情：https://www.laioffer.com/zh/course/ai-and-data-engineering/\n"}}},{"node":{"title":"CS求职有哪些内幕？拿不到面试的最大阻碍居然是......","path":"/en/news/2020-12-04-computer-science-major/","node_locale":"en-US","id":"a1a3218e-734b-52b6-b8af-0cf4f23ade4f","contentful_id":"4zsAXPCDkAgdtaIht9egfG","date":"2020-12-04T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Computer Science","New Grad","Software Engineer","Job Hunting"],"description":{"description":"计算机科学(CS)可以说是最受国际生欢迎的专业之一了，不仅毕业后工资待遇高、公司H1B、移民等政策好，近年来CS领域相关工作机会更是不断涌出。不过，想要在CS领域谋求一份工作，也并非是轻轻松松。具有“美国版知乎”之称的Quora，最近就有一个话题：“关于CS专业你不知道的内幕......”"},"thumbnail":{"id":"85dae713-9dff-5063-9b1b-f10d0a8c96b5","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/2rrq2TnHpLOb4Xzzr8tGk9/6e4b2d6a6443ed7a6df972fb9affed92/Computer-Science-BS.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/2rrq2TnHpLOb4Xzzr8tGk9/6e4b2d6a6443ed7a6df972fb9affed92/Computer-Science-BS.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Computer Science, New Grad, Software Engineer, Job Hunting","authorProfile":null,"body":{"id":"527ae398-76d9-5027-b400-39ee5c0a5d91","body":"计算机科学(CS)可以说是最受国际生欢迎的专业之一了，不仅毕业后工资待遇高、公司H1B、移民等政策好，牛人们更是年纪轻轻就手握几十万年薪。尤其是近年来CS领域相关工作机会不断涌出，根据USCIS的报告，在国际人才中，CS方向是人才缺口最大的领域！\n\n不过，想要在CS领域谋求一份工作，也并非是轻轻松松。具有“美国版知乎”之称的Quora，最近就有一个话题，围绕着普罗大众对CS的各种迷思和幻想，展开了讨论：__“关于CS专业你不知道的内幕......”__\n\n### 爆料1：CS科班出身 ≠ job offer\n\n__爆料人: Yadiel Cabrera__ \n__职业: Software Developer__\n\n“好多非CS的、甚至CS专业的本科生，都有一种迷思：就是毕业以后，你会得到数不尽的job offer，因为CS专业的人是这个市场上的稀缺人才。错，市场上缺失的不是你，而是highly skilled软件工程师。__【highly skilled 软件工程师】和 【CS毕业生】之间，没有等号__。想拿到面试？你还是要__挤出时间去多做项目__去充实你的简历。想通过面试？你还是花学业外的功夫去好好准备。”\n\n![1](//images.ctfassets.net/04k2xg9gplcj/3gcBedO9jCgK9apw7s4hRI/db1ee3e9db36be661bc7720dc7785fc2/e13b6ce9e7adfb23c362fc729c84f3a7.jpg)\n\n### 爆料2：好成绩并不会给你更好的工作\n\n__爆料人: Dylan Vonarx__ \n__职业：华盛顿大学CS学生__\n\n“你的__GPA成绩其实没有你想象中的那么重要__。去面试的时候就是看你白板做题做的好不好，以及一些技术类的知识问题你回答得好不好。面试官没有那么在意你的成绩。”\n\n![2](//images.ctfassets.net/04k2xg9gplcj/3uDP7TgIKEqmzlLn8yz8g2/5bf77de85d7ed3b1eb3dedfa5e9ba44a/ab9beb510d6d614e5f297d44dd8b15ec.jpg)\n\n### 爆料3：工业界重视的技术学校并不教授\n\n__爆料人: Shubham Aggarwal__\n__职业：佛罗里达大学学生__\n\n“They don't teach you the skills that you need to land a software job out of college. __学校不会教你对你找工作有用的技能__。我有个朋友，Johns Hopkins大学的CS本科和硕士，这个学校够牛吧。可他却从来没有pass过大公司的技术面试，什么Google，Facebook，Amazon都fail了。By the way，他的GPA是3.8+。\n\n__现在技术更新快，学校里教的语言啊、概念啊，其实都比较更不上时代了__。而且就算你是CS专业的，你也要记得多花点时间练习coding，光是完成学校的那些课程和作业，绝对不够让你成为一个experienced programmer。”\n\n![3](//images.ctfassets.net/04k2xg9gplcj/lAGnLUYjKxbOskAbBTtvw/c97e75d834141f7ffaf20f8197502cf3/8f2c65580a985c290cfc79bc4a3a6f2d.jpg)\n\n__爆料人: 匿名quora用户__ \n\n“那天来我们学校招聘的一个Google recruiter都跟我们‘坦白’了，其实你在学校里学的课程，对求职管用的就2门课：algorithms course 和  software engineering principles course，没了。__除此之外的工业界想要的专业技能，学校里都学不到__。”\n\n![4](//images.ctfassets.net/04k2xg9gplcj/2vM5cvOp0o3KqGrtwumDHN/40c370740136195ca795b4263c95360f/82fca4cea993e56e9973da3d3315fe87.jpg)\n\n如果学校教授的技能并非工业界所需，那么去哪里学习工业界需要的技术？\n\n来Offer[【软件工程师旗舰核心课程】](https://www.laioffer.com/zh/course/software-development//)12月15日，免费试听\n点击了解课程详情：https://www.laioffer.com/zh/course/software-development/"}}},{"node":{"title":"盘点: 北美程序员到底挣多少, 国内哪个城市程序员挣得最多？","path":"/en/news/2020-10-28-software-engineer-salary-US-China/","node_locale":"en-US","id":"5b465115-22c6-5eb4-ba10-ae921ce93f83","contentful_id":"4CbEEJtOyKNIxqSRig0EeZ","date":"2020-10-28T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Tech Trends","Salary","Software Engineer"],"description":{"description":"程序员薪资高已经算不得“秘密”，然而，真实的收入受到国家、城市、岗位、支付货币等多方面影响，同样性质的工作不同地区收入也大有不同。那我们就来盘点一下，中美地区的程序员薪资、热门城市、和热门岗位吧！"},"thumbnail":{"id":"03cfc815-c577-5de8-b962-cb9418b4ec5c","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/6rz2LKbggIpEBqGrVc8VAS/1f1f3bfe0269f6e8e155e89c2b9c7fe1/software-engineer-salary-silicon-valley-beijing.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/6rz2LKbggIpEBqGrVc8VAS/1f1f3bfe0269f6e8e155e89c2b9c7fe1/software-engineer-salary-silicon-valley-beijing.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Tech Trends, Salary, Software Engineer","authorProfile":null,"body":{"id":"e76e171a-3e4e-5f6e-b7cc-62d12291fb64","body":"程序员薪资高已经算不得“秘密”，然而，真实的收入受到国家、城市、岗位、支付货币等多方面影响，同样性质的工作不同地区收入也大有不同。那我们就来盘点一下，中美地区的程序员薪资、热门城市、和热门岗位吧！\n\n## 美国程序员薪资一览\n\n据Hired 2020薪资调查报告，__美国的科技行业工作者平均薪资为$146,000，高于全球平均薪资__。其中，平均薪资最高的城市为：旧金山湾区、纽约、西雅图。\n\n![software engineer salary](//images.ctfassets.net/04k2xg9gplcj/hnS0DRI1tpFn3X8OJ1COm/7a42ad2224fa44a44ce760f5bd9632ce/______2020-10-28_______3.12.51.png)\n\n### 1. 哪些行业未来发展看好？\n\n随着近年来医疗技术的迅速发展，加上受到疫情的影响，__医疗保健行业__的技术岗位薪资表现出众。__娱乐、教育、传媒、线上购物__等薪资也十分可观。\n\n![software engineer salary](//images.ctfassets.net/04k2xg9gplcj/7HzNwYr6FxYPYjZv3UIjyg/613823dfc3d326925bd316051621f0ff/______2020-10-28_______3.16.50.png)\n\n### 2. 哪些职能目前薪资表现最佳？\n\n![software engineer salary](//images.ctfassets.net/04k2xg9gplcj/gjCDVRHoIWR9BZtm6peQF/5a4297bb5c3f96fa880a88d458a842eb/______2020-10-28_______3.18.21.png)\n\n如果你觉得平均薪资的数字看起来不够壮观，不防看看以旧金山湾区为例的不同岗位薪资成长比例。即使受到疫情的影响，__2020年各岗位的薪资仍有上涨，科技行业可是扎扎实实做了一把美国经济的“扛把子”__。\n\n![software engineer salary](//images.ctfassets.net/04k2xg9gplcj/3YaeVsCi6gkaE2CweurfDh/b3a5e99ebf0eea71d39f5fc98ae8cd24/______2020-10-28_______3.19.54.png)\n\n### 3. 哪些城市未来发展最佳？\n\n2020带来的另一个新变化，便是很多__北美科技公司宣布接受长期甚至永久的远程工作__，据调查显示，近30%的人表示如果长期居家工作，可能会考虑搬到其他城市：\n\n![HIRED 2020 State of Salaries Report](//images.ctfassets.net/04k2xg9gplcj/2azlYa3DpMrkB2w9Duzztn/68c6edbe6fa7c5b8b2754eef33982e0a/______2020-10-28_______4.24.23.png)\n\n“逃离湾区”的口号之于码农，和“不瘦十斤不换头像”的口号之于吃货一样，长期霸占着愿望清单，实现起来又颇为遥远。\n\n下面是2019年“最适合码农生活的城市榜单”，根据房租和生活花销进行排名，来看看有没有你心仪的那一个？\n\n![Best Cities for Software Engineers: A Data-Backed Analysis](//images.ctfassets.net/04k2xg9gplcj/2isVqqrNNU3ZRxbxNDI1Zc/f78feae1cee0a619ddb57f040208eccd/ca1ba92d40fde2c728611f34338d9cdf.jpg)\n\n### 4. 哪些编程语言最热门？\n\n在全球2019年科技岗位面试中使用到的编程语言：Go和Scala目前成长较为迅速，传统的编程语言仍占据着面试的半边天。\n\n![HIRED State of Software Engineers 2020](//images.ctfassets.net/04k2xg9gplcj/7kvKbRUjKuHqSpANWXfIxP/1b038f565225e37018ac359ffffa5877/______2020-10-28_______4.28.16.png)\n\n## 中国程序员薪资一览\n\n近年来中国互联网行业成长迅速，不管是用人需求还是薪资都逐年上涨。\n\n据__2020互联网行业人才发展洞察报告__显示，互联网行业整体薪资水平优于传统行业，__月薪在15k～20K每月的人才数量占比最高__。\n\n![2020互联网行业人才发展洞察报告](//images.ctfassets.net/04k2xg9gplcj/4xRHC8VQO9Cgs1hCVHzLCI/c290b0972561f2cdadbcac6fb55b805a/______2020-10-28_______4.29.39.png)\n\n### 1. 每个城市程序员薪资收入如何？\n\nCSDN最新的榜单总结了近期中国各大城市程序员的薪资排名，北京、上海、深圳、杭州以及广州占据了榜单前五。\n\n![software engineer salary](//images.ctfassets.net/04k2xg9gplcj/1flxyzgi4spucxkEqpN4EZ/8e166fb22362b4d0b94b0d0e75a0e05d/543bb3582e3fe63632555d69c2236a09.jpg)\n\n### 2. 哪些行业科技岗位薪资较高？\n\n__2019-2020年中国开发者调查报告__显示了互联网行业的高薪资占比，金融、通讯、交通、互联网等行业的科技岗位表现优异。\n\n![2019-2020年中国开发者调查报告](//images.ctfassets.net/04k2xg9gplcj/5uAru8cxgoVnFxI7MzUvG0/0c011343b04e7d56d633aab6eec8c657/______2020-10-28_______4.42.19.png)\n\n### 3. 程序员每周学习时间如何？\n\n同时，该报告还指出，__98%的开发者每周固定学习，其中31%的人接受了软件开发方面的在职培训，21%的人参与过编程或软件开发的线下课程__。\n\n![2019-2020年中国开发者调查报告](//images.ctfassets.net/04k2xg9gplcj/5QDV8YuRk3eJnNozfYUt02/b0a4c46f74819332d863fcf8cda17e7f/______2020-10-28_______4.46.20.png)\n\n### 4. 如何提升学习的效果？\n\n学习最重要的便是高效、高质，好的课程不仅仅在于内容充实，课程密度高，更在于用来学习的时间每一分钟都用在刀刃上。\n\n学习的内容皆是准确且实用的，不仅能够解决实际应用问题，攻克面试与工作当中遇到的困难，更能够跟上互联网行业发展的前沿，学习最新的技术，掌握当下最热门的技术。\n\n想成功进入科技公司？\n想知道零基础如何转码？\n想知道中美面试都有哪些秘诀？\n\n来Offer[【软件工程师旗舰核心课程】](https://www-staging.laioffer.com/zh/course/software-development/)11月5日，免费试听\n点击了解课程学详情：https://www.laioffer.com/zh/course/software-development/\n"}}},{"node":{"title":"LinkedIn发布2020最佳初创公司榜单! 趁它们上市前赶快加入!","path":"/en/news/2020-10-22-linkedin-top-startups-2020/","node_locale":"en-US","id":"51ec9795-58f6-52a3-b9eb-68dacacea08e","contentful_id":"6nCIYe7gpVnG3nhYBXnm1S","date":"2020-10-22T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Linkedin","Startup","Doordash","Robinhood","Databricks"],"description":{"description":"每年Linkedin都会有一份年度《Top50 最佳新兴公司》名单。LinkedIn的这份公司排名在业界十分具有代表性，往年的名单里有22%的公司已经成功上市或被巨头企业收购！那么今年，又有哪些初创公司在疫情期脱颖而出，成功上榜呢？"},"thumbnail":{"id":"f63ec206-a2ac-5444-a734-a44923e26846","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/6sFD8eIHn4KFSCT5z3iw12/d6bef196c972298589c04fa02e41f17d/linkedin-top-startups-2020.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/6sFD8eIHn4KFSCT5z3iw12/d6bef196c972298589c04fa02e41f17d/linkedin-top-startups-2020.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Linkedin, Startup, Doordash, Robinhood, Databricks","authorProfile":null,"body":{"id":"21d7dd5d-1e18-50aa-a37e-79b6ea8382ce","body":"LinkedIn又发布最佳初创公司榜单啦！\n\n每年Linkedin都会有一份年度__《Top50 最佳新兴公司》__名单。这份榜单评判标准包括7.06亿名领英会员的行为追踪结果和以下四大评比因素：\n\n- 员工增长量\n- 求职者感兴趣度\n- 公司与员工互动成都\n- 公司对人才的吸引力\n\nLinkedIn的这份公司排名在业界__十分具有代表性__，往年的名单里有__22%的公司已经成功上市或被巨头企业收购__！比如，__2019年排名第一的Snowflake公司__在今年就成为了有史以来最大的软件IPO公司。很多Snowflak员工纷纷化身百万富翁，引来朋友圈一大波柠檬精现身...\n\n![linkedin 2019 top startups](//images.ctfassets.net/04k2xg9gplcj/27SLHsMibTuDTT23WRDfl6/fcf2cbbaa3eafa5da4ccc609e9893326/______2020-10-22_______4.42.48.png)\n\n2020年虽然是动荡的一年，但许多初创公司依旧找到了应对方法，在疫情期脱颖而出。那就让我们来看看今年被评选为全美Top50的新兴公司都有哪些，__许多公司说不定都会在近期上市__：\n\n![linkedin 2020 top startups](//images.ctfassets.net/04k2xg9gplcj/1VeIW482LzgehAX3Bv18N7/83e25bf8f39ad9b89bf0a6dbf67da76e/7067f6c2017c610ca5422e29a82cc299.jpg)\n![linkedin 2020 top startups](//images.ctfassets.net/04k2xg9gplcj/38GR60SXmAA40rFY2f9i1q/3bfaefc7f5e978a46ff93a060668fc91/22e29a82cc299.jpg)\n\n从榜单中我们可以看出，在这Top50的企业中，有__41家——即超过80%的公司__都是以__科技、人工智能、大数据或云服务__为主导的公司！\n\n## 1. Better.com\n\n比如，排名第一的Better.com是一家__曾入围《福布斯金融科技公司榜前50》__的Fintech公司。\n\n在疫情影响下，房产领域被美联储推崇的低利率炒热，大量的房屋新贷款等业务量逐渐增大，作为__数字金融机构__的Better.com开始__以惊人的速度扩张__。\n\n目前Better.com市值约为40亿美元，是今年疫情影响下Fintech领域的赢家。自三月份以来，Better.com已有1500多名新员工入职，他们还计划在未来12个月内再招募7000名新员工，尤其是数据分析师与量化科学家。\n\n![linkedin top startups 2020](//images.ctfassets.net/04k2xg9gplcj/3SrnQD1QBwvvZNaRbrEgOg/c0b5f046a588619c255bcadce2e51dd7/______2020-10-23_______4.04.10.png)\n\n## 2. Doordash\n\n排名第二的DoorDash想必大家都不陌生，疫情期间或多或少都在这个平台上点过外卖。疫情的隔离促使外卖交易需求猛增，DoorDash还扩展了其他的送货服务，例如药房送货和超市送货。\n\nDoorDash之所以在众多外卖公司中胜出，主要得力于他的物流引擎核心。DoorDash__利用人工智能和机器学习对决策空间进行了智能建模__，所以可以在短短几秒内分配最佳的路径和送货方案。\n\n![linkedin top startups 2020](//images.ctfassets.net/04k2xg9gplcj/2oRF1rKTavYe5Vn7L3BppI/ef225ce42738ac785d27dd2964317437/______2020-10-23_______4.24.08.png)\n\nDoorDash在过去两年内已经实现了__2次雇员人数的翻倍__，许多投资方都看好DoorDash公司，期望它可以在__近期上市__。\n\n## 3. Robinhood\n\n排名第三的Robinhood是一家美股券商平台，因为它的__零手续费原则__吸引了大量的用户，成为美国历史上__增长最快的数字金融公司__。\n\n在疫情首次重创美国股票时，3次熔断的大消息刺激了大量年轻人开始了人生中的第一次投资，而多数新投资者都愿意选择零手续费的Robinhood平台。如今Robinhood__市值估计为112亿美元__，有望近几年上市。\n\n![linkedin top startups 2020](//images.ctfassets.net/04k2xg9gplcj/3xs5mIaY9MljRlwHQClnkS/b18c840a12c62b691d91e4dc8216c914/______2020-10-23_______4.40.26.png)\n\n---\n\n目前这些领英排名的50家公司还有__2500个空缺职位__！而仔细一看，可以发现大部分公司都在__招募数据岗人才__！毕竟数字化转型成就了这些企业今年可观的业绩。\n\n![data science job opportunity](//images.ctfassets.net/04k2xg9gplcj/7fvY60AgQFZXz3DgNR9bvw/9166620187a3fc57e0aac031a4c3acf8/______2020-10-23_______4.42.38.png)\n\n另外，在2020年疫情流行期间，AI与数据领域还被评为“最有潜力的科技工作”！据Deloitte报告显示，有53%的企业在过去12个月里至少在在AI领域投资了2000万美元！\n\n![top companies investing in ai](//images.ctfassets.net/04k2xg9gplcj/718JINhtjvrtHazRWMqERp/e617a09d3d538c76df3a16fd788e17d5/______2020-10-23_______4.43.43.png)\n\n以Amazon为例，它们在人工智能领域上投资了3亿多美金！这些投资包括AWS、智能家居的研发等。微软和苹果每年也投资超过1亿美金去大力发展人工智能与数据科学技术。谷歌、Facebook、英伟达等科技巨头也不甘示弱，每年都花费超过2000万美元发展AI领域。\n\n而这些注重AI和数据科学领域发展的大厂，目前也都在招募数据类人才。看来，人工智能与数据科学已成为不可撼动的发展趋势。"}}},{"node":{"title":"【你曾经挂在哪道题？】一线科技公司程序员求职，面试常挂题型与解决方案","path":"/en/news/2020-10-15-software-engineer-technical-interview/","node_locale":"en-US","id":"e997b210-0b60-508e-84dc-5c1cf40d9ad3","contentful_id":"52c50ol5dDbJ3LxG1qPDGD","date":"2020-10-15T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Google","Facebook","software engineer","interview","algorithm","coding","system design"],"description":{"description":"约有80%的面试者在拿到心仪的Offer前，曾在别的公司面试中挂过至少1次。面挂不尴尬，尴尬的是面挂以后不注意总结和梳理，默许自己的知识漏洞一直存在。我们采访了一些现已入职一线公司的同学，采集到了许多他们的备战心得。这些他们曾经踩过的坑，希望能对你有所帮助和借鉴。"},"thumbnail":{"id":"add89967-a906-581e-b076-0b9a0d5b6e30","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/29tlbJXuxySSAOY6SDHjj1/5a9ff3920b30855eb835b3924426301c/software-engineer-interview.jpg?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":"Google, Facebook, software engineer, interview, algorithm, coding, system design","authorProfile":null,"body":{"id":"81da86b2-a39b-5874-bf82-140eb60cc100","body":"约有80%的面试者在拿到心仪的Offer前，曾在别的公司面试中挂过至少1次。\n\n面挂不尴尬，尴尬的是面挂以后不注意总结和梳理，默许自己的知识漏洞一直存在。我们采访了一些现已入职一线公司的来Offer同学，采集到了许多他们的备战心得。这些他们曾经踩过的坑，希望能对你有所帮助和借鉴。\n\n## 类型1：看似简单经典，却被细节和follow up考倒\n\n> 一次面试刚好遇到了一道自己做过的原题，答案很快就写出来了。谁想，面试官步步紧逼，详细追问每个细节，扔出各种follow up……\n> \n\n#### __常挂题举例__\n\n__Lowest Common Ancestor__\nLaiCode题号：126,127,128,129,368\n\n__面挂原因：__对Recursion的理解不够清晰到位，对于变种题不会举一反三。解释不清逻辑，也没法在大数据的环境下解决问题。\n\n![Lowest Common Ancestor][1]\n*查看原题，登陆[LaiCode][2]*\n\n__2Sum, 3Sum, 4Sum__\nLaiCode题号：180,186,188\n\n__面挂原因：__只知道形式，不知道内涵和原理。碰到灵活的follow up，稍微修改条件就答不出来了，更无法回答在实际环境下large scale的实际操作问题（例如：1TB data如何进行2Sum？）。\n\n![2Sum, 3Sum, 4Sum](//images.ctfassets.net/04k2xg9gplcj/6Xs7b5h9JAylvgEiLW02Iq/3708142ac2d117b1b4f5b47e5b9e636f/______2020-10-15_______2.14.21.png)\n*查看原题，登陆[LaiCode](https://www.laicode.io/ \"LaiCode\")*\n\n__Top K问题__ \nLaiCode题号：436\n\n__面挂原因：__follow up很多，变种也很多，可以扩展到multithread environment，甚至large scale system design，也可以考察batch或者stream processing基本原理....总之，从new grad 到资深都能考，面试官对这道题目的期待值也比较高。\n\n![Top K](//images.ctfassets.net/04k2xg9gplcj/18IWg20cvv13T4iRBKzfXL/0376ddb93e0ec84ec1017f9ca057a666/______2020-10-15_______2.25.48.png)\n*查看原题，登陆[LaiCode](https://www.laicode.io/ \"LaiCode\")*\n\n#### __解决方案__\n\n碰到这种题却挂了，最大的问题往往是__轻敌，基本功不扎实__。因此，在面试中遇到做过的题，或者看似简单的题目，更应该警惕。\n\n在做之前认真审题，列清楚assumptions和corner case，在做的时候，对每个细节的意义都要搞清楚，然后准备好应对面试官的follow up。\n\n在__来Offer旗舰课程__的前3个月，老师会__系统地串讲算法，从简单、经典的题目开始，由浅入深，将每一个算法讲透__，让同学们能够自如应对面试官的追问。(*[点击查看课程介绍](https://www.laioffer.com/zh/course/software-development/ \"软件工程师旗舰核心课程\")*)\n\n## 类型2：运气不好碰到“难”题，一下就慌了\n\n> 我觉得面试官不喜欢我，因为他上来就面了一道超级难的图论题。我一下子脑袋空白，挂得毫不意外。回到家我认真一想，原来这道题只是穿了几层马甲。\n> \n\n#### __常挂题举例__\n\n__Word Search II __\nLaiCode题号：431\n\n__面挂原因：__这是比较复杂的搜索问题，对于优化、复杂度分析、代码准确度和细节要求很高。\n\n![Word Search II ](//images.ctfassets.net/04k2xg9gplcj/7FlFojJBpwEtEMH4yXSbW6/7209361708e8ab1dca48120d06fc4210/______2020-10-15_______3.08.20.png)\n*查看原题，登陆[LaiCode](https://www.laicode.io/ \"LaiCode\")*\n\n__Largest Set Of Points With Positive Slope__\nLaiCode题号：217\n\n__面挂原因：__缺乏举一反三、看到问题本质的能力。对DP解决问题的思路和熟练程度不够。\n\n![Largest Set Of Points With Positive Slope](//images.ctfassets.net/04k2xg9gplcj/6s63ZEtU4l7GQR45tBCa7Y/6d6b2de6220ab7e149cf9871c7006a33/______2020-10-15_______3.20.44.png)\n*查看原题，登陆[LaiCode](https://www.laicode.io/ \"LaiCode\")*\n\n#### __解决方案__\n\n牢记难题也是从简单题演变过来的。那些算法真的很偏僻、很复杂的题目其实并不常考。__更多难题是难在需要耦合很多逻辑，或者多套了几层马甲__。\n\n碰到了这些题目，必须沉着冷静，从题目本身出发，一步步分析，充分和面试官讨论。可以__先给出能work的解法，再想方设法优化__。\n\n在旗舰课程中，老师将解析面试常考的难题，让同学们具备面试Google等公司的实力。(*[点击查看课程介绍](https://www.laioffer.com/zh/course/software-development/ \"软件工程师旗舰核心课程\")*)\n\n## __类型3：各种design题，只要没做过，遇到就挂！__\n\n> 去面试某公司，认真准备了该公司的常考Design题目，结果面试官面了一道新题，彻底抓瞎。\n> \n\n#### __常挂题举例__\n\n__Design an in-memory file system(OOD)__\n\n__面挂原因：__没有掌握OOD的原理和运用。\n\n![in-memory file system](//images.ctfassets.net/04k2xg9gplcj/5qGe0cNZb614nvkRYOpHt6/0afd0addf68712681f7eb01c277ef179/______2020-10-15_______3.31.09.png)\n\n__Design Facebook Feed System__\n\n__面挂原因：__误以为new grad不会考design的问题。但实际上很多公司都是要考察的。\n\n#### __解决方案__\n\nDesign题目难在考察综合实力，而且往往没有唯一正确的答案。这就考察你和面试官沟通交流的能力，和真正解决实际问题的能力。\n\n在做design题目的时候，首要的就是明确需求；其次，如何推进讨论也很重要。\n\n来Offer的旗舰课程安排了大量的OOD和System Design的内容，由工业界顶尖的系统架构师授课，不论是转CS还是有工作经验的同学，都能获得极大的提升。(*[点击查看课程介绍](https://www.laioffer.com/zh/course/software-development/ \"软件工程师旗舰核心课程\")*)\n\n## __类型4：对转CS同学最不友好的可能是CS基础知识__\n\n> 转CS，面试准备基本靠刷题，结果面试官一上来不考算法，反而考起计算机体系、计算机网络了，我看着面试官，一句话都答不出来。\n> \n\n#### __常挂题举例__\n\n__Describe what happens after you type in the url in your browser bar and hit the enter button, before you get the web page content displayed in the browser? __\n\n__面挂原因：__没建立好基础的知识体系，只局限在刷题上。\n\n#### __解决方案__\n\n基础CS知识体系必须认真准备。不仅面试中很可能会考到，在工作中更是不可或缺。同学们需要__具备操作系统，网络，数据库，前端，后端相关知识，了解整体的workflow__。\n\n旗舰课程提供__免费的基础加强班__，旨在帮助同学们__建立完整的CS科班的知识体系__。这方面基础较弱，尤其是转专业的同学，建议可以参加课程，打下solid的基础。(*[点击查看课程介绍](https://www.laioffer.com/zh/course/software-development/ \"软件工程师旗舰核心课程\")*)\n\n## __类型5：项目描述答不好，面试官：“这真是你做的？”__\n\n> 血的教训，对自己做过的项目一定要了如指掌，要经得起面试官问你细节...不然面试官很容易质疑项目的真实性，电面就挂....\n> \n\n#### __常挂题举例__\n\n__What is the most challenging project?__\n\n__面挂原因：__没准备好简历上的project，没法回答出有深度的、让面试官认可的内容，表现不出自己的技术能力和leadership。\n\n#### __解决方案__\n\n很多同学对于自己做的项目没有进行深入的探讨。建议大家，__只要是写在简历上的项目、技术，就一定要了解透彻__。如果你对某个技术一知半解，甚至只是为了堆砌简历，那还不如不要放在简历上。否则很容易被面试官问露馅。\n\n旗舰课程的同学还可以享受 1 v 1简历修改，面试官将帮助你个性化的提升简历，告诉你如何准备项目描述。\n\n如果简历薄弱没有项目，也可以参加来Offer全栈开发项目实践课程。(*[点击查看课程介绍](https://www.laioffer.com/zh/course/full-stack-development/ \"全栈开发项目实践课程\")*)\n\n## __类型6：Behavior Question轻敌，HR：我无法相信他是Team Player__\n\n> 我以前完全不准备behavior question。直到有一次面试，所有technical的面试官都对我展露出了微笑，我却被HR轰出来了..... HR给我留下的评语是：too arrogant, not a team player\n> \n\n#### __常挂题举例__\n\n__Is there a time you took on something significantly beyond your area of responsibility. What was it? Why it is important? What did you deliver?__\n\n__面挂原因：__没准备基本的leadership principle，没有准备behavior问题，没有ownership的概念\n\n#### __解决方案__\n\nBehavior Questions是拿到offer必经的一道关口。像Amazon、Airbnb等公司对BQ类问题看得非常重。\n\n对于这类问题，除了要提前准备好几个例子，多了解不同公司的文化，还要__遵循“STAR”的回答原则__。先铺垫Situation，介绍自己的Task，着重讲Action，最后还要提一下Result。\n\n除了技术方面的提升，旗舰课程也有软实力提升的课程和讲座。由一线公司PM、HR讲解如何更好地与面试官沟通，如何巧妙回答BQ问题。(*[点击查看课程介绍](https://www.laioffer.com/zh/course/software-development/ \"软件工程师旗舰核心课程\")*)\n\n[1]: //images.ctfassets.net/04k2xg9gplcj/6YqE9EvAowNxnvbkX6Jts8/a5b167da3728ca16c39961f49fb1dd28/______2020-10-15_______2.02.37.png\n[2]: https://www.laicode.io/ \"LaiCode\""}}},{"node":{"title":"超详细攻略:参加招聘会要做好哪些准备？","path":"/en/news/2017-10-05-how-to-prepare-for-interviews/","node_locale":"en-US","id":"f7809d38-6f7d-590d-999f-5de162f50755","contentful_id":"49yVKKusrCoUQag2AmWImo","date":"2017-10-05T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"不知道你有没有这种感觉：在Career Fair上，当你终于排完长长的队伍，换来的却只有跟recruiter尬聊的3分钟时间。结束时，你收获最多的，只有那句“please apply online”和不走心的微笑。每次你都是抱着希望和热血而去，却带着失望和迷茫而回。看着身边的美国同学甚至阿三哥们都能在Career Fair结束时斩获若干个面试机会，你不禁扪心自问：我到底是哪里出了问题？"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"db63331f-5790-5b2a-8d5b-cfbc1f671ac9","body":"不知道你有没有这种感觉：在Career Fair上，当你终于排完长长的队伍，换来的却只有跟recruiter尬聊的3分钟时间。结束时，你收获最多的，只有那句“please apply online”和不走心的微笑。每次你都是抱着希望和热血而去，却带着失望和迷茫而回。看着身边的美国同学甚至阿三哥们都能在Career Fair结束时斩获若干个面试机会，你不禁扪心自问：我到底是哪里出了问题？\n\n今天，来Offer就给你支几招，教你如何在Career Fair上过关斩将，拿到面试机会！\n\n首先，在去招聘会之前，你需要准备好一个**Checklist：**\n\n- 改好你的简历\n- 练习1分钟自我介绍\n- 整理出一份兴趣公司+职位名单\n- 对选中的公司做Research\n\n准备好以上这些，你们就可以放心、大胆地去排队尬聊了！\n\n**第0步，找到目标Recruiter**\n\n排队的时候千万不要只是傻傻地站着，除了在心里默默练习自我介绍以外，还可以观察一下Recruiter团队的状况。通常，来的Recruiter都会佩戴自己的工作牌，上面会写有他们的职位。选择对你“最有利、最懂你”的聊天对象可以助你一臂之力！比较好的顺序是：\n\n- Alumni 兼 Engineer\n- Engineer\n- Alumni\n- HR\n\n**第1步，不要小看嘘寒问暖的作用**\n\n当终于排到你的时候，不要一上来就把简历塞到人家手里，要有一句最起码的问候和寒暄，给自己加点有“人情味儿”的戏。你排了一天的队很累，但换位思考，人家Recruiter站了一天的摊位也很累。这个时候，你的一句“It must be a long day for you as well” 就能给你的印象大大加分。\n\n接下来，就是最基本的那一套：打招呼，微笑，说名字，握手，“Nice to Meet You”。这里要注意的是，嘘寒问暖并不是要你去套近乎。千万不要拿Recruiter的肤色种族、宗教隐私等和私人生活有关的问题来当你破冰聊天的砝码，这些都是专业场合上的大禁忌！\n\n**第2步，自我介绍的基本套路**\n\n一两句嘘寒问暖之后，就要赶紧进入自我介绍环节。首先，你要直接、清楚、大方地告诉你的Recruiter:\n\n- 你的专业、年级、毕业时间\n- 你要找的具体职位\n- 你对他们公司感兴趣的地方\n- 你能为他们公司带来什么\n\n高效有条理地说出这些基本信息，不但是为Recruiter省力气，也是在为你自己节省时间。这样一来，Recruiter就能根据你给出的基本状况，快速地在脑海里对你进行分类，并为你推荐他认为适合你的下一步。\n\n在谈及对公司的兴趣时，不要说一些假大空的话，比如一上来就背诵维基百科上的公司介绍、公司年代史、财经报告等等，说这些只会让Recruiter身心疲惫。你要从具体细节出发，这就是为什么需要你提前做好功课：八一八公司的官网上的宣传和最近的新闻。\n\n比如说，你可以说据你了解，他们公司的工程师虽经常出差，但因此可以做很多不同的project，你也想广泛地接触到很多实用的技术等等。再比如说，你从学长学姐那了解到公司的文化是怎么样的，你非常喜欢公司的哪一点等等。\n\n当谈及“你能为公司带来的价值”时，你需要在最短的时间，将你最大亮点展示出来。先不要着急将每项经历展开说，简短地跟Recruiter介绍一下你所具备的条件：有过几份什么职位的实习？做过几个什么方面的project？提一些他们想要的关键skill等等。\n\n**第3步，接招Recruiter的问题**\n\n如果你能顺利到达这一步，恭喜你，说明你的Recruiter对你显露出了初步的兴趣。\n\n比较常见的问法是：Tell me a little bit more about yourself.\n\n这个时候，你就要从自己简历上最吸引人的经验依次说起。你可以说你在哪家类似的公司、岗位实习过；或者展开说你做过的一个很厉害的project；又或者你的leadership skill等等。有时候，Recruiter会对你简历上的某一个具体的经历进行提问，你要做到对你简历上的每一点都滚瓜烂熟，并且在介绍中向Ta展示出你的各种hard or soft skill和取得的成果。\n\n如果问你的人是Engineer，你就可以多跟Ta聊技术；如果问你的人是HR，你就可以多强调一下你工作成果的重要性。\n\n**第4步，问Recruiter问题**\n\n谈话的尾声，每个人都可以向Recruiter提问。比较好的问题分为2类：**具体工作状况和最近的新闻。**比如说，你可以问，“在贵公司做软件工程师，是一种怎样的体验？” 这类问题会让Recruiter觉得，你是在认真想申请这个职位的。\n\n**其他一些值得问的问题有：**\n\n- What are common career paths within your organization?\n- What kind of training programs do you have for new hires?\n- What qualities and/or characteristics do successful candidates possess?\n- What is the organizational culture like?\n- What suggestions would you have for a student in their ____ year in school? How can I make myself be prepared for the world of work?\n- Are there courses that I should take that will help me in your industry?\n\n**第5步，积极收集名片/邮箱/电话**\n\n谈话结束后，要好好感谢你的Recruiter，并一定要问Ta要到名片！若是名片发完的情况下，则一定要问Ta要邮箱或电话。同时，你要在自己的小本本上记住对方的名字和你们谈话时的亮点，为接下来写Thank you letter时自己的“二次曝光”做准备。\n\n**第6步，Follow Up Email**\n\n这是人人都知道的“潜规则”，但是却没几个人能真正做到。无论Recruiter有没有功夫回你，写感谢信都能为自己增加拿到面试的机率。如果招聘会上，Recruiter在你的简历上做了标记或口头承诺会给你安排面试，你就一定要大胆、主动地联系对方，并记得在邮件里再次介绍一下自己和阐述要申请的职位，并附上自己的简历。\n\n**写在最后l**\n\n最后一点，也是最重要的一点是，在与Recruiter交谈过程中，一定要表现得自信大方，显露出自己专业成熟的一面。即使内心在颤抖，也要当个好演员。\n\n对于初来乍到的职场小白，Career Fair并不是那么容易攻破的。只有做足足准备、敢于尝试与碰壁、并坚持不懈地努力，才能过关斩将，拿面试拿到手软。最后，祝各位求职顺利!\n\n![qr-laioffer](//images.contentful.com/04k2xg9gplcj/cZMDJ3hbtC2mSsqIQMw42/8446fb463232289d08d82aab0a9fc896/qr-laioffer.jpg)\n\n更多求职干货请关注来Offer微信公众号查看\n"}}},{"node":{"title":"谷歌面试官支招：面挂Google后，进入冷冻期了怎么办？","path":"/en/news/2020-09-17-google-cooling-off-period/","node_locale":"en-US","id":"5b7a25ae-d34c-5d8b-be4e-cbb7025e547a","contentful_id":"5gGj8Q9uBlBjP3c5q6lQfq","date":"2020-09-17T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Google","Facebook","cooling-off period","software engineer"],"description":{"description":"对于广大科技行业的求职者来说，挂了好不容易争取到的、熬夜了几个通宵准备的面试，可能并不是最惨的；最惨的是，挂了面试之后，还要经历【冷冻期】。那么，什么是冷冻期？被冷冻了怎么办？有可能提前解冻吗？前谷歌面试官闫老师来为你答疑解惑..."},"thumbnail":{"id":"7d2bd203-17ff-5c52-bbd7-274d1b475f74","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/4FPtZOyJ5yU1MIeJrci4Px/7ab8cdedb17ef1893e409576e5ea4b3d/google-cooling-off-period.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/4FPtZOyJ5yU1MIeJrci4Px/7ab8cdedb17ef1893e409576e5ea4b3d/google-cooling-off-period.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Google, Facebook, cooling-off period, software engineer","authorProfile":null,"body":{"id":"142ac622-23d6-50d9-87e1-301935de29bc","body":"对于广大科技行业的求职者来说，挂了好不容易争取到的、熬夜了几个通宵准备的面试，可能并不是最惨的；最惨的是，挂了面试之后，还要经历【冷冻期】。那么，什么是冷冻期？被冷冻了怎么办？有可能提前解冻吗？\n\n对于这些问题，我们特地采访了前Google资深工程师、面试官闫老师，并整理了以下内容，希望能解决大家对于冷冻期的疑惑！\n\n#### Q1 什么是冷冻期？\n\n__求职者在申请科技公司职位时，如果不幸挂了面试，一般需要等待半年至1年的时间，才能再次申请这个职位。__这段等待的时间就是我们所说的“冷冻期”。\n\n在冷冻期内，不论你怎么投简历，都不会有人看到的。公司之所以设定冷冻期，是为了避免求职者在短时间内重复申请，同时，他们认为求职者在挂掉一次面试之后需要一定的时间来提升自己。\n\n#### Q2 简历挂了有冷冻期吗？\n\n冷冻期只针对求职者进入面试流程之后，在任意一轮面试（包括电面和onsite）被拒的情况才会出现，因此简历挂了并不会被纳入冷冻期。\n\n但是，网上还是有小伙伴提出疑问：Facebook简历挂了，我被冷冻了3个月。这是为什么呢？\n\n这主要是因为，如果公司/HR看到一份已经fail的简历，在短时间内重复投递相同的职位，大部分情况下都不会给予回复。\n\n#### Q3 所有科技公司都有冷冻期吗？\n\n一般像我们所熟知的Google、Facebook等FLAG级别的科技公司，以及Uber、Airbnb等startup都有冷冻期。不过据网上的消息说，ebay是没有冷冻期的。\n\n#### Q4 冷冻期一般多久？\n\n科技公司冷冻期一般都是__半年至1年__左右，但是这没有严格规定，具体情况依据不同公司而定。冷冻期长短根据__公司招人情况，和求职者背景、以及面试的情况__，也有调整的余地。\n\n#### Q5 谷歌面试连挂3次就会被永远“冰封”？\n\n闫老师表示，自己在Google工作的这么多年内，从来没有听说这个说法。而在他担任面试官的时候，甚至还遇到来面过7、8次的求职者。\n\n但是，__我们并不鼓励求职者每年都抱着“碰运气”或者“试试水”的态度去面试__。\n\n因为，__你在Google的每一次面试情况都会被记录在案__。而在每一次面试之前，面试官都会翻看你之前面试的feedback。对于那些已经面试了很多次的求职者，印象分很可能会被大打折扣。\n\n#### Q6 实习申请进冷冻期，会影响全职申请吗？\n\n一般情况下，这是__不影响__的，大部分公司对于实习和全职员工的招聘是完全不同的系统。网上也有不少求职者表示，有遇到过暑期实习被拒，经过3、4个月的提升之后，拿到秋招全职offer的情况。\n\n#### Q7 冷冻期间可不可以申请title不同的职位\n\n这个问题非常case by case。\n\n- 有__一冻全冻__的公司：即如果求职者面试某个职位不幸挂了，那么在冷冻期内申请这个公司的任何其他职位都没有用。\n\n- 还有__只冻一部分__的公司。如果你申请某个大类的职位被拒了，不会影响你申请另一大类的职位。\n\n拿Google举例子，如果你申请SDE被拒了，那么你申请同类的SRE一般也会被系统自动“屏蔽”。但是如果你申请另一类如web solution engineer这样的职位，就没有影响。\n\n#### Q8 被“冻住”了，怎么办？\n\n对于不幸遭遇冷冻期的同学，我们有以下几点建议：\n\n首先，__在面试后和HR积极沟通__，确认冷冻期的时长、何时能再次投递、是否影响其他职位的投递等问题。\n\n其次，__你需要找到自己“挂”的问题所在__。到底是因为紧张导致答不上问题？还是因为准备不充分，实力不达标？\n\n- 如果是缺乏面试经验、紧张的问题，同学们可以通过大量的mock interview来解决。\n\n- 如果是基础不达标，单纯地不知道正确答案，那么同学们应该抓紧时间建立系统的知识体系，以提升核心实力。来Offer软件工程师旗舰课程，独家举一反三训练法，50%理论+50%动手，帮助你全面建立系统知识体系！[点击链接查看课程介绍](https://www.laioffer.com/zh/course/software-development/)\n\n- 如果是缺乏相关实习/项目经历，在面试时无话可说。那么你应该趁冷冻期静下心来做一些有深度的项目，为简历增添新的内容。来Offer全栈开发项目时间课程，4大实战项目+FLAG Camp训练营，帮你打造让面试官青睐的简历！[点击链接查看课程介绍](https://www.laioffer.com/zh/course/full-stack-development/)\n\n在做好以上的准备之后，你可以再次找hr沟通，看看是否有和自己match的职位的headcount；或是直接找到合适的内部员工内推。这都有可能帮助你__提早结束冷冻期__，再次拿到面试。\n\n随着川普政策的影响，各大科技公司在对国际学生，尤其是在New Grad（应届毕业生）的招聘和sponsor上，可谓是越来越严格与谨慎。"}}},{"node":{"title":"孙老师专题 | 无人驾驶的前10年与后10年","path":"/en/news/2017-08-23-rick-sun-autonomous-car/","node_locale":"en-US","id":"e00f8ba0-6f91-5cca-b765-d77b2fffdb85","contentful_id":"9E9mFrvzTUCMcCKSM2AAG25","date":"2017-08-23T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"本文特邀作者-----Rick Sun USC CS博士，自2003年至今主要从事人工智能中多个领域的科研工作，包括高效搜索算法，机器人无人驾驶系统动作和路径规划, 多机器人协同限制条件下资源分配，贝叶斯网络等。Rick Sun曾先后在国际人工智能领域的顶会IJCAI, AAMAS, ICAPS 和期刊发表论文二十余篇，其研究成果被加拿大宇航局应用于国际空间站机器人系统。他曾担任国际人工智能大会IJCAI，AAMAS等会议Program Committee，是早期从事无人车领域科研的少数中国人之一。2013年，Rick Sun在硅谷创立了高科技在线教育和职业培训平台——来offer，3年来已培养1200多位优秀华人工程师，遍布硅谷一二线公司。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"bcfa3b5f-5d7c-56b1-b27c-5687e38c53b2","body":"**本文特邀作者-----Rick Sun**\n\nUSC CS博士，自2003年至今主要从事人工智能中多个领域的科研工作，包括高效搜索算法，机器人无人驾驶系统动作和路径规划, 多机器人协同限制条件下资源分配，贝叶斯网络等。Rick Sun曾先后在国际人工智能领域的顶级会议IJCAI, AAMAS, ICAPS 和期刊发表论文二十余篇，其研究成果被加拿大宇航局应用于国际空间站机器人系统。他曾担任国际人工智能大会IJCAI，AAMAS等会议Program Committee，是最早从事无人车领域科研的少数中国人之一。2013年，Rick Sun在硅谷创立了高科技在线教育和职业培训平台——来offer，3年来已培养1200多位优秀华人工程师，遍布硅谷一二线公司。\n\n翻开2003年申请美国计算机博士的论述申请书，上边写着 **'My career goal is to become a respected researcher in Artificial Intelligence and, if given the opportunity, to become a university professor.' **至今，我从事人工智能领域的工作，尤其是无人车科研开发已经**14年**了。\n\n**’人工智能是什么? ‘**\n\n我的理解是，通过大量的数据的借鉴，学习和推理，使得机器系统具备某一个领域专家级的判断，决策和执行能力，甚至在将来的某一个时刻超过该领域最杰出的人类专家。 目前AlphaGo毫无疑问已经在围棋领域做到了这点。\n\n有人问，人工智能不就是下围棋么？和我日常生活有什么关系，我又不下围棋。这篇文章就是告诉大家，未来的10年，AI 人工智能，尤其是无人驾驶汽车将如何改变我们的生活。2007年，当乔布斯拿着第一代iPhone告诉世界'It will change the world' 的时候，很少人会相信他所说的。\n\n很多人想，不就是个手机么？\n\n但当十年后的2017年，移动端数据传输量已经首次超过台式电脑，达到51.3%的时候，人们才发现，过去的10年，智能手机，作为移动端计算设备，真正改变了全世界60亿人口的生活方式！移动端最大的贡献，是实现了跟随终端每个人类用户的数据采集。这才是人工智能过去10年以及未来50年得以急速发展的重要支撑源泉：\n\n每个人到过什么地方？\n\n做过哪些搜索、支付行为？\n\n用户习惯是什么？年收入是多少？\n\n以及你将来有可能要购买什么商品?\n\n……\n\n无不可以从采集到的用户数据推算出来。\n\n举个例子， Uber这个随意叫车的idea早在几十年前就有人想到过，但它之所以今天才诞生，是依附于智能手机的普及：每个地区，在每个时间段中有多少打车用户，需要分配多少辆汽车，用户的流动方向是什么，随着天气、人口密集度的突然变化，如何更好的调配汽车资源使得等待时间和用户体验更加优化......\n\n这一切的背后是手机对于数据采集、人工智能算法分析数据和调用资源分配算法计算得到的。而无人车，作为人工智能的又一突破性应用，将会是下一个10年、甚至50年改变人类社会的又一革命性的发展。\n\n无人车的发展分为3个阶段：\n\n**UGV 军方背景时代：2001 - 2007**\n\n2001年，因为战争中的大量伤亡，美国国防部出台法案：到2015年，美军1/3的地面作战车辆必须为无人驾驶。 (Section 220 of the FY2001 defense authorization act)。 自此，DARPA （美国的国防科工委）成为无人车辆科研的先驱。当时无人车的英文名称为Unmanned-Ground Vehicle (UGV) 一听就充满了军事的味道。\n\n2004年，为促进无人车发展，DARPA组织了第一届无人车拉力挑战赛Grand Challenge,  赛程穿越加州到内华达沙漠，全程150英里。参赛队伍包括斯坦福，卡内基梅隆大学等顶尖高校，然而，没有一个参赛队完成比赛。就连表现最好的卡内基梅隆队，也只是行驶了约7.3英里。\n\n2005年，仅仅1年之后，由我导师的导师Sebastian Thrun领军的斯坦福大学队Stanley就完成了拉力赛全部路程，并夺得第一名。卡内基梅隆大学屈居第二。\n\n2007年，第三届也是最后一届Urban Challenge, CMU无人车队Tartan终于夺得第一名。我的导师Sven Koenig和Maxim Likhachev共同研制的D* Lite 等路径搜索算法被应用在Tartan当中。\n\n至此，无人车辆已经初步具备在野外自动驾驶，穿越100英里的能力。\n\n**Driverless Car谷歌时代：**\n\n**2007 -  2015**\n\n2007年谷歌CEO Larry Page（拉力. 佩奇）回斯坦福找到我导师的导师Sebastian，邀请他加入谷歌，并领导无人车项目。在加州Menlo Park的一次AI论坛上，Sebastian讲述了具体的经过：\n\nLarry问： 我们能实现无人车在加州的城市街道上路么？\n\nSebastian回答：现在还不可能。\n\nLarry 再次问到：技术上，有什么困难么？\n\nSebastian 想了想说： 没有。\n\nLarry说： 为什么不尝试一下？加入Google吧。\n\n自此，Sebastian加入Google ，并担任了Google副总裁，创建了Google X （谷歌研究院），亲自领军无人车项目。2015年，来自CMU Urban Challenge车队的核心成员等科研第一线人员加入Google, 如Chris Urmson，大大充实了谷歌无人车的力量。\n\n至2015年，Google无人车已经在加州城市街道测试中，实现30万英里无重大事故，完全超越保险公司所定义的最安全的驾驶员人群的驾驶平均纪录。\n\n**Self-Driving Car时代：2016－未来**\n\n2016年后，无人车的名称从Driverless Car更新为Self-Driving Car。新名称已经不再是无人驾驶车辆这样的科研名称，而是着重强调了自动驾驶，完全的商业名称。\n\n自2016年，无人驾驶的科研从Google的一枝独秀，到大量顶尖科研人员从谷歌出走，成立自己的无人车公司：Chris Urmson作为前Google 无人车CTO ，出走创立了自己的无人车公司Aurora；\n\nTony Stentz, 卡内基梅隆大学杰出机器人及无人车教授，加入并领军Uber ATC。 同时，Tesla，百度，福特，奔驰，宝马等巨头，无不加紧投入，展开无人驾驶技术的科研和开发。无人车将在未来10年迎来更加快速的发展。\n\n而我导师的导师Sebastian Thrun更是努力倡导无人驾驶技术的推广，并在创立美国最大IT科技推广平台Udacity之后，和奔驰、宝马、Uber、滴滴等公司形成战略合作伙伴关系，推出了唯一正式的无人车工程师课程。\n\nRick Sun与Sebastian Thrun\n\n**未来无人车将会如何发展？**\n\n**10年内无人车将会如何改变世界？**\n\n**请听下回分解。**\n\n**本文首发于硅谷新青年**\n"}}},{"node":{"title":"程序的编译、链接和执行","path":"/en/news/2017-08-03-program-compile-execute/","node_locale":"en-US","id":"b42d319b-68ab-528d-8ad1-e6efa8b8f8f6","contentful_id":"9E9mFrvzTUCMcCKSM2AAG22","date":"2017-08-03T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"同学们总是抱怨每次见到一道面试题都很难把它转化为程序源代码。然而不幸的是，即使是程序源代码对于计算机来说也还是太高级了。要想让计算机执行一段程序，我们必须把它翻译成最底层的机器指令才行。这其中要经历很多步骤。幸运的是有很多现成的工具可以帮助我们完成这个过程。今天我们就以 C 语言为例给大家做个简单介绍。（Java 还要更复杂一些，涉及到字节码和虚拟机，今天就不讲了。）"},"thumbnail":{"id":"1412341a-ca5e-5a40-9dcd-68363a45e8b6","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/2eBUwQIAMoiQ0IAc0oWKeq/2c024ae1d53fc31976966e7a8ca367ed/033-technical-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"9c8c2fee-431f-5cca-8ac0-687a29543e67","body":"同学们总是抱怨每次见到一道面试题都很难把它转化为程序源代码。然而不幸的是，即使是程序源代码对于计算机来说也还是太高级了。要想让计算机执行一段程序，我们必须把它翻译成最底层的机器指令才行。这其中要经历很多步骤。幸运的是有很多现成的工具可以帮助我们完成这个过程。今天我们就以 C 语言为例给大家做个简单介绍。（Java 还要更复杂一些，涉及到字节码和虚拟机，今天就不讲了。）\n\n**预处理（Preprocessing）**————翻译一段 C 语言程序的第一步是预处理。这一步主要处理所有以'#'号开头的行。比如当我们遇到 `#include 'header.h'` 的时候，就直接把 `header.h` 文件里的所有内容插入到这儿。由此可见，一段 C 语言程序经过预处理之后还是一段 C 语言程序。\n\n**编译（Compilation）**————第二步是编译，也就是将一段 C 语言程序翻译为一段汇编语言程序。汇编语言比 C 语言要底层多了，基本上就是机器指令的文字版，每一行汇编语言对应着一条机器指令。往往 C 语言程序里的一行要被翻译成好几行汇编语言程序才行。不同的高级语言（如 C、Fortran、Pascal 等等）有不同的预处理器和编译器，但它们在经过编译之后都变成了同一种汇编语言，于是后面的步骤和工具大家都是通用的了。\n\n**汇编（Assembly）**————第三步是汇编，即把文字版的汇编语言程序真正翻译成由 0 和 1 组成的机器指令，并把它们打包输出成一个 relocatable object program （下文简称目标文件）。如果说汇编语言程序人类还勉强能看懂，经过这一步之后得到的目标文件就真的是一堆二进制乱码了。\n\n**链接（Linking）**————第四步是链接，用来把多个目标文件合并成一个可执行文件。比如说我们写了一个 hello world 程序，其中调用了 C 语言标准库里的 printf 函数来打印。我们的 hello world 的主函数和 printf 函数存放在两个不同的目标文件里，经过这一步之后它们就被合并到一起了。（这里讲的是静态链接。如果是动态链接的话，printf 在这一步暂时不合并进来，而是在下一步程序运行的时候才被加载。）\n\n**加载（Loading）**————上一步所生成的可执行文件终于可以被操作系统加载运行了。操作系统会将这个可执行文件中的代码和数据从磁盘复制到内存中，并跳转到该程序的第一条指令处（也叫做入口点，entry point）开始执行。\n\n最后用一张图给大家总结一下全过程：\n\n![033-technical-01](//images.contentful.com/04k2xg9gplcj/2eBUwQIAMoiQ0IAc0oWKeq/2c024ae1d53fc31976966e7a8ca367ed/033-technical-01.png)\n\n**汤老师**\n\n来offer王牌讲师之一。清华大学计算机系信息学竞赛保送生，美国哥伦比亚大学计算机系软件系统实验室博士生，曾在 OSDI、CACM 等操作系统领域超一流学术会议和期刊上发表多篇论文。曾参与 Chrome 和 Google Cloud Platform 的研发工作。\n\n(本文在写作过程中参考了 Randal E. Bryant 和 David R. O'Hallaron 所著的 Computer Systems: A Programmer's Perspective 第三版。)\n"}}},{"node":{"title":"谷歌面试官告诉你：应届毕业生北美找工作拿到Google/Facebook软件工程师offer的“捷径”是什么？","path":"/en/news/2019-05-15-google-facebook-internship-return-offer/","node_locale":"en-US","id":"81ef0b59-67f3-55b5-abdf-773a96552280","contentful_id":"63has8oyjrTxZKjzxQEFiv","date":"2019-05-15T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Google","Facebook","internship","return offer","software engineer"],"description":{"description":"各大科技公司在对国际学生，尤其是在New Grad的招聘上，越来越严格。而return offer能够帮助New Grad增加拿到FLAG offer的机率。那么，各公司return率大概是多少？你的return offer由谁来决定？如何表现才能加大转正的机会？前谷歌面试官闫老师来为你答疑解惑..."},"thumbnail":{"id":"524a437f-ef08-5662-90ba-764c26df1452","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1gwqR8ZTeOyzglpSoLtfVR/feaf79fabb297bd5b17788e1c68ba98c/2019-05-15-return-offer.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/1gwqR8ZTeOyzglpSoLtfVR/feaf79fabb297bd5b17788e1c68ba98c/2019-05-15-return-offer.jpg?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/1gwqR8ZTeOyzglpSoLtfVR/feaf79fabb297bd5b17788e1c68ba98c/2019-05-15-return-offer.jpg?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/1gwqR8ZTeOyzglpSoLtfVR/feaf79fabb297bd5b17788e1c68ba98c/2019-05-15-return-offer.jpg?w=1600&h=1100&q=50&fit=fill 2x"}},"thumbnailAlt":"Google, Facebook, internship, return offer, software engineer","authorProfile":null,"body":{"id":"c04dfa7e-8764-5ef9-8028-d1284d5af376","body":"随着川普政策的影响，各大科技公司在对国际学生，尤其是在New Grad（应届毕业生）的招聘和sponsor上，可谓是越来越严格与谨慎。\n\n那New Grad如何在这样不利的大环境下，增加拿到FLAG offer的机率呢？\n\n**Return offer了解一下？**\n\n![8d1c9934f1a2f2c5186462776337dd2a](//images.ctfassets.net/04k2xg9gplcj/31QCug9qXiIRnIXelVGjld/4ece4ce3e319824ad876b42785c16699/8d1c9934f1a2f2c5186462776337dd2a.jpg)\n\n虽然科技公司缩紧了招聘，但并不代表他们不招，他们只是**更有选择、更高要求地招聘 —— 尤其倾向于从公司的实习生名单里挑人。**\n\n**Return offer就是发给之前在这个公司做过实习、且表现不错的实习生的。**因为这部分candidates已经有3个月的试用期，对公司而言可信度更高，能更快适应工作，节省公司对他们的培训成本。\n\n**通过拿Return offer进FLAG公司的同学，可比正常校招渠道进入公司的同学要少受很多“罪”**，毕竟拿实习offer比拿全职offer容易。比如，成为Google的实习生只需通过2轮电面，而想要拿到全职offer，除了电面以外，还有4-5轮的onsite考察。\n\n因此，面对飘忽不定的政策与大环境，进入一线科技公司**最稳的方法就是：先实习再拿return offer。**\n\n不过，拿到实习也**并不意味着“百分之百稳了”！**如果在实习期间**表现不佳**，或是遇到综合实力更出色的同期实习生，还是有可能与return offer**失之交臂**。\n\n那么：\n\n- 各公司return率大概是多少？\n- 你的return offer是由谁来决定的？\n- 拿到暑期实习之后，能提前做什么准备？\n- 实习期间如何表现才能加大转正的机会？\n- 没拿到return offer怎么办\n\n就以上问题，我们采访了**来Offer的闫老师**，一起来听听这位**前谷歌面试官**怎么说：\n\n## FLAG公司的return率大概是多少？\n\nFacebook、LinkedIn、Amazon、Microsoft这几家公司的return offer率能达到**60%-70%**左右。\n\n![875e1bc740abace0025172e662dc0062](//images.ctfassets.net/04k2xg9gplcj/5AXsLFl18EpS0QrYEpWFTq/648a876bb83d6545f8f0e7edacc037b5/875e1bc740abace0025172e662dc0062.jpg)\n\n其中，**LinkedIn的return率是最高的**。因为LinkedIn没有针对New Grad专门开放的校招岗位，只有社招岗位。这就意味着，New Grad想进LinkedIn，需要和其他已经有1-2年工作经验的求职者“同台”竞争，没有优势。因此，**被LinkedIn录取的New Grad，几乎都是通过拿return offer进来的。**而在FLAG中，**Google的return率是最低的**，大概在25%-30%左右。\n\n![31ed0d2a4e889f003ad26697221da65f](//images.ctfassets.net/04k2xg9gplcj/4EwmhvL2V4LtJldbtrxkZn/b88a7adf0eb685256b8db07e49f1c610/31ed0d2a4e889f003ad26697221da65f.jpg)\n\n这是因为，Google intern在转正的时候，不仅仅是看实习期间的表现，还需要进行2轮onsite面试。这2轮面试的结果也会纳入考量。\n\n## 你的return offer是由谁来决定的？\n\n实习生是否能拿到return offer，并不是由“谁”决定的，而是一个综合考量的结果。当然，其中最关键的因素是你的**manager，tech lead**，以及一起工作的**peer**，**他们共同对你实习期间的review和feedback**。\n\n一般情况下，实习的中期和末期分别会有**2次review**，manager会根据你的表现提出建议。最后，由hiring commitee决定是否发return offer。\n\n## 拿到暑期实习之后，能提前做什么准备？\n\n由于大公司的开发系统很复杂，又有自己的内部工具，在真正开始实习前不太可能真的有机会去上手练习。不过大家在实习之前一般都已经知道自己的hiring manager是谁，这时候你就可以通过LinkedIn或者邮件去reach out。你可以**向未来的manager寻求一些建议，或是了解之后工作的大致内容，需要用到哪些技能等等。**\n\n比如，如果你实习的组是做前端的，工作中会用到React框架，提前熟悉、学习这项技能就有可能让你在实习过程中有更好的表现。如果进的是后端组，那不如提前学习一下C++这项技能！\n\n![7dd78217ee1f31bb69f4475f32b1597a](//images.ctfassets.net/04k2xg9gplcj/A89FI0pl4Rz4Ca5ItpTc3/b3290e2e09f50cc9db12ea88e74485a6/7dd78217ee1f31bb69f4475f32b1597a.jpg)\n\n## 实习期间如何表现才能加大转正的机会？\n\n一般来说，实习生的表现主要体现在以下几个方面：\n\n**1. 学习速度 （learning speed）**\n\n对于实习生来说，最大的挑战就是需要在尽可能短的时间内熟悉环境、开发系统、学习内部工具等等，因为整个实习就只有短短3个月。因此，快速学习、上手的能力非常重要。\n\n**2. 代码质量 （code quality）**\n\n不要因为自己是个实习生，就觉得只要写出的代码完成了需求、没有bug就行了。真正高质量的代码需要符合业界对格式、易读性和结构的要求，能让团队其他的成员很容易地读懂和维护，保证团队工作效率。\n\n**3. 沟通能力 （communication）**\n\n这是一大部分中国intern的弱点。有的同学技术水平都没问题，但最终败在了沟通上。比如一些实习生因为害羞，来了之后也不跟组里人交流，碰到问题也是自己闷头研究，在组里几乎没什么存在感，别人自然也不知道该怎么给他们写feedback。实习结束前，实习生一般都会向全组做一次presentation，向大家展现自己实习的成果（参与了几个项目，实现了多少feature等等），这也是一次非常重要的沟通机会。\n\n**4. 主观能动性 （proactivity）**\n\n在北美职场上，所有东西都要主动去争取，你需要利用好每一次与队友的交流的机会，展现出积极向上的态度。当有时间空余时，主动去问manager或tech lead找活儿干；当任务过量时，也要主动negotiate进度，而不是别人让你做什么，你就做什么。\n\n## 没拿到return offer怎么办？\n\n首先，没拿到也不要太担心，因为已经有了一个大厂实习经历，**会为之后找全职岗位加分很多。**而这段实战经历，也能帮助大家更清晰地意识到自己地不足：是编程、系统设计等硬实力需要加强？还是沟通、交流方面不达标？对于不足的方面，要抓紧时间有针对性地进行训练、加强。\n\n举一个**来Offer学员Chen同学的例子**，大三暑假，Chen同学虽拿到了FLAG的实习，但最终却没能转正。不过他并没有因此一蹶不振，而是紧锣密鼓地开始找全职工作。最终，在来Offer的帮助下，他本科一毕业就拿到了Google, Apple, Uber, Yelp, VMware, Bloomberg, Quantcast, SAP, Magic Leap, drawbridge **10个大offer**！\n\n[点击查看chen同学完整求职心得](https://mp.weixin.qq.com/s/nfc8Szs3IUicEODT2dv4cg)\n\n## 拿到return offer也别掉以轻心\n\n最后，即使拿到了return offer，也还是建议大家在秋招的时候为自己争取多拿几个别家的offer，否则手上只有一个“筹码”的你，在**谈薪资时将没有任何优势**，很有可能被公司low ball （低于正常该拿到的薪水）。而如果手上同时还有其他公司的offer，你就可以非常有底气地跟公司negotiate薪资和待遇了。"}}},{"node":{"title":"机器学习又现最新黑科技, 为什么Kubeflow受到了谷歌, 亚麻, 苹果的强推？","path":"/en/news/2019-06-24-kubeflow-Google-machine-learning/","node_locale":"en-US","id":"dd209906-132b-50bd-b954-7461491b5f00","contentful_id":"5r4TPr6Wv25RoFghZkrZD","date":"2019-06-24T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Kubeflow","Google Cloud Platform","Machine Learning","Kubernetes"],"description":{"description":"虽然Machine Learning、Deep Learning十分火热，但可能只有小部分的机器学习工程师能够实现深度学习的“概念变生产”。那么，机器学习的“痛点”是什么？又能通过何种技术来解决？"},"thumbnail":{"id":"59b0ea89-0d70-5b71-9e4d-c6bf3d089f8f","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/6m5GL8h7rGEYgjSbgSSfpG/a9a693f0adaad6f5914685d7b2342a55/2019-06-12-kubeflow-google.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/6m5GL8h7rGEYgjSbgSSfpG/a9a693f0adaad6f5914685d7b2342a55/2019-06-12-kubeflow-google.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Kubeflow, Google Cloud Platform, Machine Learning, Kubernetes","authorProfile":null,"body":{"id":"166b5d20-e177-56be-915e-c721a446bf08","body":"如果数据科学行业也有热搜榜，那么机器学习、深度学习的话题热度一定是稳居榜首。然而你知道吗，虽然Machine Learning、Deep Learning如此火热，但据Google Cloud产品经理高级总监Rajen Sheth的说法：\n\n> 世界上有百万名数据科学家、千万名软件开发人员，但可能只有几千名机器学习工程师能够实现深度学习的“概念变生产”。\n\n认清这个现实后，Google联合世界各地的科技公司，推出了面向机器学习的服务——__Kubeflow__，将机器学习的“痛点”逐一击破。\n\n![23850db51e77e21bca489d95b5d9dd21](//images.ctfassets.net/04k2xg9gplcj/dCFaZTCTH3svtO9EFEvjy/5b73e2ff671629e6082e0566d3e7e119/23850db51e77e21bca489d95b5d9dd21.jpg)\n\n看到这里，你是不是已经兴奋得开始搓手手，迫不及待想要了解这项前沿技术了？不要着急，我们一点一点说：\n\n__- 机器学习的四大痛点__\n__- Kubernetes —— Kubeflow的基石__\n__- Kubeflow的愿景 —— 让每个公司都能用上机器学习平台__\n__- Kubeflow的实际应用场景__\n__- 哪些公司需要Kubeflow/Kubernetes人才？__\n\n\n---\n\n\n## 机器学习领域的四大痛点\n\n随着机器学习和人工智能的迅猛发展，业界出现了许多开源的机器学习平台，但有四个痛点一直存在于机器学习领域之中：\n \n### 痛点一：对计算资源的需求越来越高 \n\n机器学习和深度学习都必须依靠大规模的数据，进行不断的训练和试错，才能提高结果的准确度和表现。而更多的计算资源，就意味着，我们能够以更快的速度，在更大的数据集上进行迭代，为业务带来更多的可能性。\n\n这也正是很多公司所做的事情：为机器学习和深度学习投入越来越多的资源。\n\n但与此同时，这又带来了一个新的挑战。\n\n### 痛点二：计算资源的高效利用和分配\n\n当一个公司有了很多的计算资源，一个新的问题就诞生了：如何充分的利用这些资源，在不同的业务小组、不同的训练任务之间进行合理的分配。\n\n很多公司的做法非常原始，每个业务小组可能会被分配一部分固定的资源，之后小组内部进行手动的调度和分配。这样一来，在公司层面，资源无法打通成为一个完整的资源池，资源的利用率和调度上都会存在低效、滞后的问题。\n\n![18b4ec91c2ff570643d2a740ad884f53](//images.ctfassets.net/04k2xg9gplcj/6nxLBbbisaXfms23xkd3qh/ab322da08512f08a4c87adf733fef9a5/18b4ec91c2ff570643d2a740ad884f53.jpg)\n\n### 痛点三：大量人力花重复性劳动上\n\n机器学习，绝不仅仅是“建模”而已。在真实的生产环境中，整个机器学习的Pipeline，还包括了环境配置、数据管道搭建、数据整合、分析、视觉化，模型训练，模型验证发布，监控日志等多个环节，涉及到不同的技术、服务和工具。\n\n![b2d77cdd73e53d78a20aa557d9d0fb0f](//images.ctfassets.net/04k2xg9gplcj/nCpyg3E0y639B3nHCbdr3/d79fd69bea84cd841e791ddf5a1b26bd/b2d77cdd73e53d78a20aa557d9d0fb0f.jpg)\n\n环节、过程复杂，举两个典型的例子：\n\n- 不同任务对应不同的tensorflow和python版本，每次跑训练之前，都需要手动配置环境，非常繁琐。\n- 在跑训练的时候，需要不断人肉监测每个机器的资源利用情况，不断调配参数，消耗人力。\n\n### 痛点四：“上云”的可迁移性\n\n机器学习的整个模型训练和服务的各个环节，其实是在不同环境中实现的。实验在实验环境中进行，训练在训练环境中进行，最终上生产线，一般又需要部署到云环境中去。如果没有资源的自动化整合和调度，是很难让各个环节的结果在不同环境中得到无差别复现的。\n\n就拿云环境来说吧。“上云”现在已是行业大趋势，越来越多的公司部署了实施云化的策略，希望完成传统应用到云端的迁移。但是因为传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位等一系列问题，使得往云上迁移的过程变得十分麻烦且缓慢。\n\n![c1d879d81602487dce16d41fc9886a6f](//images.ctfassets.net/04k2xg9gplcj/6jPI4Mz55FFixM2BvBM8Xi/68805fdddb343d13ef942b90af420cf1/c1d879d81602487dce16d41fc9886a6f.jpg)\n\n为了解决上述这些问题，Kubernetes和Kubeflow相继“闪亮登场”。\n\n\n---\n\n\n## Kubernetes —— Kubeflow的基石\n\nGoogle 公司于 2014 年启动了 Kubernetes项目，到现在只有不到5年的发展历史。虽然还是个年轻的技术，但Kubernetes逐渐成为各大公司管理机器学习任务的首选。\n\nKubernetes 是一个自动化部署、伸缩和操作应用程序容器的开源平台。简单点来说，我们可以把Kubernetes理解成一个分布式集群管理的工具。\n\n一个公司有很多不同机器来运行不同的服务，而Kubernetes的作用，就是把这些机器整合成一个“操作系统”。在这个“操作系统”上，各种各样的service、application、job（比如机器学习的数据库、网页、前端）的部署、scaling，都可以实现自动化。\n\n而Kubeflow，就是专用于Kubernetes的机器学习专案。\n\n## Kubeflow的愿景：让每个公司都能用上机器学习平台\n\nKubeflow并没有“创造”一个新的服务，而是将已有的、常用的机器学习工具，比如Tensorflow、Jupyter Notebooks等等，整合到Kubernetes这个平台上，形成一个一体的pipeline，将机器学习的整个流程（包括数据处理、部署、监控、管理）自动化。\n\n![1e55bf72af2a7d13db0953127aa6b741](//images.ctfassets.net/04k2xg9gplcj/7yt53EfFTLbAiHGOAJDqYb/4c9d029014be51e23bc578441a7a4c2f/1e55bf72af2a7d13db0953127aa6b741.jpg)\n\nKubeflow致力于让Kubernetes上进行的机器学习任务组件化、可移植、可扩展，它的优势具体体现在以下几个方面：\n\n1. 简化了在 Kubernetes 上面运行机器学习任务的流程， 实现了一套完整可用的自动化流水线。\n2. 实现了native的云原生，即本地训练好的模型，可以一键上云，使得本地开发和云开发在一个环境中，效率大大提高。\n3. 可扩展性好，能满足内部业务的定制化需求，自动调配计算资源。\n\nKubeflow的开发团队就表示，从事机器学习工作的人所使用的工具琳琅满目，而Kubeflow的重点，是无论遇到什么样的需求，都可以客制化自己的工作流程，提供多种基础架构能够简易、可重复且具备可携性的部署，也能依需求缩放规模。\n\n## Kubeflow的实际运用场景\n\n坚持看到这里的同学可能会说，前面说的还是有点抽象，有没有什么我们看得见、摸得着的Kubeflow应用成果呢？\n\n举个例子吧。Kuberneteschina曾在知乎发表文章，介绍了全球知名酒店提供商Booking.com是如何使用Kubeflow来支持深度学习的。\n\n![ddcbf5c8e243be88d64f906f19fbe289](//images.ctfassets.net/04k2xg9gplcj/6jM8gWbHceWHbjQya1sVJT/5911468a54ad9ceaa9485e925182600d/ddcbf5c8e243be88d64f906f19fbe289.jpg)\n\nBooking在全球 220个国家拥有超过140万套的房源，平均每天有超过150万个酒店房间被预定。\n\n为了给用户提供更好的体验，他们使用了图像标注技术，通过深度学习算法，为各种图像加上标签和评分，如是否为海景房、是否带阳台、床的舒适度等，使得用户在选择酒店时拥有了更多有效信息和评价标准。\n\n而为了更好地支撑深度学习作业，Booking.com选择了 Kubernetes 作为底层调度平台, 结合 Hadoop 和 TensorFlow（即Kubeflow）。他们打通了大数据管理和模型训练、服务的流水线，实现了模型服务初步的负载均衡和弹性伸缩功能，大大提高了搭建和运行深度学习模型服务的效率。\n\n\n---\n\n\n## 哪些公司/岗位需要Kubeflow/Kubernetes人才？\n\nKubeflow对于大公司来说意义非凡。除了Booking.com，现在谷歌，微软，亚马逊，Intel以及国内的阿里云，华为云，小米云，京东云, 才云等等公司都在利用Kubeflow，并结合kubernetes对多种机器学习引擎进行多机多卡的大规模训练。\n\n__Amazon__\n![94cb62afc8903d945e791d96f99b534b](//images.ctfassets.net/04k2xg9gplcj/69fuYhJYCAwqj7FZm69amR/54cbc9f64ee4e1a2f98a01eae6e08925/94cb62afc8903d945e791d96f99b534b.jpg) \n\n__Apple__\n![64a2eae40617960261697af11eee03f4](//images.ctfassets.net/04k2xg9gplcj/3zQUW7zDYqvoBCSdi9FCL2/34415ada4af5741da7d8ab5345a30278/64a2eae40617960261697af11eee03f4.jpg) \n\n__百度__\n![e55eb9018b9c16224486f0621001fb30](//images.ctfassets.net/04k2xg9gplcj/6iTszRi2O51vSe0rSQrm6Q/01345e6aa1c4e638cc359891a9de939c/e55eb9018b9c16224486f0621001fb30.jpg)\n\n\n---\n\n\n## 哪里可以学？\n\n来Offer（www.laioffer.com）人工智能与数据强化课程，全新推出__【基于Kubeflow开发机器学习和AI算法Pipeline】__项目：\n\n![ee586fdefc29b30faa7f1854f676e6aa](//images.ctfassets.net/04k2xg9gplcj/71crOT88SDuWDQhR608uHi/d07f0d463b1c4f6680a33cf03c85befe/ee586fdefc29b30faa7f1854f676e6aa.jpg)\n\n本项目将会带领同学，手把手在Kubeflow上部署Data Pipeline。让你的简历增添一个超前沿的技术栈，在面试中能自信应对Kubeflow相关问题！\n\n想要获取更多课程详情，请点击：https://www.laioffer.com/zh/course/ai-and-data-engineering/"}}},{"node":{"title":"留美还是回国? 哪些学校拿offer最猛? 谷歌、FB哪家公司对应届生友好？2019北美求职白皮书重磅发布！","path":"/en/news/2019-09-06-job-hunting-white-paper/","node_locale":"en-US","id":"e1c8ee4d-f340-54a0-ba42-e63bb3aef8e1","contentful_id":"55OzkMr75SUuIsELjKDFyB","date":"2019-09-06T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Computer Science","Data Science","Job Opportunities","H-1B","White Paper"],"description":{"description":"想知道：毕业后，留学生该何去何从？是回国好？还是留美好？哪些学校的学生拿offer最猛？哪些学校的学生毕业后可以年薪百万？硅谷IT黄埔军校来Offer发布了《2019北美留学生求职白皮书》，为你解读美国留学生就业机会与现状！\n"},"thumbnail":{"id":"49200cde-bd87-5de8-bac8-3fa5dce5c2b9","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/6nS4sFmJncnt9uyOFrjhWF/09ce776ba7c00351924f63aa61e3b951/2019-09-09-Chinese-student-job_hunting.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":"Computer Science, Data Science, Job Opportunities, H-1B, White Paper","authorProfile":null,"body":{"id":"f3377543-f7be-5b8c-8101-d2f92a30c73b","body":"> 2017-2018学年，赴美留学的中国留学生已达到36.3万人。而毕业后在美实现首次就业、并申请H-1B（工作签证）的中国留学生，仅有1.5万人。\n\n你知道：\n\n- 毕业后，留学生该何去何从？\n- 是回国好？还是留美好？\n- 哪些学校的学生拿offer最猛？\n- 哪些学校的学生毕业后可以年薪百万？\n- 哪些公司最愿意招国际生？\n- 留学生求职最佳时间线是什么？\n\n硅谷IT黄埔军校来Offer发布了《2019北美留学生求职白皮书》，为你解读美国留学生就业机会与现状！\n\n## 回国 VS 留美\n\n### 1.意向对比 \n\n据美国国际教育协会IIE对赴美留学生的调查显示，__有80%的留学生在去美国前，打算毕业后就回国__。但在美国几年学习后，__中国留学生的意向会产生变化__：\n\n![2](//images.ctfassets.net/04k2xg9gplcj/58HHMTQ75r6qtInx2a1Pi1/b2e344cd9ba7ece6ebba897ab1b342db/2.jpg) ![1](//images.ctfassets.net/04k2xg9gplcj/8oZETeKvYIuUxbmsR2ONF/971d3fbb1a3ca093e49800cd04721e37/1.jpg)\n\n从结果来看，尽管半数留学生希望留美，但现实却不能随他们所愿：\n\n2017年首次申请H1B的中国留学生只有1.5万人，而应届生人数约为8.94万人。换言之，__只有16%的留学生在毕业后能顺利留美__。\n\n![3](//images.ctfassets.net/04k2xg9gplcj/1AqkAdqhroS2d3uO5qU4Un/7e207da11b75116d08ba1e953a004a21/3.jpg)\n\n### 2.薪资对比\n\n我们统计了留学生毕业后常申请的几大职位：\n\n![4](//images.ctfassets.net/04k2xg9gplcj/14YY7YqxFjRrrWnp6QncrH/655f972d4a9c220558860ff17dc4e0be/4.jpg)\n\n从上表中我们可以看出，留美毕业生在起始薪资方面，比海归毕业生更有优势。同时，根据相关调查结果显示，__80%海归认为收入低于预期__。\n\n\n### 3.就业机会对比 \n\n__中国————__\n\n根据《中国海归就业创业调查报告》数据，海归热门就职行业如下：\n\n![5](//images.ctfassets.net/04k2xg9gplcj/3eEp7UsJAKr3Q6AXBuFujP/9e4ba61e4f6b8f3a9549451307606b9b/5.jpg)\n\n与2015年相比，__IT行业就业人数超过金融业，从第四位升至第一位__，增长10个百分点，这反映出近几年我国IT/通信/电子/互联网行业的快速发展。\n\n95%海归表示回国半年就能找到工作。\n\n__美国————__\n\nH-1B工作签证是留学生想留在美国长期工作的通行证。我们整理了USCIS对各行业国际生H-1B的统计数据：\n\n![6](//images.ctfassets.net/04k2xg9gplcj/1tTCibWkK0s3T66PDuJENK/2e26b56671e265a01dda26b2ad60c8c3/6.jpg)\n\n从上表可以看出，__美国科技、电脑行业招留学生势头强劲__。\n\n## 留美求职攻略\n\n### 1. 哪些公司更愿意招国际生\n\n据统计，在提供H-1B申请的雇主中，科技公司如__Google、Microsoft、Amazon、Facebook位列前茅__。\n\n从具体岗位上来看，__软件工程师的H-1B职位赞助申请量是第1位__。在H-1B岗位申请数量的前10位中，__CS、Data等科技岗位就占了8个__。\n\n![7](//images.ctfassets.net/04k2xg9gplcj/7mlgyHwERm00Wq6mW5JqOb/9be668c1ed96f6cd3398aec182bfb574/7.jpg)\n\n这一数据，也跟__硅谷IT黄埔军校来Offer__的学员offer榜数据一致。\n\n来Offer是北美唯一一家每周发出真名实姓offer榜的职业培训机构。至今，__已帮助3000+学员进入了全球一线公司，拥有强大的留学生工作offer数据库__。\n\n[点击查看完整offer榜](https://www.laioffer.com/zh/offer-board/)\n\n学员offer包括软件工程师岗位offer、Data岗位offer、无人车工程师岗位offer等等。\n\n在来Offer已发布与未发布的offer数据库中，有__90%__的offer来自于美国一线科技公司。\n\n- 其中，__有超过40%来自FLAGM（Facebook, LinkedIn, Amazon, Google, Microsoft）__这样的传统一线科技公司。\n- 有超过__26.6%__的offer来自__刚上市的一线科技公司__：如__Uber, Pinterest, Snap, Lyft__.....\n- 还有__22.9%__的offer来自__新兴独角兽__：如__Airbnb, Dropbox, Quora__等...\n\n而这些独角兽、刚上市的新兴公司又被称为__超一线公司__，他们在薪水、福利、工作环境上完胜传统的FLAGM。\n\n![8](//images.ctfassets.net/04k2xg9gplcj/1aXCUNDIq0UJWsSP7ddYAf/0c75ade6f74b23319f91f818a76a3235/8.jpg)\n\n通过来Offer的offer榜数据我们可以看出，__大的科技公司其实很愿意招有实力的留学生__。\n\n### 2.哪些公司对应届生最友好？ \n\n“听说现在大公司招人的标准越来越高，喜欢有经验的求职者，__New Grad （应届毕业生）__要怎么办？”\n\n确实，近年来科技公司的招人趋势如此。但是，对来Offer的学员而言，经过了系统的coding培训和工业界项目的实践后，New Grad 拿offer也不在话下。\n\n__在来Offer的offer库中，73%的offer由New Grad学员斩获。__\n\n![9](//images.ctfassets.net/04k2xg9gplcj/4bdAtRDTBql7q5C5Q0aItO/61fe332dc3084a4694f93ef946da0ec0/9.jpg)\n\n这里，来Offer还总结了一些对New Grad学员招聘友好的公司。\n\n![10](//images.ctfassets.net/04k2xg9gplcj/2L1aezlwZxIGnLS9TjmC2N/6361bef24ebba93dee9c649aaf4ce6d0/10.jpg)\n\n我们发现，FLAGM (Amazon、Google、Microsoft、Facebook、LinkedIn）给New Grad的offer最多，达到了总数的35%。\n\n如果细分FLAGM公司我们发现，__Amazon是对New Grad学员最友好的__：\n\n![11](//images.ctfassets.net/04k2xg9gplcj/1H9bCRxTxQSaTHrGLTPeXL/a223df431f9ebb0cddcb50cfb20fa7e1/11.jpg)\n\n[点击查看来Offer真名实姓offer榜](https://www.laioffer.com/zh/offer-board/)\n\n经分析我们还发现，__Uber__和__Bloomberg__也是__对New Grad友好__的公司，同时他们的薪水、福利也都媲美FLAGM的公司：\n\n![12](//images.ctfassets.net/04k2xg9gplcj/4NnvmaoIE7idNQgP3w3Odq/db7c6a313d335f4ddc78ef40d3d1a2dd/12.jpg)\n\n### 3.哪些公司对转专业同学友好？\n\n“如果不是CS、Data专业出身，可以实现跨专业就业吗？”\n\n在来Offer的offer数据库中，__超过一半__成功拿到CS offer的学员__来自于非CS专业__。\n\n![13](//images.ctfassets.net/04k2xg9gplcj/5NWhwwf1OANWoWo5bR06Rq/984340a77b36c4d9571fb731d36ccbb9/13.jpg)\n\n在专业分布上，__EE、CE__等硬件转软件的同学，人数众多，障碍较少，和CS同学拿Offer的情况不相上下。其他热门的专业还包括：__信息系统、数据科学、机械工程等相关STEM专业__。\n\n__文商科__学生转CS/Data的难度更高，但他们也拿到了不错的offer：\n\n![14](//images.ctfassets.net/04k2xg9gplcj/6epMPVQk5bhevm08T3flVJ/5dc20f0d130763eda926e5a9397ffc2f/14.jpg)\n\n此外，通过分析转专业学员的FLAGM offer，我们发现__Amazon、Google、Facebook等公司都对转专业学员十分友好__。\n\n![15](//images.ctfassets.net/04k2xg9gplcj/6eEcaKZjnzwUqJkcQUzTrn/1fe9b6a394ac5c39af57e8020eee09de/15.jpg)\n\n[点击查看来Offer真名实姓offer榜](https://www.laioffer.com/zh/offer-board/)\n\n除了CS offer，来Offer学员还在这些大公司里斩获了Data offer。从下图可以看到，__各专业分布平均，经过系统的培训，不同背景__的同学都能拿到理想的data offer。\n\n![16](//images.ctfassets.net/04k2xg9gplcj/7hGRWbao4dLfqFpoQFgd3R/517315268d707bcdfab834df325d21cc/16.jpg)\n\n### 4.哪些学校的学生最能拿FLAGM offer？\n\nFLAGM是很多留学生的梦想，不只是因为薪资高，还因为H-1B、绿卡政策好，福利好。\n\n![17](//images.ctfassets.net/04k2xg9gplcj/lnrZWdJuCen5YgXpjmFVV/f02c642a535ba2e93494ec171eedbf84/17.jpg)\n\n是不是很羡慕？那么哪些学校的学生最能拿FLAGM的offer呢？\n\n__在学校排名100名以内的学校中（如NEU, IIT, UTD等）， 绝大多数学员都拿到了FLAGM级别公司的offer__（[点击查看offer榜](https://www.laioffer.com/zh/offer-board/)）。\n\n__在学校排名前50的学校中，以下学校的学员在FLAGM公司的最多：__\n\n![22](//images.ctfassets.net/04k2xg9gplcj/5WlRt17S2WjrsRr8ixyRw9/94c875a5117a39c75da4108683de8f7d/22.jpg) ![18](//images.ctfassets.net/04k2xg9gplcj/3h7ADDlEevS8I8nY1mdE1h/170ccf457389062b8f5cab8f9a5e3e60/18.jpg) ![19](//images.ctfassets.net/04k2xg9gplcj/6mygLP2lZ7RVRJXCEpGRLN/ade9baf7ffd32ad3e232479a57a60d3f/19.jpg) ![20](//images.ctfassets.net/04k2xg9gplcj/7fEDb5mTdW9uXhbYUAeD8E/25733cbe5f222dd743a2b49483544bf4/20.jpg) ![21](//images.ctfassets.net/04k2xg9gplcj/5XPauU1bsq3b29ZhaLQVJm/0b1e25e39673e2fad62d790d81d78f89/21.jpg)\n\n### 5.求职最佳时间线\n\n从来Offer学员拿offer的时间点来看，__每年的2-4月、10-11月是高峰__，这也正是秋招、春招时期。\n\n![23](//images.ctfassets.net/04k2xg9gplcj/7dgKaEaXTVdFRl4lh5Atmq/27109043a3c75bb1fbaf60355db2e051/23.jpg)\n\n由这样的时间点可以推断出，CS求职的最佳时间线是：\n\n*__刚毕业————__*\n\n如果你已经在2019年5月毕业，并还未找到工作，来Offer建议你全力备战秋招。\n\n从你毕业后到身份失效，满打满算将有5个月的时间。考虑到面试的试错问题，__你至少需要从8-9月开始大量投递简历__，最终在12月之前拿到offer。\n\n*__将毕业————__*\n\n如果你是2019年12月毕业，你也需要把握好秋招。但如果你没有准备好，不幸错过这波秋招，来Offer建议你全力冲刺明年春招。__1月初开始投简历，2月初完成onsite面试，3月拿到offer__，这样还能赶上4月1日的H-1B抽签。\n\n*__大三/研一————__*\n\n大三和研一上学期，是找暑期实习最为关键的时间。__应该在一开学就准备投出简历__。\n\n*__大一/大二————__*\n\n现阶段最重要的是打好基础，扎实提升自己各方面能力。在大二的暑假，需要进行一次求职的冲刺，为大三开学找实习打下良好的基础。\n\n现在大公司对毕业生的招聘越来越严格，__如果能在在校期间拿到实习机会，并争取到return offer__，就如同毕业后拿到“保送”资格，成为赢家。\n\n总而言之，在北美求职，我们给大家的建议是，越早开始准备越有利。\n\n\n---\n\n来Offer软件工程师旗舰核心课程，已帮助3000+学员进入谷歌、Facebook等一线科技公司\n[点击了解课程详情](https://www.laioffer.com/zh/course/software-development/)\n"}}},{"node":{"title":"西雅图科技公司data岗位薪资大比拼，哪家给钱最多？","path":"/en/news/2019-06-24-data-science-salary-seattle-google-amazon/","node_locale":"en-US","id":"5aef89b9-71b4-5a6b-a2bb-84578a9d4c42","contentful_id":"5PWz1JnMcNllaKTHmCzRE","date":"2019-06-24T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Data science","Business Analyst","Salary","Tech company","Google","Amazon"],"description":{"description":"都说现在Data数据科学岗位的增长速度越来越快，我们今天就来对比一下西雅图几家大科技公司给Data数据科学岗位的薪酬大概在什么水平。\n"},"thumbnail":{"id":"8648a1b6-2b31-5e15-ad5f-dfcb8bf9b17b","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3YSzF0XqfguSJQPenwff7Y/e6b8fc7a0a71d896f7d9cb9672868e2c/2019-06-24-data-science-salary.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/3YSzF0XqfguSJQPenwff7Y/e6b8fc7a0a71d896f7d9cb9672868e2c/2019-06-24-data-science-salary.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Data science, Business Analyst, Salary, Tech company, Google, Amazon","authorProfile":null,"body":{"id":"94499ad1-0db6-523f-9f15-db734165990c","body":"都说现在数据科学Data岗位的增长速度越来越快，我们今天就来对比一下西雅图几家科技大公司给Data岗位的薪资大概在什么水平。\n\n本次对比的岗位有四个：__数据工程师/Data Engineer，数据科学家/Data Scientist，数据分析师/Data Analyst以及商业分析师/Business Analyst__。\n\n对比的公司有：__Amazon、Google、Microsoft、Expedia、Zillow和Tableau__。\n\n\n> 数据来源自glassdoor和paysa等网站统计数据，有一定误差，仅供参考。\n> \n> 注：以下为Entry level薪资水平，单位均为美元，以下不涉及senior岗位。\n\n\n## 数据工程师/Data Engineer\n\n数据工程师在西雅图地区的平均base在11万美金左右（Glassdoor显示这个价比全美水平低了5%），比湾区同一职位的平均base相比大概低了3万刀左右。\n\n![1bdf0932d824c963d95b673e349d84e7](//images.ctfassets.net/04k2xg9gplcj/7lLiHymrsqld4bAvr9GWxT/788c73abb932d69ae1d7de6306cfcf2d/1bdf0932d824c963d95b673e349d84e7.jpg) ![21e65d3262a78d8617fd654feb6f8c91](//images.ctfassets.net/04k2xg9gplcj/2Ysfs9u7zoP6aoI6Vsmzev/b2fcbe04f4f3ee05e63a7a580181b6ab/21e65d3262a78d8617fd654feb6f8c91.jpg)\n\n当然，湾区的income tax也不是开玩笑的，交完税大家都差不多。\n\n![4f13fee789f12b801bb70f92a7e76fc6](//images.ctfassets.net/04k2xg9gplcj/3QiK7qwV9TxpqUdTeTJyya/daee270d19407b1dcb08db103cdb517f/4f13fee789f12b801bb70f92a7e76fc6.jpg)\n\n大亚麻Amazon延续了一贯的“虽然我base不高，但是我有股票”原则。加上了所有的compensation之后，其他几家的package水平基本上也都在12万—14万美金左右。 \n\n\n## 数据科学家/Data Scientist\n\n数据科学家是这个行业中最高精尖的岗位。这个职位的工作主要是通过建立模型，做一些预测和推荐。对于大部分公司来说，Data Scientist的工作都是与公司利益直接挂钩的，招人的要求非常高，几乎只有数学、统计或者机器学习背景的PhD可以上岗。\n\n数据科学家在西雅图的base平均水平约在13万美金左右，湾区的整体base水平还是稍高一些。\n\n![ab000f0287f51012c6df7f88145ccd90](//images.ctfassets.net/04k2xg9gplcj/3OUG6iKFPE92tHo9Z5slrv/a20c41e228ea17d878ad4f2cdcd9e101/ab000f0287f51012c6df7f88145ccd90.jpg)\n![屏幕快照 2019-06-24 下午2.32.17](//images.ctfassets.net/04k2xg9gplcj/6WdYD4kTgXWDDdndf1t0cn/3f1592382445daa60e1c89cbbe7dce74/_____________2019-06-24_______2.32.17.png)\n\n整体来看，在西雅图地区，Google和微软在给Data Scientist的package上明显优于其他几家。\n\n![61e3fed62e4cc12d39c4479fd5c51e06](//images.ctfassets.net/04k2xg9gplcj/6RyOGAI2rEveeVZl4hS6g9/8d712cf429c130f037d4c0d266d91013/61e3fed62e4cc12d39c4479fd5c51e06.jpg)\n\n西雅图这些大科技公司对于数据科学家的package都高于地区平均标准，也可以看出这一职位确实有着很大需求和发展潜力。\n\n\n##  数据分析师/Data Analyst\n\n数据分析师涵盖了商业分析师（Business Analyst）和市场分析师（Marketing Analyst）的职责内容。数据分析师在工作中需要大量运用基础数理，统计知识，商业模型以及数据管理来对特定的商业问题提供以数据为导向的解决方案。相比数据科学家Data Scientist和数据工程师Data Engineer，他们更关心的是数据的业务含义。\n\n数据分析师在西雅图的平均base在7万-10万之间，湾区的base在9万-12万左右。\n\n![b270221ac95ef7ad6c7a79521823c185](//images.ctfassets.net/04k2xg9gplcj/4yYPtTmp6O1QPVE8pOGu2z/dcebfca1b109951ddc6176a6c4002e0a/b270221ac95ef7ad6c7a79521823c185.jpg) ![9b4c24caad7235b7c6c7cde2a30f7fb5](//images.ctfassets.net/04k2xg9gplcj/6lHTj9aOBIvoulAAQUDCBf/7ca5bddd2193d55dc852a61b49220523/9b4c24caad7235b7c6c7cde2a30f7fb5.jpg)\n\n这个岗位的各公司的差别都比较大，所以不同公司和地域对这个岗位给的描述和职能都不一样，所以package有一定的差距。\n\n![53e8e0e14d5a6e37564dd3fcd74206dc](//images.ctfassets.net/04k2xg9gplcj/3DCqq5I1eMVEEN2yfI1mN4/28e80533a7bd8eef3d586de4f1da8ad9/53e8e0e14d5a6e37564dd3fcd74206dc.jpg)\n\n\n## 商业分析师/Business Analyst\n\n商业分析师能根据业务的需求，从数据中生成相应的报表，为决策提供支撑。相比其他的业务人员，他能更高，更广，更深入并且更数据化地对业务进行分析。要具有一定的抽象能力，同时能熟练运用分析工具，学会用数据说话。商业分析师往往兼顾商业和运营的各种方向的知识，最成功的商业分析师都是那些能够“沟通、推动和分析”的人。\n\n在西雅图地区，Business Analyst的薪水在7万—9万之间，不同domian的商业分析师薪水差别较大。\n\n![63f622d536321305d002e8322922aa39](//images.ctfassets.net/04k2xg9gplcj/5gzWxTXrodE2xGezAvcPIt/156b4eb864e2eac8f7297a994447f68a/63f622d536321305d002e8322922aa39.jpg) ![47c3cf6929d073518568ba0579fcd890](//images.ctfassets.net/04k2xg9gplcj/6wlbJq2Tr9kEAiHrtCkr2Y/c95dd9b117654d0c1fd6402a3f8c9dc7/47c3cf6929d073518568ba0579fcd890.jpg)\n\n近年来在Amazon等大公司衍生的BI Enginner和BI developer在整体package上会更加贴近Data Engineer和Data Analyst的水平。\n\n![4cf68a2bb2dfe9a6d947964b5880f36c](//images.ctfassets.net/04k2xg9gplcj/dMj8zLqJcfC2E5rnflhwy/e85dadc3acc38eae43ed4db910cd6700/4cf68a2bb2dfe9a6d947964b5880f36c.jpg)\n\n想从事Data专业的人越来越多，大家都认为Data好就业、年薪高？\n\n__- 到底如何才能找到一份Data岗位的工作？__\n__- Data岗位面试究竟会考什么？__\n__- 如何提前熟悉Data面试，心里不虚？__\n\n硅谷IT黄埔军校来Offer（www.laioffer.com）【人工智能与数据科学强化课程】了解一下？\n\n课程详情请点击：https://www.laioffer.com/zh/course/ai-and-data-engineering/"}}},{"node":{"title":"谷歌面试官为你揭秘谷歌面试经典题目、技巧和内幕","path":"/en/news/2019-05-10-google-software-engineer-onsite-interview/","node_locale":"en-US","id":"ac61408a-6927-5af8-ae0b-054f07fd3e3f","contentful_id":"6yKEYvNuIIvMgqQlNjYIPk","date":"2019-05-10T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Google","onsite interview","software engineer"],"description":{"description":"谷歌的面试因没有题库、爱出新题难题等特征，令程序员求职者们“闻风丧胆”。想知道谷歌面试题有哪些特点吗？想知道谷歌面试官有哪些着重考察的内容吗？想知道谷歌面试有哪些技巧可循吗？有两年面试官经验并和超过200名面试者“交手”过的闫老师，来为大家揭秘......"},"thumbnail":{"id":"5acb24f1-bc5f-56d3-8539-a4590b5f974f","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/5VWY9fS6NCPaMhPiRLG8Bk/5bda32a5b4a5b23efd58f7b30946cf52/2019-05-10-google-interview.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/5VWY9fS6NCPaMhPiRLG8Bk/5bda32a5b4a5b23efd58f7b30946cf52/2019-05-10-google-interview.jpg?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/5VWY9fS6NCPaMhPiRLG8Bk/5bda32a5b4a5b23efd58f7b30946cf52/2019-05-10-google-interview.jpg?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/5VWY9fS6NCPaMhPiRLG8Bk/5bda32a5b4a5b23efd58f7b30946cf52/2019-05-10-google-interview.jpg?w=1600&h=1100&q=50&fit=fill 2x"}},"thumbnailAlt":"Google, onsite interview, software engineer","authorProfile":null,"body":{"id":"712a6d67-36be-59d6-a6f3-0062546e83ce","body":"### 谷歌面试能有多“可怕”？\n\n谷歌的面试因没有题库、爱出新题难题等特征，令程序员求职者们“闻风丧胆”。\n\n许多面试者在面对面试官时，会出现心跳加速、大脑空白、结巴、头皮冒汗等一系列症状。\n\n可鲜有人知道，谷歌面试官们在面你们的时候，也并没有好受多少：\n\n> 你那么紧张干吗？明明我也很紧张啊！\n你觉得面试难熬？难道我就不尴尬吗！\n看着大家在白板上奋笔疾书的样子，\n我想起了我的学生时代，淡淡的忧伤...\n\n不信？你来看看当了2年谷歌面试官，并和200+名面试者“交手”过的闫老师怎么说......\n\n![af95fecca145cb233cd7e1e77bd952bc](//images.ctfassets.net/04k2xg9gplcj/2vJreQqOcOrvinSB8R0FNS/a83280f43fedc03af8cc78bd5b4a66a3/af95fecca145cb233cd7e1e77bd952bc.jpg)\n\n### 闫老师\n\n- 前Google资深工程师、面试官，连续多次获得Top Performer荣誉\n- 南加州大学CS硕士，以年级前1%的成绩毕业\n- 已帮助3000+名学员进入FLAG公司\n\n*（以下内容为闫老师采访整理稿）*\n\n## 面试别人时，心情是不是特爽？\n\n并没有啊....面试官在一开始面求职者的时候，他们**其实也都是很紧张的。**\n\n所以新手面试官，一般会被分配去面intern，毕竟电面相对于onsite面试难度会小得多 (intern一般只有电面)。但即使是电面，也还是避免不了紧张...\n\n上帝视角看到的画面就是，电话这头的面试者紧张得冷汗直流，电话那头的面试官也紧张得心跳加速......\n\n![9696b8c7c0a52fbd08c4f78c8cbdc474](//images.ctfassets.net/04k2xg9gplcj/5Avpuy2F9Nn0Qa3alnb8f8/5f10ee5048e41590c32027662af7160c/9696b8c7c0a52fbd08c4f78c8cbdc474.jpg)\n\n当然，这是个循序渐进的过程。等经验丰富之后，面试官就可以接级别高一些的面试了。\n\n除了刚开始的紧张之外，**有些面试还会令人尴尬，让我祈求能早点结束....**\n\n比如有些面试者问啥啥不会，但我也不能call it a day，还是要和他一起熬过这漫长的45分钟。\n\n最后，可能我讲得比他还多，相当于是我给他免费上了一堂课。\n\n## 面试时会开小差想晚饭吃啥吗...\n\n作为一个负责任的面试官，我在面试时基本都是全身心投入到和求职者的对话中，思路跟着面试内容走。\n\n我觉得**大多数谷歌面试官都不会心不在焉，或带着偏见或情绪去面试，be professional在这种场合非常重要。**\n\n毕竟，既要理解面试者的说话内容，又要根据回答想下一步问什么问题，是很需要动脑的！\n\n**而且...我们面试官表现不好，是会被求职者举报的。**\n\n谷歌非常重视面试者感受，如果你遇到的面试官对你爱答不理，你**有权利投诉他并申请重面。**\n\n## 面试官每次问的题都是一样的么？\n## 多久会换题？\n\n一般来说，面试官**会不定期更新**自己的面试题。至于**更新频率，这就是看面试官的个人习惯了。**\n\n谷歌面试官出题自由度很高，甚至可以不按照recruiter安排的类型来出。\n\n![1df090df0312956f10fa589130a6dbf1](//images.ctfassets.net/04k2xg9gplcj/7llzYO3Q3zsCpi9nIwSVFD/75212765f3bff7d6e60541ddb1a61071/1df090df0312956f10fa589130a6dbf1.jpg)\n\n而且，为了出一道难度适中、区分度高的面试题，面试官会发挥团队的力量，使出全身力气，生怕你们觉得太简单了...\n\n谷歌内部有一个供面试官发新题的board，其他面试官都可以来评判题目好坏、提一些修改意见。\n\n每道题的背后，都凝结着我们的集体智慧结晶...\n\n![屏幕快照 2019-05-10 上午11.28.39](//images.ctfassets.net/04k2xg9gplcj/3tufPPmBOK0AjEr1BuDxZ4/67bc47c23073912ee923242798f27a8e/_____________2019-05-10_______11.28.39.png)\n\n我的习惯是，在一段时间之内，手上存4-5道好题。想要换题时，有时候会去board上找评价比较好的题目，有时候会将自己工作中遇到的问题做一些修改，然后拿去考面试者。\n\n但新题正式启用之前，我必须花大量时间钻研，保证一定的熟悉程度。\n\n所以，**不要依仗所谓的面经，也不要妄想背答案就能蒙混过关。每个面试官都有自己的小题库，每道题都能被变出十八种花样来考你。**\n\n## 传说谷歌面试不问项目经历，是真的吗？\n\n这是谣言。\n\n之所以会有这样的谣言，是相比较于其它公司，谷歌不会问到具体的代码实现这个层次（因为稍有不慎，别的公司可能就会认为你在探听他们公司的机密，之前发生过这样的事情）。\n\n但是面试官们会考察你在项目中用到的框架、你对做过的东西到底有了解 ，还有考察你对这个项目的ownership等等。\n\n所以大家不要抱有侥幸心理，谷歌面试还是非常**看重简历背景和项目经历的，一般面试一开始就会问相关问题。**\n\n**因为这个是team match最重要的参考，背景不够强team match就很麻烦。**\n\n## 面试通过率大概是多少？\n\n要回答这个问题，我们首先要知道Google的Hiring Commitee（HC）是做什么的。\n\n面试结束后，所有面试结果、recruiter提供的feedback、或内推信息（如果有的话），都会打包送给Hiring Commitee审核。\n\nHC会站在客观的角度，综合所有信息，给出是否录用的结果。\n\nNew grad的招聘流程，是先进HC，拿到offer之后才team match；\n\n而有工作经验的求职者会先进行team match，然后进HC，最后HC再决定给不给offer。\n\n有一些求职者会产生这样的错觉：\n\n> “连team都match上了，那不就等于稳拿offer了？”\n\n但其实并不是这样。\n\n![1c34e3e0ad93ad23185be4f60602d3df](//images.ctfassets.net/04k2xg9gplcj/3ZTwGWvjbqrfTwInPLcsdn/1940ba7de21adbc32b42eac397c87513/1c34e3e0ad93ad23185be4f60602d3df.jpg)\n\n首先，能够进HC的比例已经非常低了。\n\n一般来说，5轮面试中，有2-3个strong hire才能被送去HC，而这个比例大概在30%（官方数字）。\n\n其次，即使做了team match，HC这一关也不好过。\n\n比如说，如果面试的feedback差异比较大，或者有些方面在面试中没有考察到，HC觉得很难决定结果的话，会要求加面1~2轮。\n\n如果HC觉得你的实力确实逊色于其他竞争者，他们发起拒信来也是毫不含糊。\n\n所以，**offer没有真真正正拿到手上之前，还真没有“稳拿”这一说。**\n\n但是，也不是一轮面试答得不好就一定会挂。\n\n**如果5轮面试中，有1轮面得不好，但还有其他3个strong hire，内推也很有力，那你还是极有可能拿offer的。**\n\n**所以，不要因为一轮表现不佳就自暴自弃。**\n\n## 回问面试官的环节，面试官喜欢被问什么样的问题？\n\n当面试官问：Do you have any questions for me?\n\n正确答案一定是回答yes。\n\n这个环节答得好，不仅能帮你了解你以后可能入职的公司和职位，还能给面试官留下深刻良好的印象，所以**比较尖锐、敏感的问题就还是不要问了。**\n\n比较安全的问题有：\n**- What is your day like at Google?**\n**- 公司对一个entry level的engineer expectation是什么样的？**\n\n你们可以根据个人情况自由发挥，但重点就是想办法通过问题体现自己的**Motivation**和**Passion**，多换位思考一下自己能够给公司和将来的同事带来什么？以及他们想要什么？\n\n## 有没有令人难忘的candidate？\n\n实话讲，优秀到令我意难忘的求职者很少，大多数面试者都是属于中等水平，没有特别令人眼前一亮。\n\n最让我难忘的求职者，是一个UC berkeley CS专业的本科生。他是Ted speaker，世界少年组马拉松纪录保持者....给人感觉非常聪明、有想法。\n\n而在实打实的面试中，他也没让我失望，他表现出了扎实的编程基本功、全面的CS知识体系、完善的provlem solving能力、以及非常好的交流能力。\n\n面试结束后，谷歌其实是没有硬性规定说面试官必须sync。但是面完这个candidate之后，我们几个面试官都按捺不住激动的心情，主动聚在一起讨论他。\n\n![5edda5e7d8885d43e999aed534554f75](//images.ctfassets.net/04k2xg9gplcj/6w44PLIXD46JGiUgQARHkx/226871a5c94686188867f44d3c752334/5edda5e7d8885d43e999aed534554f75.jpg)\n\n聊一圈下来发现这几轮面试都是差不多的流程：\n\n30分钟就面完了规定的内容，剩下的十几分钟就是面试官在“推销”，想办法把他拉进谷歌。\n\n总的来说，**面试不是考试，让面试官印象深刻的求职者往往不是只追求做对题目的“机器”**，扎实的基本功、优秀的思维能力、出众的沟通能力，加在一起综合的表现才是最重要的。\n\n\n---\n\n\n看到这里，你是不是在了解了更多谷歌面试“内幕”的同时，也觉得面试官也没那么可怕了（甚至还有点可爱？？）...\n\n说到底，谷歌面试官不是魔鬼，他们也是人。他们并不是公司派来为难大家的“程咬金”，他们面试你，是在为他们自己寻找未来共同工作的同事。\n\n所以，**战胜心理恐惧，以平和的心态稳扎稳打、提升实力，才是我们应该花心思做的事情。**"}}},{"node":{"title":"在大公司和小公司做数据科学家, 有什么区别？","path":"/en/news/2019-05-02-data-scientist-job-hunting/","node_locale":"en-US","id":"33bc9ec0-788d-5001-80a5-64228d028c8f","contentful_id":"6S0mkO8fR8vrZIsu8LvEsI","date":"2019-05-02T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["data science","data scientist","machine learning","job hunting","Python","job opening"],"description":{"description":"听说在大公司和小公司做数据科学家有很大区别，是真的吗？为了满足大家的好奇心，我们采访了曾经在大公司和初创公司都有过工作经历的资深数据科学家马老师，为大家揭秘数据科学家这个薪资高、前景好的岗位。"},"thumbnail":{"id":"450ed06d-0db9-53bd-898e-636867292aab","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3kUbZsFNy7mE0tJUZ0clws/ae4f1dd9fd769f277adcfcc69c59b3fa/2019-05-02-data-scientist-job-hunting.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/3kUbZsFNy7mE0tJUZ0clws/ae4f1dd9fd769f277adcfcc69c59b3fa/2019-05-02-data-scientist-job-hunting.jpg?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/3kUbZsFNy7mE0tJUZ0clws/ae4f1dd9fd769f277adcfcc69c59b3fa/2019-05-02-data-scientist-job-hunting.jpg?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/3kUbZsFNy7mE0tJUZ0clws/ae4f1dd9fd769f277adcfcc69c59b3fa/2019-05-02-data-scientist-job-hunting.jpg?w=1600&h=1100&q=50&fit=fill 2x,\n//images.ctfassets.net/04k2xg9gplcj/3kUbZsFNy7mE0tJUZ0clws/ae4f1dd9fd769f277adcfcc69c59b3fa/2019-05-02-data-scientist-job-hunting.jpg?w=2400&h=1650&q=50&fit=fill 3x"}},"thumbnailAlt":"data science, machine learning, job hunting, Python, job opening","authorProfile":null,"body":{"id":"f63998f7-31be-5106-ad53-5bf8fbd266ff","body":"很多同学在看了我们的文章之后，都对数据科学家这个薪资高、前景好的岗位产生了浓厚的兴趣。\n\n但是，也有部分同学开始有了新的疑惑：听说在大公司和小公司做数据科学家有很大区别，是真的吗？\n\n为了满足同学们的好奇心，我们采访了曾经在大公司和初创公司都有过工作经历的资深数据科学家马老师。\n\n**马老师：**\n\n*- 资深数据科学家，数据培训名师*\n*- 北京大学数学学士、硕士，南加州大学石油工程学博士*\n*- 曾于Chevron和ConocoPhillips从事数据分析和数据科学工作，曾任初创公司首席数据科学家*\n\n（以下内容总结自马老师采访）\n\n在回答同学们问题之前，我想先给大家介绍一下：\n\n## 数据科学家日常的工作流程\n\n普遍来讲，完整的数据科学工作流程大概如下：\n\n### Step 1：提出问题，理解问题\n\n数据科学家通常需要**把一个模糊的商业问题转化为具象的数据问题**，并不断与上级、同事进行沟通交流来对问题的定义进行优化。\n\n### Step 2：数据收集与处理\n\n理解清楚问题之后，需要**决定哪些数据对解决问题有帮助，并进行数据收集与处理**。missing data怎么处理？outlier怎么处理？如何降噪？......都是这个阶段需要解决的事情。\n\n### Step 3：数据挖掘与建模\n\n数据挖掘与数据建模通常是数据科学流程中最硬核的一环。\n\n如何才能找到数据中隐含的信息，选取或建立什么样统计学、机器学习或深度学习的模型进行预测，需要对模型进行怎样的参数调整，最终能从模型输出怎样的结果......这些都是对数据科学家核心能力的考验。\n\n### Step 4：成果汇报\n\n结果成型了，现在要做的就是把数据化的结果用能让非专业人士也能理解的语言/图表表达出来。\n\n了解了数据科学的基本流程，我们再来谈：\n\n## 在大公司和小公司做数据科学家有什么区别？\n\n我在大公司和初创公司都做过数据科学家，差异确实较大，具体体现在工作内容、薪资待遇、职业发展这三个方面。\n\n### 工作内容\n\n总结起来，**大公司的数据科学家更加“术业有专攻”，而小公司的数据科学家一般会“多管齐下”。**\n\n**在大公司里，和data相关的岗位会分得很细。**\n\n我的第一段工作经历在ConocoPhillips （康菲石油公司，世界财富500强之一）。当时，公司数据都是比较敏感的商业机密，我没有权限直接接触到整个数据库。所以，前端的人会根据当时需要解决的问题，把相关数据从数据库中调取出来，交到我手上。\n\n![bef6537b1f6cef3d5042b5711845cf45](//images.ctfassets.net/04k2xg9gplcj/1d6S5Lp3fACVx7UGB1pd8I/22a15a68811587723f5f6492e2e8efe0/bef6537b1f6cef3d5042b5711845cf45.jpg)\n\n数据到我手上之后，我的工作主要是数据挖掘和数据建模。\n\n我会**运用石油领域专业知识进行数据预处理，并在此基础上进行数据可视化；然后我会根据经验，选择合适的模型进行预测。**\n\n![c7c42761f6b58c6dd4f2c364a53cdcbb](//images.ctfassets.net/04k2xg9gplcj/5PkoonvLrewk3KZPTHUdC7/0da1073cbf1f17dbd68151e4cc333ba3/c7c42761f6b58c6dd4f2c364a53cdcbb.jpg)\n\n**而在小公司里，DS可能就要兼职很多事情了。**\n\n从收集数据、准备数据，到决定选用什么模型、去train模型、评估模型；如果模型不好，可能需要从某一步重新开始，想想哪些地方可以改进，直到找到最佳模型，得到满意合格的结果。\n\n这样的循环往复，在小公司里可能需要一个人完成。\n\n### 薪资待遇\n\n这个是大家都比较关心的一方面。在这个问题上，大公司可能会略胜一筹。\n\n一般来说，大公司的基本工资、股票、bonus\n都会比较好，数据科学岗位的待遇一般都能达到媒体上宣传的那个水平。工作环境也会更人性化，食堂、gym、onsite医疗等服务应有尽有。\n\n![ef28edd94c8600d7c0cca67a38f81c69](//images.ctfassets.net/04k2xg9gplcj/7pGEPQ3rPODioOom8QDqcP/835b50c2179e2d4a7f73280d7379daf6/ef28edd94c8600d7c0cca67a38f81c69.jpg)\n\n小公司呢，就得分情况讨论了。\n\n第一类是已经走上正轨的小公司，不管有没有上市，福利（如401K）、bonus、equity都会比较标准化，只是基本工资会稍低一些。\n\n而另一类小公司，就是我们口中的“startup”，在短时间内的薪资待遇方面就会更差一些。尤其在融资或第一波产品出来之前，福利也不如大型或中型公司。\n\n![a92220e6b70101e1063dd02a137600e7](//images.ctfassets.net/04k2xg9gplcj/3MEdqJZ4k5l9dAjr8QSZRM/3e55d19f598f7b3a17a98d5d6a30e3b7/a92220e6b70101e1063dd02a137600e7.jpg)\n\n同时，初创公司的工作压力会更大。产品什么时候上线，能够抢占多少市场......这是从无到有的过程，非常具有挑战性，加班肯定是在所难免的。\n\n### 职业发展\n\n除了薪资待遇以外，眼光放得更长远一点，职业发展可能是同学们更需要考虑的问题。\n\n进入公司后，小公司的数据科学家一般处于“野蛮生长”的状态。\n\n你需要自己去熟悉公司业务、产品、工作方式、公司文化，会接触到各种各样的任务，获得来自不同岗位、不同业务的工作经验和锻炼机会。\n\n这样的环境里，**你能获得满满的参与感和成就感，impact和visability也会更大。\n\n![7285a2233f0ee7e9b1e85822852f8b3a](//images.ctfassets.net/04k2xg9gplcj/1KoOe5WeHatAsf0MkfPVrM/0ba8d171cf02c1e3d20b3a2c18715c82/7285a2233f0ee7e9b1e85822852f8b3a.jpg)\n\n但风险是，小公司发展前途的不确定性更大。有很多创业公司在初期摸爬滚打，好不容易上市却经历股票暴跌，使得很多员工不得不跳槽。\n\n而在大公司，刚入职的数据科学家一般都会配有mentor带领，按部就班地fit进这个岗位，学到规范化的工作流程和职业技能的系统性培养，并随着能力的提升，逐渐参与到大型的、复杂的项目中去。\n\n![eb83376c9a48ab6990eea56e668df157](//images.ctfassets.net/04k2xg9gplcj/1h8wIFxcrCrKyXBCpOKqSr/dacdbc3ff6ed1e9a788f917e7fcdbddc/eb83376c9a48ab6990eea56e668df157.jpg)\n\n所以，**进入大公司，意味着你拥有了很好的平台，有机会接触到最前沿的技术**。但如果你止步不前，只能一直做一颗“螺丝钉”。\n\n## 大公司 vs. 小公司如何选择？\n\n那么，同学们在求职的时候，应该选择大公司还是小公司呢？\n\n大公司和小公司各有各的优势，但是对于找第一份工作的转专业或new grad同学来说，我个人还是比较推荐去大公司。\n\n**职业发展初期，是大家技能、知识、经验积累的重要阶段**。大公司的mentor制度，会让你更系统、更踏实地进步，而小公司往往不会提供环境和土壤培养你。\n\n但是，如果你喜欢挑战、想要快速成长，一个前景不错的小公司会是很好的平台。\n\n![04fc044670f79793034d97a5c2a91b34](//images.ctfassets.net/04k2xg9gplcj/2Z5W0rhbBH367QpRlTpxP9/2e2877b4a16296c9fabd747ea0ee4b65/04fc044670f79793034d97a5c2a91b34.jpg)\n\n最后，有一点可以肯定的是，想要进入大公司或是小公司，你都得打好基础、做出充分的准备应对重重考验。"}}},{"node":{"title":"国内实习写在简历上有用吗? 怎么写才能在秋招求职中拿到面试机会?","path":"/en/news/2019-04-29-software-engineer-project-resume/","node_locale":"en-US","id":"702ffd49-aeed-59a2-a167-b3a28705dd79","contentful_id":"qgKqOgCFWhmnkQsGPaJFU","date":"2019-04-29T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Resume","project","algorithm","onsite interview","software engineer"],"description":{"description":"在美国求职，大家普遍默认简历上实习经历的对招聘官的吸引力排序为：美国大公司实习 > 美国小公司实习 > 国内实习。所以，国内实习经历可不可以写在简历上？美国的HR会认可吗？怎么写才能显得这段实习“高大上”？今天，前谷歌面试官Vincent老师就来回答一下同学们的困惑。"},"thumbnail":{"id":"8b237b6b-40b8-5327-8b20-0aa3147ca237","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3i0YDjDnIjsZ4Fi1vWvZ25/17e92e4e63e94d96e4e04d1501fd5939/2019-04-29-software-engineer-project-resume.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/3i0YDjDnIjsZ4Fi1vWvZ25/17e92e4e63e94d96e4e04d1501fd5939/2019-04-29-software-engineer-project-resume.jpg?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/3i0YDjDnIjsZ4Fi1vWvZ25/17e92e4e63e94d96e4e04d1501fd5939/2019-04-29-software-engineer-project-resume.jpg?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/3i0YDjDnIjsZ4Fi1vWvZ25/17e92e4e63e94d96e4e04d1501fd5939/2019-04-29-software-engineer-project-resume.jpg?w=1600&h=1100&q=50&fit=fill 2x,\n//images.ctfassets.net/04k2xg9gplcj/3i0YDjDnIjsZ4Fi1vWvZ25/17e92e4e63e94d96e4e04d1501fd5939/2019-04-29-software-engineer-project-resume.jpg?w=2400&h=1650&q=50&fit=fill 3x"}},"thumbnailAlt":"software engineer project resume","authorProfile":null,"body":{"id":"458ae42d-ed5d-5417-93d5-28c31f6e5325","body":"### 文 | Vincent老师\n\n*前谷歌面试官，Senior Fullstack Engineer，在FLAG一线大公司拥有多年的面试经验，帮助来Offer上千名同学修改简历、辅导面试。*\n\n在美国求职，大家普遍默认简历上实习经历的对招聘官的吸引力排序为：**美国大公司实习 > 美国小公司实习 > 国内实习**\n\n因此经常有一些学员向我提出这样的困惑：\n\n1. 国内实习经历可不可以写在简历上？美国的HR会认可吗？\n2. 怎么写才能显得这段实习“高大上”？\n\n今天，我就来回答一下大家。\n\n## Q1：国内实习可不可以放在简历上？美国面试官会认可吗？\n\n国内的实习当然可以放在简历上，尤其是以下两类公司的实习，可以放心大胆地写：\n\n\n**1. 如果你在BAT级别公司实习过：**\n\n像**百度、阿里巴巴、腾讯、搜狗、网易**等等这些级别的公司，在美国也有业务发展，在美国已经小有名气，因此深受美国招聘官认可。\n\n![fed9a3636fa82d4b380d956de5066b6e](//images.ctfassets.net/04k2xg9gplcj/4LblLvBwrGPVT220mbAja/46a3a8ec76f474347497e0dfc6722e3c/fed9a3636fa82d4b380d956de5066b6e.jpg)\n\n**2. 如果你在国内实习的公司使用的技术和美国这边的主流技术框架一致：**\n\n那么面试官也是会愿闻其详的。因为这些技术上的技能都是可以transfer的，比如前端用的react，后端用的go/java/python等等。\n\n## Q2：那如果我在国内的实习的公司既不出名，做的技术栈又比较老旧，该怎么办？\n\n如果没有以上两类经历也不要慌。一些**国人皆知但美国人不一定了解的公司**、或是**初创公司**的实习经历，也可以放在简历上。\n\n但在描述的时候，需要有一定的**策略和技巧**，体现出你的这段经历的**“重要性” **——\n\n- 策略1：\n\n如果你在国内一二线公司实习过，一定要表明该公司在中国是顶尖级别的、有规模的。\n\n举例子，如果你曾在“中国移动”实习，你可以在简历上这样描述：**the biggest telecommunication company in China which serves 500million users**. 面试官一看就能了解这个公司的重要性。\n\n- 策略2：\n\n如果你实习过的公司是小公司、初创公司，可以在描述中强调给哪些有名的大客户提供过服务，从侧面反映出这段经历的重要性。\n\n## 我什么实习都没有，但在学校做过一些project，能写吗？\n\n这个还是要具体看是什么样的project。\n\n**首先，技术选型和主流公司的技术框架要比较一致。**\n\n比如，如果你是转专业的同学，把在学校里学的EE 555的定时器项目放在一份申请程序员职位的简历里，不但没什么用，还会起副作用。\n\n**其次，主题最好是能广泛应用的主题。**\n\n不要小看了像推荐系统、广告系统之类看起来陈旧又老生常谈的主题，这些我们面试官一听就知道是业界普遍运用的。这类主题会让面试官对你感兴趣，愿意深入了解你的项目。\n\n而像区块链技术，虽然看起来非常的fancy和高大上，实际上应用却不是那么广泛，在实际求职中的效果远不及其热度。\n\n![91aa85ddb2b77457ae00a8c193869116](//images.ctfassets.net/04k2xg9gplcj/40R8MvAiaHjVOG0tNxNnBz/8490d8f1118ac06fc50b8ca19225f8bf/91aa85ddb2b77457ae00a8c193869116.jpg)\n\n**第三，写在简历上的时候，要体现出这个项目的真实性。**\n\n其实这点对于描述实习也好，项目也好，都很重要。\n\n在描述项目的时候，我们可以通过“起承转合”的方式提高项目的真实性：\n\n- 起：背景介绍，为什么要设计这个project\n- 承：描述句子的功能和细节，增强真实性\n- 转：描述挑战性，增强深度\n- 合：描述结果，体现Ownership\n\n举个例子，一个同学在简历上是这样描述他的项目的：\n\n- Designed and developed the system with Java, Eclipse, Hadoop, AWS EC2, REST AP (5000 lines of codes)\n\n这里对这个system的描述就比较空洞, 因为哪怕是做了一个\"hello world\" 也算是完成了一个system。\n\n这样不具体的描述，就会给招聘官留下一个项目经历“假大空、水分很大”的不良印象。\n\n因此，针对上面那个例子，**为了突出真实性，我们最好能给出具体的pages**，如果是个database，你可以透露有多少tables，或者说前端有多少layouts等等。\n\n## Q4：刚毕业，一个实习都没有，学校的相关项目经历也不充实，应该如何打破僵局？\n\n**首先，可以想办法尽可能和目标职位靠拢。**\n\n比如说CS和EE有很多**通用的经验和技术**，诸如前期查资料research、分析数据和debugging的能力，这些都是可以写到简历里边的。\n\n还有一些**通用的soft skills**，比如communication的能力、oral presentation的能力。尤其是一些PhD的同学，经常写paper和做presentation，也都可以为简历增色。\n\n![f9a8b05894e644612d5b9f3e896d7b45](//images.ctfassets.net/04k2xg9gplcj/7HLmpnmK5EO6mxj4eSgeFv/2d4d0d94bd84dd81068b1d031cdedd98/f9a8b05894e644612d5b9f3e896d7b45.jpg)\n\n**另外，同学们也可以在课外积累一些实用的、与工业界接轨的项目**，以丰富自己的简历，大大增加获得面试的几率！"}}},{"node":{"title":"LinkedIn年度新兴职位报告: 数据科学和人工智能相关岗位在以10+倍的增长速率爆发!","path":"/en/news/2019-04-30-linkedin-jobs-report/","node_locale":"en-US","id":"44b11123-f878-51d0-8b27-d47160705c2b","contentful_id":"19ZElEYpBLTiZiOqHVXxFF","date":"2019-04-30T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["LinkedIn","job","data science","artificial intelligence","machine learning","job hunting","job opening"],"description":{"description":"想知道哪些行业前景好、机会多？哪些职位正在崛起？又有哪些正在被取代？想为自己的职业生涯做出更明智的选择？近期，LinkedIn回顾了从2014年到2018年的数据，总结了近年来美国各个工作岗位的增长速度和增长量。下面，就让我们看一看这份2018美国新兴工作岗位分析报告。"},"thumbnail":{"id":"cb4fd38c-230f-59d7-a1c7-a3e6ce2afd52","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1ms02iTOa9fvVPfpnTe6CI/3c630dcff26dec46653b8d5c2131ba40/2019-04-30-linkedin-jobs-report.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/1ms02iTOa9fvVPfpnTe6CI/3c630dcff26dec46653b8d5c2131ba40/2019-04-30-linkedin-jobs-report.jpg?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/1ms02iTOa9fvVPfpnTe6CI/3c630dcff26dec46653b8d5c2131ba40/2019-04-30-linkedin-jobs-report.jpg?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/1ms02iTOa9fvVPfpnTe6CI/3c630dcff26dec46653b8d5c2131ba40/2019-04-30-linkedin-jobs-report.jpg?w=1600&h=1100&q=50&fit=fill 2x,\n//images.ctfassets.net/04k2xg9gplcj/1ms02iTOa9fvVPfpnTe6CI/3c630dcff26dec46653b8d5c2131ba40/2019-04-30-linkedin-jobs-report.jpg?w=2400&h=1650&q=50&fit=fill 3x"}},"thumbnailAlt":"LinkedIn job report data science machine learning engineer","authorProfile":null,"body":{"id":"d981d5ac-a8b5-557b-a128-c0b637726293","body":"*想知道哪些行业前景好？机会多？\n哪些职位正在崛起？又有哪些正在被取代？\n想为自己的职业生涯做出更明智的选择？*\n\n前阵子，Linkedin回顾了从14年到18年的数据，总结了近年来美国各个工作岗位的增长速度和增长量，并得出了一份2018美国新兴工作岗位分析报告。\n\n![0651732194db97f3db6455aa4d2563ec](//images.ctfassets.net/04k2xg9gplcj/538jftWNruq2ZMUqb8J5iO/e67e746456c15b153b5cfcf8129e61a8/0651732194db97f3db6455aa4d2563ec.jpg)\n\n报告一共有**两大主要发现**\n\n### 1. 人工智能是大势所趋\n\n虽然这并不意味着人类要被机器人所完全取代，但是与其相关的领域和职能正以肉眼可见的速度持续增长：在发布的Top15新兴岗位中，**1/3都和人工智能相关**。研究表明，人工智能正在渗透到每个行业，而不仅仅是技术行业。\n\n### 2. 部分传统职位仍无法被取代\n\n虽然人工智能大势是不争的事实，但它还远取代不了人类的力量，尤其是许多**与人“打交道”**的相关的岗位，如**行政助理、销售代表**等等。\n\n一起来看看报告的具体内容吧！\n\n\n## 在过去四年里，哪些岗位在迅速崛起？\n\nLinkedIn的报告统计了增长速率最快的岗位Top 15，名列前5名的分别是：\n\n![638398d234854c2745accf276b7d28d9](//images.ctfassets.net/04k2xg9gplcj/7hSN2csX4rft5iMhpYbVTW/a28fc033e665ea559197d23d11fab9b4/638398d234854c2745accf276b7d28d9.jpg)\n（排序依据：2014-2018岗位增长速率排序）\n\n剩余的10位分别是：\n\n- Relationship Counsultant\n- Data Science Specialist\n- Assurance Staff\n- Sales Development Representative\n- Business Support Consult\n- Solar Power Consultant\n- Administrative Assistant\n- Background Investigator\n- Machine Learning Researcher\n- Data Science Manager\n\n我们看到，区块链开发相关职位比2014年增长了**整整33倍**，位居新兴岗位Top1。这主要是因为，随着数十亿美元以ICO与风投的形式流入全球的区块链，各大公司和各种区块链项目，都需要招纳大量的开发者。\n\n不过，究竟区块链开发是否会成为就业市场的长期趋势，就需要时间的考验了。因为，在一定时间段迅速涌现的新兴职位，不一定会长期被市场所需要。\n\n![屏幕快照 2019-04-30 上午11.21.06](//images.ctfassets.net/04k2xg9gplcj/4TUhiisbsUqOGaORCVqSEA/b82bfc3ae2da4e62d3689574c0aba6eb/_____________2019-04-30_______11.21.06.png)\n（排序依据：growth in hiring rates ）\n\n1. Software Engineer \n2. Account Executive\n3. Realtor\n4. Account Manager\n5. Recruiter\n6. Project Manager\n7. Marketing Specialist\n8. Real Estate Agent\n9. Product Manager\n10. Data Scientist\n\n这些是在过去四年中在美国就业岗位中拥有持续的高招聘率、长期被市场需求的职位。\n\n对于求职者来说，以上这些职位可能是会是**稳定的职业选择**。\n\n值得注意的是，**数据科学相关岗位同时名列以上“最快崛起”+“最稳”两个榜单**，这也说明了这些职位**不仅仅长期被市场所需要，而且正以爆发式的速度增长**。\n\n\n## 拥有哪些技能的求职者，最能获得市场的青睐？\n\n![屏幕快照 2019-04-30 上午11.21.17](//images.ctfassets.net/04k2xg9gplcj/2sjqeb5NLW0cp9rWpfPxwd/ab4599a31ae2117b5dc28d636e5dcf52/_____________2019-04-30_______11.21.17.png)\n\n分析表明，沟通能力仍是大部分求职群体严重短缺的**软实力**；而随着信息和业务的数字化，越来越多公司对于数据科学、平面设计、网络开发等**硬技能**的求职者也倍加青睐。\n\n![屏幕快照 2019-04-30 上午11.48.01](//images.ctfassets.net/04k2xg9gplcj/1HEPSFE0y9YC5Q64YhxwM0/5febd34eee356c846b7d0d08e04e373d/_____________2019-04-30_______11.48.01.png)\n\n\n## 人工智能迅速崛起，新时代需要哪些技能？\n\n![屏幕快照 2019-04-30 上午11.21.17](//images.ctfassets.net/04k2xg9gplcj/7FNExrGBn0UtQud1P56Uuo/523467480d7c373345b3cdbe94128763/_____________2019-04-30_______11.21.17.png)\n\n在前面提到的15个迅速崛起的职位中，**有1/3的职位都与人工智能&数据科学相关，来看看他们都需要什么技能**：\n\n###  Machine Learning Engineer\n\n- 必备技能：Deep Learning, Machine Learning, Tensorflow, Apache Spark, Natural Language Processing\n- 高需求公司：Apple，Intel, NVIDIA\n- 高需求产业：软件、互联网、信息科技等\n- 高需求城市：旧金山、丹佛、奥斯汀\n\n###  Machine Learning Specialist\n\n- 必备技能：Machine Learning, Deep Learning, Tensorflow, Python, \n- 高需求公司：Google、Amazon、Apple\n- 高需求产业：软件、高等教育、互联网\n- 高需求城市：旧金山、纽约、麦迪逊\n\n###  Data Science Specialist\n\n- 必备技能：Machine Learning, Python, R, Apache Spark\n- 高需求公司：IBM、Facebook、麦肯锡\n- 高需求产业：软件、高等教育、信息科技等\n- 高需求城市：旧金山、纽约、芝加哥\n\n###  Machine Learning Researcher\n\n- 必备技能：Deep Learning, Machine Learning, Tensorflow, Python, Algorithms\n- 高需求公司：Amazon、Apple、Microsoft\n- 高需求产业：软件、互联网、高等教育等\n- 高需求城市：西雅图、圣地亚哥、旧金山\n\n###  Data Science Manager\n\n- 必备技能：Data Science, Machine Learning, Apache Spark, Python, R\n- 高需求公司：Facebook、Capital One、Microsoft\n- 高需求产业：软件、互联网、金融服务等\n- 高需求城市：亚特兰大、纽约、洛杉矶\n\n![3de597cbe26bc5e732f29e57694fb7b4](//images.ctfassets.net/04k2xg9gplcj/2qeoTcAc5PxYhENKkA8ek2/b3c96e619b0b9793edb4467f2789dcf0/3de597cbe26bc5e732f29e57694fb7b4.jpg)\n\n过去，许多人觉得，从事人工智能相关工作就只能局限于软件行业。\n\n其实研究表明，人工智能技术已经被应用到**从制造业到金融服务等等的几乎所有领域** (见下图)。\n\n![323606e98926c3ad7dfb6764961ee0df](//images.ctfassets.net/04k2xg9gplcj/1lXZJDJefjG8Xiv3pfbSeU/7f7c7caa38f09cd577ae89e51c0db379/323606e98926c3ad7dfb6764961ee0df.jpg)\n\n由于对人工智能人才的需求激增，各行各业也纷纷开出诱人的条件以吸引最顶尖的技术人才：\n\n- 在硅谷，Machine Learning Engineer的薪资约**14~16k美元**。AI Engineer的薪资中位数为**17k美元**。\n- 在华尔街，如果你是一个具备人工智能相关技能、经验丰富的金融人才，年薪可高达**100万美元**。\n- 在中国，BAT等业内领先的公司也出手“阔绰”。比如，腾讯就为机器学习基础研究员提供**60~80万的薪酬，还顺带解决北京户口**。\n\n不过，想要进入人工智能与数据科学领域，拿到这些理想的offer，并不容易。\n\n这主要是因为工业界对人才的要求和学校所教授的课程之间存在差距。\n\n像上面列出的被工业界广泛需求的Spark、Tensor Flow等技能，只有部分学校会设立这些课程；而在教授这些技能时，学校的课也多偏重于理论，而少有机会让同学们深入系统地学习并实践。\n\n而以上提到的火爆技能点，**来Offer人工智能与数据科学强化课程**，全部cover！\n通过**Python算法、coding、数据结构课**，加上**最新最尖端的人工智能项目**，让你真正掌握工业界所需的top技能！\n\n![0bee9ce56940d65d03b201d8eeabb393](//images.ctfassets.net/04k2xg9gplcj/37B3Ut3Pc3cxAwnGbFjYI6/4030603f06b7c48641400b9b0a583adb/0bee9ce56940d65d03b201d8eeabb393.jpg)"}}},{"node":{"title":"Apache Flink流数据实时计算技术主宰阿里巴巴所有业务","path":"/en/news/2019-04-17-alibaba-apache-flink-stream-processing/","node_locale":"en-US","id":"9ebbeae7-5e8c-5ed8-95db-6509c2359be9","contentful_id":"3PxNJ8n7XTLxvs06OZ9E0T","date":"2019-04-08T17:00-08:00","type":"news","subtype":"blog","featured":false,"categories":["Alibaba","Apache Flink","Machine Learning","SQL","Data science","AI","Job hunting"],"description":{"description":"目前，阿里巴巴所有业务，包括其所有子公司都采用了基于Apache Flink搭建的实时计算平台。所以，这项技术到底有什么魅力，能被阿里如此“宠幸”？"},"thumbnail":{"id":"ef238995-d371-5b62-abd5-7e72df9a557b","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/4GgwgINHu0i4MCgISUaWKo/edb20913ddaba8ebc1b5ee32dfb4ba7e/alibaba-apache-flink.jpg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/4GgwgINHu0i4MCgISUaWKo/edb20913ddaba8ebc1b5ee32dfb4ba7e/alibaba-apache-flink.jpg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"Alibaba Apache Flink","authorProfile":null,"body":{"id":"e740d808-8fc4-5560-9b5e-b0e7bcccca20","body":"2019一开年，阿里巴巴便收购了一家德国数据分析创业公司Data Artisans，交易金额为1.033亿美元。\n\n![82010a2b53fd6e305db45107fb4b763b](//images.ctfassets.net/04k2xg9gplcj/1JNh8o4agzLGQhp8W590jB/ddea76ae92615f92a982e3454533baaa/82010a2b53fd6e305db45107fb4b763b.jpg)\n\n不熟悉的Data Artisans的朋友，很容易因那些平淡的新闻标题如“阿里巴巴收购德国数据公司”而错过背后的信息。\n\n其实，**Data Artisans手里掌握着一项当今为数不多的前沿技术 ——**\n\n**它的名字，叫做Flink。**\n\n![bbce9faf38956ef0bca81887487c931f](//images.ctfassets.net/04k2xg9gplcj/5cIXZuF4ReYCoXORYSDBjT/c678345294dac026ed8cee0acc6392c8/bbce9faf38956ef0bca81887487c931f.jpg)\n\n**据了解，目前阿里巴巴很多业务，包括子公司都采用了Flink技术。**\n\n这项技术到底有什么魅力，能被阿里如此“宠幸”？并在一开年就迫不及待地拿下？\n\n## Flink，阿里的血液\n\n搜索，是像阿里这样的电商获取客户的关键入口，并承载了阿里大部分在线收入。\n\n**一个强大的搜索引擎由何造就？**\n\n答案是：尽可能为每个用户提供实时相关和准确的结果。\n\n![bf2b5773a7441de123eb7882275ae293](//images.ctfassets.net/04k2xg9gplcj/7kyAEexwWM0QI61DEzMafQ/a657fbb854be57dc2377a8f6ba010478/bf2b5773a7441de123eb7882275ae293.jpg)\n\n而这就牵扯到了当今工业界的一项核心技术——**实时计算。**\n\n无论是传统的大数据统计还是新兴的人工智能，实时计算的能力都至关重要。\n\n**可是，在实时计算的运用上，阿里遇到了大难题：**\n\n作为世界上最大的电子商务零售商之一，如何设计出一个低延迟、exactly once、能够支撑足够大体量的复杂实时计算引擎，是一项十分艰巨的任务。\n\n![bcd94741f622c976dc7b8a09bfe98c3b](//images.ctfassets.net/04k2xg9gplcj/1kDd4rTCB5dovn37pReMSl/5019d0bbfeefdd95ae317ffcd8f38743/bcd94741f622c976dc7b8a09bfe98c3b.jpg)\n\n阿里巴巴的高级技术专家王绍翾在一次采访中说道：\n\n“我们当时尝试过很多实时计算工具，什么Spark Stream、Kafka Stream、Storm....都用了，但是都不太符合阿里的需求。\n\nSpark streaming 不是特别适合于做秒级甚至亚秒级的计算；Kafka streaming 很难满足我们对大体量的复杂计算的需求；Storm 又没有批处理能力....\n\n**最后，我们发现了Flink，并且惊喜地发现它几乎完美满足了我们所有的需求！”**\n\n![屏幕快照 2019-04-16 上午11.03.45](//images.ctfassets.net/04k2xg9gplcj/1UJLH7lnEfFVFIFbelkPLY/e8d38c09ccef44ff1b9b0286672e916f/_____________2019-04-16_______11.03.45.png)\n\n**Apache Flink 介绍**\n\nFlink是一款分布式的计算引擎。\n\n- 它可以用来做**【批处理】**，即处理静态的数据集、历史的数据集；\n- 也可以用来做**【流处理】**，即实时地处理一些实时数据流，实时地产生数据的结果；\n- 还可以用来做一些基于事件的应用，比如说滴滴通过Flink CEP实现实时监测用户及司机的行为流来判断用户或司机的行为是否正当。\n\nFlink的好处还有很多，其中包括：\n\n提供准确的结果（甚至在出现无序或者延迟加载的数据的情况下）、支持容错、支持超大规模运行（在阿里巴巴中作业的state大小超过TB的是非常常见的）、支持exactly-once的一致性语义.....\n\n那么，Flink在阿里的业务中还有哪些应用呢？\n\n## Flink的运用场景\n\n接下来，就给大家举2个Flink运用案例。\n\n**双11大屏**\n\n每年双11阿里都会聚合有价值的数据展现给媒体，GMV大屏是其中之一。\n\n![ee845a88d1db31a5a687ee92d86f7d03](//images.ctfassets.net/04k2xg9gplcj/5dXBAiqMBiuPO1T6x7om2w/1cbb4ff339f40d36fa289455379e95aa/ee845a88d1db31a5a687ee92d86f7d03.jpg)\n\n整个GMV大屏是非常典型实时计算，每条交易数据经过聚合展现在大屏之上。从DataBase写入一条数据开始，到数据实时处理写入HBase，最后展现在大屏之上，整个过程的链路十分长。\n\n这就需要像Flink这样可以保持精确性、秒级延迟、不卡顿、在一个Job中聚合完成...等高性能的实时计算框架。\n\n**实时机器学习**\n\n![a3679751fad6956c538bc23736514204](//images.ctfassets.net/04k2xg9gplcj/4dyEn6Xhup1ghtNfSZVLVv/60589b7d5989dfa25ad32d1a74e13ad4/a3679751fad6956c538bc23736514204.jpg)\n\n机器学习一般有两个重要的组件：Feature 和Model。传统的机器学习使用批计算对Feature的采集和Model的训练，可这样更新频率太低，无法适应数据在不断变化的应用的需求。例如在双11时，商品的价格、活动的规则与平时完全不同，依据之前的数据进行训练得不到最优的效果。\n\n然而，采用了Flink实时收集Feature并训练Model，就能拟合出较为满意的结果。\n\n## 哪些岗位/公司需要Flink人才？\n\n几乎每个互联网公司都需要掌握实时计算的人才。因为如果没能拥有，就意味着在商业竞争中有被对手赶超甩开的可能。\n\n举个例子，在美国，如**AWS、Twitter、Uber....** 等公司，非常青睐具有Flink相关经验的求职者。\n\n![b29f21063c55587383e8318cf3ed4df9](//images.ctfassets.net/04k2xg9gplcj/7KMldSxmKHPcC2NYhdjo8f/fa0ed74350b47cba6d1fe854a31357c2/b29f21063c55587383e8318cf3ed4df9.jpg)\n![7dafa0d78fcec8f535d96e3459435230](//images.ctfassets.net/04k2xg9gplcj/6ZOw92EaLwalIpFhUpcVP7/75e398f53a3ecc36c5f2287e4bb442c6/7dafa0d78fcec8f535d96e3459435230.jpg)\n\n而在国内，除了阿里巴巴外，**腾讯、字节跳动、美团、饿了吗....** 都在广招有Flink经验的人才。\n\n![a6fd972e8a088c7b6ebfd596cf5eba36](//images.ctfassets.net/04k2xg9gplcj/6zvIA3JnunDYDizqDFoa4P/6c049b47658982404eac4200c6d5f812/a6fd972e8a088c7b6ebfd596cf5eba36.jpg)\n![a170c0ba67441442629c0b22198a1ebf](//images.ctfassets.net/04k2xg9gplcj/3lj7FvBrILIly4rvQUjCG5/f48e502e70c757e67ba1f930787b0ee4/a170c0ba67441442629c0b22198a1ebf.jpg)\n\n## 哪里可以学？\n\n来Offer人工智能与数据科学强化课程，全新推出 【Apache Flink流数据实时计算】项目：\n\n![60e15c55b7ffebe184ba42b7d5a3b521](//images.ctfassets.net/04k2xg9gplcj/7qXQz93IVQ97ri9wnG267x/88a98698cac629df1253c1d6ab5b96a8/60e15c55b7ffebe184ba42b7d5a3b521.jpg)\n\n除此之外，此课程还有多个project供你选择，助你攻破data求职所有职位！"}}},{"node":{"title":"北美程序员面试中最常见的27个面试题，拿走不谢！","path":"/en/news/2018-05-15-27-software-engineer-interview-questions/","node_locale":"en-US","id":"ec9117fc-835e-53e7-ac0e-21ae30e3c9ae","contentful_id":"5e5MSS0kVqQKqoY8qeIeWw","date":"2018-05-15T14:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Algorithm","onsite interview","software engineer"],"description":{"description":"北美程序员的面试不同于一般岗位的面试。当你在羡慕程序员十几万美金年薪的同时，你却不知道他们在应付面试时，要经历的重重磨难和压力。今天，我们就来总结一下硅谷程序员面试时最常见的27个面试题。"},"thumbnail":{"id":"b96c4c8c-d4cb-5d4b-94fe-bd965c68fff9","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/39V10iVomIsnaQc1FvmZ5P/81a390c6bf7287001be48529cca01db3/software-engineer-interview-questions.png?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/39V10iVomIsnaQc1FvmZ5P/81a390c6bf7287001be48529cca01db3/software-engineer-interview-questions.png?w=800&h=550&q=50&fit=fill 1x,\n//images.ctfassets.net/04k2xg9gplcj/39V10iVomIsnaQc1FvmZ5P/81a390c6bf7287001be48529cca01db3/software-engineer-interview-questions.png?w=1200&h=825&q=50&fit=fill 1.5x,\n//images.ctfassets.net/04k2xg9gplcj/39V10iVomIsnaQc1FvmZ5P/81a390c6bf7287001be48529cca01db3/software-engineer-interview-questions.png?w=1600&h=1100&q=50&fit=fill 2x"}},"thumbnailAlt":"Software engineer interview questions","authorProfile":null,"body":{"id":"8168c8d4-6647-562c-8925-a044e2b0a04b","body":"硅谷程序员的面试不同于一般岗位的面试。当你在羡慕程序员十几万美金年薪的同时，你却不知道他们在应付面试时，要经历的重重磨难和压力。今天，来Offer就帮大家总结一下**程序员面试时最常见的27道面试题。**\n\n## HR Phone Screen\nPhone Screen，一般是提交简历后，面试开始的第一步，由公司HR负责。目的是了解一下候选人的背景，为下一步tech interview做准备。\n\n常见问题如下：\n\n**1. 你为什么对本公司的这个职位感兴趣？**\n\n这一问HR主要想考察你有没有做好“功课”，事先研究了解过公司。\n\n**2. 你有没有用过本公司常用的编程语言？**\n\n如果你对这种特定语言没有太多的经验，那就说实话，否则就算过了电话关，也过不了之后的coding关。但你也要告诉HR你自己会的语言，并表示有能力学习新的语言。 \n![news: 2018-05-15-interview-1](//images.ctfassets.net/04k2xg9gplcj/7rRdkV3b7GcaG6WqgmyyAe/f676dd403422b5020acf48fc1627fb85/WeChat_Image_20180515101342.jpg)\n\n**3. 你有没有做过什么项目？**\n\n简明扼要。直接简洁地描述你参与过的项目和在里面扮演的角色。\n\n**4. 你有没有领导别人的经验？**\n\n这一题的答案不仅仅局限于技术上的领导力。如果你在学校里有过志愿者活动的领导经验，都可以说。 尽可能地将你以前的领导经验和你要申请的职位联系起来。\n\n**5. 为什么你要离开现在的公司？**\n\n你可以坦率地说出你的想法，但答案不要仅仅围绕在钱和利益上。你可以从职场文化、创意实践，解决现实问题的满意度等几个角度来回答这题。\n\n注意，跟HR的面试，并不需要你深入地探讨一些技术上的问题和经验。要做到简明扼要，不要让HR睡着了。\n\n\n## Onsite Interview \n\n当你顺利通过了HR的phone screen、或是之后的technical phone interview后，你有可能面临一个4-5轮的Onsite Interiew。面试官会从项目经历、行为、文化、技术、coding等几个角度来全方位了解候选人。\n\n## Experiential Questions\n**6. 在给其他团队成员reveiw code时，你觉得最重要的是什么？ **\n\n这题的答案没有明确的对与错，目的是为了检验你的知识，以及你是否可以表达好code review的过程。回答角度可以围绕：\n\n- Functionality\n- Readability\n- Maintainability\n- Security\n- Simplicity\n- Regulatory requirements\n- Resource optimization\n\n**7. 描述一下你写代码的全部过程。**\n\n面试官想知道你在写代码时，是否有一个清晰的流程，并确保你的工作方式是有组织的，而不是杂乱无章的。\n\n**8. 你做complex algorithms的首选语言是什么？**\n\n你可以说实话，但至少要给出两个答案，以表明自己“多才多艺”和“不钻牛角尖”。你可以说 “XYZ是我的第一选择，但ABC也是一个很好的选择。” 然后告诉他们为什么。\n\n**9. 如何设计一个可以扩大规模的APP？**\n\n这题测试的是你的知识和思维过程。\n\n**10. 你做过的最满意、最值得骄傲的项目是什么？**\n\n这是你表现自己的时刻，告诉面试官你的coding实力，并描述一个你最引以为傲的项目。一定说出理由，为什么你觉得这个项目让你骄傲 （比如它满足了某种需求等等）。\n\n**11. 描述一个你做过的失败的项目。**\n\n你可以清楚地说明为什么这个项目最终失败了。你还可以说你之后花时间剖析了这个项目，并且总结了问题，从失败中学到了经验。并在下一次项目中，没有再犯。\n\n## Cultural / Behavioral Questions\n\n**12. 你目前所在的公司，有什么吸引你的地方吗？**\n\n不要说，“没有，我讨厌现在的公司”。可以选择说一说目前公司和所申请公司共同的优点。如果这是你的第一份工作，你可以谈谈在学习或实习期间喜欢什么。 \n\n**13. 描述你理想的公司文化。 **\n\n做好你的research，提前了解这个公司。确保说出来的理想文化，和这个公司的文化相似。\n\n**14. 你的同事是怎么描述你的？**\n\n你可以通过这个问题来向面试官展示你的社交意识，你可以说通过与同事的交流协作，你了解到了自己在别人眼中的样子。同时，你可以用这个问题来表明你是有自我认知的。你知道自己的长处和短处，以及你能给团队带来什么。诚实回答，不要过度自嘲。 \n\n## Technical Questions\n\n这一类的面试题，会根据不同候选人的不同知识背景进行考核。\n\n常见问题举例：\n\n**15. mutex 和 semaphore 有什么区别？**\n\n**16. 什么是多线程编程？ **\n\n**17. Local Variable和Global Variable有什么区别？**\n\n**18. 哈希表如何工作？**\n\n**19. 给出一个真实生活中哈希表的例子，并描述一个哈希表为何是一个糟糕的数据结构选择。 **\n\n**20. 假设你有一个单线程的C标准应用程序，它不断崩溃，但从来不在同一个地方崩溃。你觉得可能导致它崩溃的原因是什么？**\n\n**21. queue和stack之间有什么区别？**\n\n**22. 什么是regression test？ **\n![news: 2018-05-15-interview-2](//images.ctfassets.net/04k2xg9gplcj/4GgwgINHu0i4MCgISUaWKo/2ab062268ca911826965de01c275f30a/WeChat_Image_20180515101732.jpg)\n\n## Coding Questions\n\n这个阶段是所有面试中最难的一关。你不仅需要在高压的环节中展示你的知识成果，而且你还要在不熟悉的环境（白板上的手写代码）和时间限制下工作。每个候选人会遇到的具体问题有所不同，但以下是一些常考的经典题目：\n\n**23. Linked lists（删除重复，反转链表，确定它是否有环） **\n\n**24. 时间和空间复杂度分析 **\n\n**25. Tree：基本构造，遍历和操作算法。知道如何实现平衡二叉树。**\n\n**26. Stack（用两个栈实现一个队列） **\n\n**27. 数组和字符串（反转字符串，permutations） **\n\n面试时，确保你不断向面试官解释你的思考过程（即使你被困住了）。 尝试着与面试官协作，并可以在遇到困难时勇敢地提问。因为这可以表明你愿意在团队中寻求帮助、以便把工作良好地进行下去。\n\n本文编译自：33 Common Software Engineering Interview Questions"}}},{"node":{"title":"硅谷的程序员, 入职第一天都在干什么？","path":"/en/news/2018-08-17-what-do-developers-do-on-their-first-day-of-work/","node_locale":"en-US","id":"0fa146c9-d7e8-55ab-8448-f28679b2d74f","contentful_id":"20gScRXEdaciaE8A84gWWi","date":"2018-08-17T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical"],"description":{"description":"正在求职或已经拿到offer在等待入职的你，是否会有以下好奇：初来乍到的新人程序员，第一天都在做些什么?公司会对新人进行怎样的培训？各大科技公司的培训风格又有什么异同？今天，就让我们一起来揭秘硅谷几大科技巨头 (谷歌/FB/LinkedIn) 的新人培训流程！一起来看看这些公司是如何将“新手”训练成“高手”的？"},"thumbnail":{"id":"568c5c65-c23a-5122-b1a3-8bed91fdc6af","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1QY2Illok468Iqggoq22GQ/6354d0ae13b15d1a1a42d13466ae3447/_________.jpeg?w=800&h=550&q=50&fit=fill","srcSet":"//images.ctfassets.net/04k2xg9gplcj/1QY2Illok468Iqggoq22GQ/6354d0ae13b15d1a1a42d13466ae3447/_________.jpeg?w=800&h=550&q=50&fit=fill 1x"}},"thumbnailAlt":"First Day at Work","authorProfile":null,"body":{"id":"34bf77bf-6450-5f07-88db-ed7499deff3c","body":"正在求职或已经拿到offer在等待入职的你，是否会有以下好奇：初来乍到的新人程序员，第一天都在做些什么?公司会对新人进行怎样的培训？各大科技公司的培训风格又有什么异同？今天，就让我们一起来揭秘硅谷几大科技巨头 (谷歌/FB/LinkedIn) 的新人培训流程！一起来看看这些公司是如何将“新手”训练成“高手”的？\n\n## Google:循序渐进，一切慢慢来\n\n描述人：Brain Bi，George Karagoulis\n\n在Google，人们普遍认为一个Noogler（New Googler）需要大约6到12个月才能真正适应公司文化并走上正轨。Google认为，新员工入职的前几个月，是需要对他们进行“投资”的，“投资”好了，新员工才能为公司创造更好的价值。入职Google时，新人orientation会持续两天。第一天到了园区，你会被要求验证你各种文件以及给工牌拍照，随后就是领东西和参加orientation讲座啦。Orientation结束后，还会有专人带你去你的工位，把你介绍给你未来的同事。\n\n入职的第1-2周，你的主要任务就是“上课”。公司会提供给新员工足够的时间参与Google的一些培训课程。头一周的课是强制性的，第二周开始后就不强制上课了，不过你的manager会告诉你哪些课是和你以后的工作内容有关的、哪些是无关的，你可以自行选择上课进修。例如，Google有两个后端的知名课程，一个关于搜索的，一个关于广告的。我的工作内容与Google Scholar相关，不涉及广告，所以我就只参加了搜索的那个课程。当然，课程也不仅局限于前两周才能上，只要你想，你可以一直学习、上自己感兴趣的课。只不过，每个课程都有自己的开课频率，有些频率高，有些频率低。\n\n![google入职](//images.ctfassets.net/04k2xg9gplcj/1fHnYYRPjWKIcOMaYMqasS/aae375704bfb32f567bcea070964503b/google______.jpg)\n\n总的来说，据肾上腺素一路飙高的Noogler普遍反应，进入Google的前两周实在是太闲了！课程和会议之间，你还有大把大把的时间去吃免费零食和上网闲逛。有的新员工竟吐槽说这太浪费时间了，我倒不这么认为，我觉得应该好好享受这两周的时光，因为后面都会忙起来的。\n两周后，差不多就可以开始正经的写代码了。\n\n所有的Noogler会先被分配去做“入门项目”，然后逐渐转向技术更复杂的项目（“真实项目”）。不过，“入门项目”和“真实项目”之间并无明显分界，为啥这么说？因为我的一个队友被分配了个所谓的“初级项目”，但上手后才发现，妈妈呀这项目比预计的要复杂的多，估计要干2年才能完成。至于我自己，我在入职的前一年半，分到的都是一些相当小的项目，后面才有了大项目的机会。\n\n此外，还有两点是新人们需要注意的：\n\n1）一些幸运的Nooglers会有导师带，有的Noogler却没有。有导师带的幸运儿，在开局的半年应该会幸福很多。当新人们不知道该做啥的时候，可以向导师咨询。（在前6个月，你可能会经常不知道自己该干些什么）。\n\n2）每个Noogler都可以用公款买三本书，当然了这三本书需要与你的工作内容相关，买的时候也需要你的manager批准。比如，有的Noogler可能想买“The Definitive C++ Book Guide”和“List Cover-to-Cover”。我当时买了Anthony Williams的“C++ Concurrency in Action”\n\n\n## Facebook:集中强化，刺激有趣\n\n描述人：Richard Feloni\n\n和Google“让新人从小项目干起”相反，Facebook让你进去的第一天就“做大事”。为期6周的“新兵训练营”（Bootcamp）可能是Facebook最有名的新员工入职体验了。这个bootcamp是干什么的呢？简而言之，就是一场新人工程师集体完成项目的大会。新人工程师们可以在bootcamp这六周内，随意进入Facebook的代码库，尽情了解Facebook的全部代码，从中找到自己感兴趣的方向，然后以小组为单位，一起在导师的指导下完成各种项目。bootcamp是一个新员工与公司双向了解的机会。\n\n此外，bootcamp不仅是一个培训的过程, 也是一个选拔排名和双向选择的过程。你这期间完成的task或者diff越多, 你越有本钱去选择自己喜欢的/有前景的组, 当然如果你表现出众，会有很多组来抢你。在bootcamp结束的时候，新员工基本上已经对公司的代码库、行事风格、工作上的小伙伴们有了一定的了解。Facebook Bootcamp文化已经存在了10年了，管理层一致认为bootcamp对新入职的员工有着深远的影响。FB的负责人说：“Bootcamp可以让工程师们能在第一天开始就认真的工作，而不是接受枯燥的标准化培训。”\n\n## Linkedin:四平八稳地帮你度过\n\n相比于Google和Facebook，Linkedin的入职过程就显得更为稳妥和中规中矩。没有Google那样不紧不慢、循序渐进的过程；也没有Facebook一上来就“做大事”的紧张，Linkedin则是选择了一个更为适中的节奏，去带领新员工完成好过渡期。\n\n在入职的第一天，新员工会遇到美国公司典型的破冰活动，各种便签纸啦，小组游戏啦...让大家预热。公司会借此向新员工介绍公司的愿景、文化，并鼓励大家讨论。一上午过的时间很快就过去了，紧接着就是Campus Tour和午餐。Linkedin会贴心地把新员工的午餐桌子用气球装饰起来，以免懵逼的新员工找不北。下午的活动大体就是高管们来聊天，分享公司的核心价值、自己一路的心得体会。他们还会开一个名为“Invest IN you” 的会议，会议以企业，医疗和经济利益等核心定位为主题。Linkedin认为，一般公司和医疗福利计划通常是员工入职流程中最容易被误解和沟通的部分。所以在这方面的解释和说明特别重视。\n\n![linkedin入职](//images.ctfassets.net/04k2xg9gplcj/31cyzrCs5aAksUCemSgKGe/4c7016e718a57b1e77da9de9068063aa/linkedin______.jpg)\n\n在完成第一天的各种活动后，新员工就能拿到期待已久的书包和电脑咯，电脑里已经安装了新员工所需的工具。当然啦，如果你还有啥电脑的事情搞不定，IT support team也会随时给你提供帮助。\n\n对了，在工作开始之初，新员工会收到一份电子版“新员工入职Roadmap”，不同部门的新员工的手册是不一样的，里面详细说明了每一周你可能会遇到的情况和工作指南。此外，HR部门也会提供新员工一个额外的入职Kit，里面有详细到每一天的计划，帮你在入职之初顺利度过过渡期。\n\n所以啊……硅谷的科技公司，在接待管理培训新人的时候，真的用心又负责。很多看似普通的环节，实际上都是精心策划过的。新入职之后的兴奋，会让你在参加完各种orientation和活动累的半死的时候，依旧觉得心满意足。这一天，你终于觉得所有的努力都值得。\n\n"}}},{"node":{"title":"知乎: Google、Facebook等一线公司面试时最看重什么？","path":"/en/news/2017-09-06-what-are-interviewers-looking-for-at-top-tier-companies/","node_locale":"en-US","id":"0a6ac308-1682-5272-8cb2-3f86047c37a8","contentful_id":"5boifg6VJmAgMK2yqwuowM","date":"2017-09-06T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical"],"description":{"description":"知乎上有这样一个问题：Google，Facebook之类的美国一线IT公司面试最看重什么？new grad cs专业在美国找工作，身边人很多都是题做出来了，但是还是没收到offer，相反有的题没做出来，反而被录了，说是交流问题等等，但是感觉大家（国人）口语应该差异也不会太大，就不知道除了刷题以外，还能做哪些准备呢？或者需要注意的地方希望过来人能解惑一二。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/1bImVSbSaIM4uamQ46YGYG/ffb32b25facf0e0edcd427b8fcf0bef7/team-member-1.jpg?w=400&q=50","srcSet":""}},"body":{"id":"9a6eb7f7-14e3-57eb-8953-aa49b46cd01d","body":"知乎上有这样一个问题：**Google，Facebook之类的美国一线IT公司面试最看重什么？**\n\n问题描述：new grad cs专业在美国找工作，**身边人很多都是题做出来了，但是还是没收到offer，相反有的题没做出来，反而被录了**，说是交流问题等等，但是感觉大家（国人）口语应该差异也不会太大，就不知道除了刷题以外，还能做哪些准备呢？或者需要注意的地方希望过来人能解惑一二。\n\n我曾是Google的主力面试官，从2013年起我做来offer，将包括LeetCode版主在内的1200名中国学生辅导进硅谷的一线公司。**对于怎么面试和如何准备面试，特别是顶级科技公司的面试**，我想聊一聊我的经验。\n\n**面试官真正想要的，是能够独自和与团队一起为公司解决问题的人。**写出了Code，答对了题，并不代表你Coding能力就强，即使Coding已经达到了标准，也不完全代表面试官就愿意选择和你共事。\n\n首先，**并不是写出了code，做到了基本的bug free，就代表你coding能力很solid。**以下是来Offer总结的比较有用的Check List：\n\n\n**Code本身：**\n\n- code写的对不对，是不是做到Bug Free？\n\n- 是不是能够处理所有可能的情况？\n\n- 有没有主动walk through几个test cases？\n\n- Code是不是用标准的格式来写的？\n\n- 结构是不是让别人能够很清楚的看明白？\n\n**沟通Code：**\n\n- 在写code之前，有没有主动的跟面试官沟通来明确题目要求，分析各种需要处理的情形？\n\n- 有没有考虑可能的环境和多种解决方案？\n\n- 有没有做必要的trade off的分析？\n\n- 如果你用到了某些数据结构和算法，有没有解释清楚运用这些工具的原因到底是什么？\n\n**Code优化方面：**\n\n- 有没有冗余的可以优化的代码？\n\n- 你给的答案是否是效率比较好的？\n\n- 能否主动继续分析优化方案？\n\n其次，**那种Coding能力不错，但是因为其他原因挂了的**，也太多太多了，几个典型的例子：\n\n例子1：\n\n面试官：The Candidate was **very quiet**. I need to probe him all the time. **I’m worried about his communication.**\n\n例子2：\n\n面试官：Do you have a bug here?\n\n应试者：（**想都没想**）”No! No! No! I disagree with you”\n\n例子3：\n\n面试官：Do you have any question for me for the last minute?\n\n应试者：You work in XXX department, right? I think there are quite a number of things that can be improved...（**喷了10分钟面试官的工作**）\n\n这些面试者有的是太安静被动，有的是太急于证明自己，最终都导致了面试的失败。所以说，Coding能力是很重要，但只是拿Offer的必要不充分条件。**如果说FLAG面试的完整攻略，还是必须要在Hard Skill和Soft Skill两个方面都表现出色。**\n\n**Hard skill方面**，主要考察的就是你的专业能力，包括Coding, Testing, Basic Data Structures & Algorithms和Design。\n\n**Coding：**\n\n- 能保证至少一门语言，不论是java还是C++还是Python，不会被面试官问倒。\n\n- 能够很快将复杂的问题转化成逻辑和代码。\n\n- 想到和处理可能的边界条件。\n\n- 写出的代码能够符合业界对格式、易读性和结构的要求。\n\n**Testing：**\n\n- 对于测试的要求大多为单元测试，因此要求工程师能够自己写test来验证代码的正确性。\n\n**Basic Data Structures & Algorithms：**\n\n- 能够深度理解各种数据结构和算法，对应选择高效的解决方案，并告诉面试官为什么。\n\n**Design：**\n\n- **Solution Design**：能够从工程的角度，考虑不同的需求和环境之下，不同的解决方案的tradeoff。\n\n- **System Design**：应该具有完整的知识体系和储备，熟悉计算机系统的基本知识，在复杂的情况下分析和解决对应的设计问题。基本知识概念包括操作系统、数据库、网络、web technology、分布式系统、多线程等等。\n\n虽然很多人都说New Grad不考Design，但事实上，FLAG这个级别的面试还是多少会有涉及，而且了解Design的知识，对于和面试官分析、解决问题有很大的帮助。\n\n**Soft Skill方面**，除了一个必须具备的Attitude，对于面试来说最重要的就是两个方面：Problem Solving和Communication。\n\n**Problem Solving：**\n\n- 要能够系统地、明确地观察问题，定义问题，分析问题，分解问题，最后找到合适工具来解决问题。\n\n- 还能够不断总结、优化、调整现有方案，多次迭代来找到更合适方法。\n\n这是一个非常重要，但也很容易被忽视的方面。所有的技术能力都只是用来解决问题的工具，而不是方法。\n\n**Communication：**\n\n- **Technical Communication**方面就是要有目的、有条理、有主次\n\n- **Non-Tech Communication**方面包括自我介绍、Behavior Questions、向面试者提问，以及其他所有的细节。这方面相对没有那么唯一的要求，但是自信、积极、尊重应该是一个普遍的标准。\n\n一样的题目，面试官可以选择给你提示也可以选择不给你提示。评分评价主观上，加减10%到20%轻轻松松。2.8和3.2一样吗？一个天上，一个地下。\n\n![qr-laioffer](//images.contentful.com/04k2xg9gplcj/cZMDJ3hbtC2mSsqIQMw42/8446fb463232289d08d82aab0a9fc896/qr-laioffer.jpg)\n\n更多求职干货请关注来Offer微信公众号查看"}}},{"node":{"title":"2018 Technology & IT Salaries in the US","path":"/en/news/2018-04-11-what-is-virtual-memory/","node_locale":"en-US","id":"852ca166-d75d-530c-abf6-423a53153a7e","contentful_id":"6s49MnTli8GK8y0K4Ea4ig","date":"2018-04-11T16:00-07:00","type":"news","subtype":"blog","featured":false,"categories":["Tech Trends"],"description":{"description":"我的工资和我同事相比，是高还是低？哪些城市和地区，给程序员的待遇最高？哪些行业和公司，付给程序员的薪水最高？哪些技术和岗位需求量最高？种族和年龄，会影响我的薪酬吗？\n\n如果你也对这些问题感兴趣，就快来看看美国的科技猎头公司Hired最新发布的《全美程序员薪水调查报告》报告吧！"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":null,"body":{"id":"e966500b-80b6-57d6-a427-331b0177ffa0","body":"我的工资和我同事相比，是高还是低？哪些城市和地区，给程序员的待遇最高？哪些行业和公司，付给程序员的薪水最高？哪些技术和岗位需求量最高？种族和年龄，会影响我的薪酬吗？\n\n如果你也对这些问题感兴趣，就快来看看美国的科技猎头公司Hired最新发布的《全美程序员薪水调查报告》报告吧！\n\n## 哪里的码农收入最高？\n\n### 宇宙中心硅谷又夺第一\n\n作为众多科技巨头（如Google，Facebook）的大本营，**湾区以平均年收入14.2万美金的成绩**，毫无悬念地蝉联了No.1。\n\n![news: 2018-04-11-IT-salary-report-1](//images.ctfassets.net/04k2xg9gplcj/41be2pYXfagIu2CO6YOS8s/58ac85a9cb484dda3703f0e15193375e/WeChat_Image_20180411100113.jpg)\n\n请注意，在本报告中，Tech Worker —— “科技工作者”的定义是指软件工程师，设计师，产品经理和数据分析角色。\n\n### 这些城市正在崛起！\n\n一些城市正渐渐能与湾区的高薪相提并论：\n\n1. Austin\n2. LA\n3. Washington DC\n\n在全球范围内，科技工作者的年薪平均涨幅为5%，已达到13.5万美金。**而Austin、LA和华盛顿DC**的工资涨幅已超过平均水平，增长了**6%~7%。**\n\n而在其它城市一片涨势中，**波士顿、Denver和巴黎出现下滑。**\n\n![news: 2018-04-11-IT-salary-report-2](//images.ctfassets.net/04k2xg9gplcj/5OEY2ZsUtaUE6sgQ0se8GE/1fe584bdbe52c0aa3f7ae6ed1b989337/WeChat_Image_20180411100256.jpg)\n\n## 哪里的码农最幸福？\n\n### 听，Austin和西雅图在召唤你\n尽管湾区为科技工作者提供了最高的薪水，但**湾区的“贵”也是出了名的。**\n\n如果其他城市生活成本都和湾区一样高，那这些城市的程序员应该挣多少钱，才能达到现有的生活标准呢？\n\n![news: 2018-04-11-IT-salary-report-3](//images.ctfassets.net/04k2xg9gplcj/44VayaBbKoUKY2w8SKkyiG/ce13822f472cba6736438275fa08aa0c/WeChat_Image_20180411100400.jpg)\n\n在调整后的薪资排行榜上，**Austin以年薪20.2万美元名列榜首。**这意味着，如果一名Austin的码农，想要搬到湾区，他每年需比现在**多挣70%**，才能维持目前的生活水平。\n\n考虑到住房、生活成本等压力，很多程序员表示，**西雅图和Austin，是他们最向往的地方：**\n\n![news: 2018-04-11-IT-salary-report-4](//images.ctfassets.net/04k2xg9gplcj/1nqyiGy3A4MSc0a6EGyA60/440dec13f42c46ca57fa9cfcbea44a8c/WeChat_Image_20180411100421.png)\n\n## 哪个行业的码农薪水最高？\n\n### 交通行业\n\n近几年，Uber、Lyft等出租车公司网络订车的服务越来越火，Google、Tesla、百度也在无人驾驶领域发展得如火如荼。\n\n这也就解释了，为什么**Transportation Technology类的公司，给程序员的待遇最好：**\n\n![news: 2018-04-11-IT-salary-report-5](//images.ctfassets.net/04k2xg9gplcj/2aukVDR4wsEYcAs8iy4W6u/dbbb3ddaa4e225ac0eeaf737344f8a39/WeChat_Image_20180411100447.jpg)\n\n而在今年，来Offer联手CMU、WUTSL共同推出了《无人车核心系统》课程，对无人驾驶技术感兴趣的朋友，不妨了解一下：http://laioffer.com/zh/courses/self-driving-car/\n\n## 什么技术和职位最火？\n\n### 公司最需要的技能\n\n![news: 2018-04-11-IT-salary-report-6](//images.ctfassets.net/04k2xg9gplcj/7dXGfjY7GoI6SquqcCiAMS/3495cb176ab90eb1d281ccc60ff8a78c/WeChat_Image_20180411100523.jpg)\n\n想提升自己的tech skills？不妨了解一下来Offer的《软件工程师旗舰核心》课程：http://laioffer.com/zh/courses/software-development/\n\n### 公司最需要招的职位\n\n![news: 2018-04-11-IT-salary-report-7](//images.ctfassets.net/04k2xg9gplcj/7Pa7nl3VTyCGwykG4kkm4/d0a752784071c6b4b12ccf471c12a58d/WeChat_Image_20180411100547.jpg)\n\n对这些职位感兴趣的朋友，不妨了解一下来Offer的《全栈开发项目实践课程》课程：http://laioffer.com/zh/courses/full-stack-development/\n\n### 产品经理赚最多\n\n![news: 2018-04-11-IT-salary-report-8](//images.ctfassets.net/04k2xg9gplcj/6z4Jt1deiQwW8mUCeo44U0/64f2a29ec0a2de6ce944356666a57f8d/WeChat_Image_20180411100607.jpg)\n\n虽然总体来说，科技工作者的平均薪资报价继续上升，但并非所有技能组合都是平等的。\n\n作为“程序猿”天生的“宿敌”，“产品汪”的平均工资为14.5万元，比程序员高出了1.3万。\n\n\n## 种族和年龄对工资的影响？\n\n### 亚裔收入排第二\n\n从Hired平台上收集的自愿种族统计数据来看，白人从业者的工资最高，而黑人从业者的工资最低。\n\n![news: 2018-04-11-IT-salary-report-9](//images.ctfassets.net/04k2xg9gplcj/6k1r2ELkpaCoke8GkWw0KA/12a4dd78964f1e5c27ddebe37e4e81f9/WeChat_Image_20180411100643.jpg)\n\n不过我们也发现，所有employee都普遍低估了自己的市场价值。\n\n### 职业生涯中期收入最高\n\n![news: 2018-04-11-IT-salary-report-10](//images.ctfassets.net/04k2xg9gplcj/2npOtBGJ0YsGWKgkq80wiq/cc7994f1a5151eb7f58238bb5b279b8d/WeChat_Image_20180411100659.jpg)\n\n科技工作者的薪水在40岁中期达到高峰 —— 15.1万美元，随后的“报价”稍有下降，并会一直在15万美元左右徘徊，直到退休。\n\n另外，年轻的20-34岁的求职者，也许因为缺乏谈判经验，他们拿到的工资，比公司实际愿意offer他们的工资要低得多。\n\n来Offer的《软件工程师旗舰核心》课程，也提供薪酬谈判服务，感兴趣的同学不妨了解一下：http://laioffer.com/zh/courses/software-development/"}}},{"node":{"title":"Virtual Memory 究竟是什么?","path":"/en/news/2017-05-17-what-is-virtual-memory/","node_locale":"en-US","id":"9e8a9445-93e2-5c57-ae0a-77b9714033db","contentful_id":"9E9mFrvzTUCMcCKSM2AAG6","date":"2017-05-17T00:00+00:00","type":"news","subtype":"blog","featured":true,"categories":["Algorithm"],"description":{"description":"最近有不少转专业的同学问我们说尽管大家已经学会了很多数据结构和算法的知识，可是每当见到一些计算机系统方面的名词术语还是一头雾水。于是我们打算写一些专题文章，帮助本科不是计算机专业的同学快速了解一些计算机系统的基本概念。今天先来讲讲Virtual Memory"},"thumbnail":{"id":"08453a55-2a6d-5067-9758-9744e6a0f336","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/30xLEi89n2Ik6u4Okai0E6/e6b347f7e3e0f3d4325349d0a1461ad9/technical-003-1.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":"Kids are using computer with their instructor in a classroom.","authorProfile":null,"body":{"id":"a8ada378-154c-5d1b-b958-61871137cd47","body":"最近有不少转专业的同学问我们说尽管大家已经学会了很多数据结构和算法的知识，可是每当见到一些计算机系统方面的名词术语还是一头雾水。于是我们打算写一些专题文章，帮助本科不是计算机专业的同学快速了解一些计算机系统的基本概念。今天先来讲讲**Virtual Memory**。\n\n**Virtual Memory（虚拟内存）**，顾名思义，是针对**physical memory（物理内存）**来的。\n\n远古时期的计算机（五十年前的大型机或者三十年前的个人电脑）是不用虚拟内存的，那时候要想跑一个程序，必须先把整个程序加载到物理内存里才能执行**可是内存又小又贵，而人们不仅想跑大程序，还想同时跑好几个，有限的物理内存吃不消了可怎么办呢？**\n\n![technical-003-1](//images.contentful.com/04k2xg9gplcj/30xLEi89n2Ik6u4Okai0E6/e6b347f7e3e0f3d4325349d0a1461ad9/technical-003-1.png)\n\n于是人们想到了**虚拟化**。\n\n(注：其实不仅是虚拟内存，广义的虚拟化概念可以解决许许多多的计算机问题，比如大家常用的 virtual machine, virtual file system, VPN 等等都是虚拟化在各个领域的应用。)\n\n简单来讲，**虚拟内存就是让每个进程看起来都好像拥有一个大而独立的地址空间**。\n\n什么意思呢？我们一个词一个词来讲。\n\n首先说什么是**地址空间（address space）**。计算机的内存说白了可以想象成一块连续的数组，数组里面的每个字节都有一个唯一的地址。比方说我新买的（键盘手感巨烂的）电脑有 16GB（即 2^34 bytes）的物理内存，那它的物理地址空间就是 {0, 1, 2, ..., 2^34 - 1}。\n\n接下来再说**大**。**就是说不管我实际的物理内存有多大，虚拟内存都可以假装有很大。**比如我的电脑号称是 64-bit 的，也就是说我电脑上跑的每一个进程都以为它拥有一块 {0, 1, 2, ..., 2^64 - 1} 的虚拟地址空间。那要是物理内存不够了怎么办？我们可以把虚拟内存看作一个缓存的工具，正在使用的部分放在物理内存里，暂时不用的部分就扔在磁盘上好了。独立的意思是说尽管每个进程的虚拟地址空间长得都一样，但它们都是私有的。**不同进程的同一个虚拟地址可以映射到不同的物理地址。**例如，所有 64-bit 程序的代码都是从内存地址 0x400000 开始的，然而不同程序其中的内容是不一样的。这就好比说吕老师住了个Town House，隔壁是孙老师的Town House，尽管这两栋房子的外观设计一模一样，但吕老师家门口挂了幅盗梦空间的海报，而孙老师家同样的位置是这样一张风景画：\n\n这是怎么实现的呢？简单来讲，系统把虚拟内存和物理内存都划分为等长的 page（页），并为每个进程维护一个 page table（页表）用来将虚拟页映射到物理页。**这样当我们访问一个虚拟地址时，系统就可以通过查表将其翻译为物理地址。**如果这个地址所在的页当前不在物理内存中，则系统会先将它从磁盘取出来替换掉内存里另一个暂时不用的页。整个过程是由操作系统和硬件协同完成的，这里不再赘述，感兴趣的同学可以参考任何一本操作系统教材。\n\n<div class=\"blog-image-container\">![](images/blog/technical-003-3.png)</div>\n\n虚拟内存让进程的链接和加载、共享和分配内存、访问权限控制等都变得很容易。连续的虚拟页不必要在物理上连续，而不同的虚拟页也可以映射到同一个物理页。举个简单的例子，几乎所有的**C语言程序**都会用到**printf函数**，于是我们在物理内存中可以只有一份printf的实现，而让各个进程对应的虚拟页全都映射到同一个物理页即可。\n\n最后我们来简要讨论一些同学们在写程序时常犯的和虚拟内存有关的错误（以下以 C 语言为例；Java 也会相应地报错或抛出异常）：\n\n**1\\. 访问空指针或坏指针。**比如指针指向的虚拟地址并没有映射到实际有意义的数据，或者我们试图去写一块只读的虚拟内存区域，都会导致 segmentation fault。\n\n**2\\. 访问未初始化的内存。**如果一个局部变量没有初始化而我们误以为它是零，程序的结果就会不对。\n\n**3\\. 缓冲区溢出（buffer overflow）。**例如一个函数的输入参数是一个字符串，函数里有一个固定大小的 buffer。如果我们没有检查该字符串的长度就将它拷贝到 buffer 中，一旦输入字符串超出了 buffer 的长度就会造成 buffer overflow，从而覆盖掉其它有意义的数据。\n\n**4\\. 缓冲区溢出有一个特例是所谓的 off-by-one error，也是同学们常犯的错误。**一个长度为 n 的数组 index 是 0 到 n-1，此时如果访问 index 为 n 的元素就越界了，会读到甚至覆盖掉别的数据。\n\n**汤老师**\n\n来offer王牌讲师之一。清华大学计算机系信息学竞赛保送生，美国哥伦比亚大学计算机系软件系统实验室博士生，曾在 OSDI、CACM 等操作系统领域最顶级学术会议和期刊上发表多篇论文。曾参与 Chrome 和 Google Cloud Platform 的研发工作。\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"来Offer独家习题讲解 | 如何找到匹配的对象？","path":"/en/news/2018-02-27-contains-duplicate/","node_locale":"en-US","id":"6f930e95-672f-5a68-846c-11dea065beff","contentful_id":"1XZQnm7NV2QCyGISMQgeuC","date":"2018-02-27T00:00-08:00","type":"news","subtype":"blog","featured":true,"categories":["Algorithms"],"description":{"description":"今年各大厂收紧招聘名额，面试bar也自然水涨船高。往年简单的2sum，3sum拿offer已经不复存在，只靠刷题背代码，是完全无法抵挡面试官层层递进的追问的。今天就从一个简单的contains duplicate问题开始，看看针对一道简单的问题，面试官是如何一步步follow up到让人防不胜防。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"bcce3350-3a7e-5648-8048-3bde90421382","body":"今年各大厂收紧招聘名额，面试bar也自然水涨船高。往年简单的2sum，3sum拿offer已经不复存在，**只靠刷题背代码，是完全无法抵挡面试官层层递进的追问的。**不信？咱们从一个简单的问题开始，看看**针对一道简单的“找对象”问题，面试官是如何一步步follow up让人防不胜防。**\n\n## 问题1：热身题\n\n同学初来乍到容易产生面试综合症（手心出汗，交流困难），这时候nice的面试官一般会给个非常暖心的warm up question来缓和下气氛，提高面试者竞技状态。比如下面这题：\n\n给一个整数数组，问是否包含重复的数字。\n比如 [1, 3, 10, 5, 2, 1] 中包含了重复的数字1，返回true。\n\n## 解答\n\n相信同学看到之后都是一阵窃喜，如此简单。确实，这题就是让面试者放下压力，但是，简单并不意味着每个人都可以回答得让面试官impressive。\n\n对于这题，大部分同学直接会说HashSet去重。但是如果仔细想想我们其实忽略了很多条件。比如这个数组是否排好序？\n\n- 如果排好序，非常简单，for loop依次与旁边元素比较，完全不用HashSet。\n- 如果没排好序，那么有多种选择：一是可以先排序，回到上一种解法。二才是使用HashSet。\n\n说完这些后还并不够，主动分析各种解法利弊才是让面试官印象深刻的利器。从时间复杂度空间复杂度分析每一个solution:\n\n**解法一：先排序，后遍历**\n\n时间复杂度：O(nlogn) 排序时间 + O(n)遍历一次\n空间复杂度: O(1)\n\n**解法二：HashSet**\n\n时间复杂度：O(n)\n空间复杂度：O(n)\n\n可以看出解法二虽然时间上貌似非常快，但牺牲了空间，尤其是如果HashSet可以使用的内存非常有限（比如嵌入式系统内存非常少），那么它的hash冲突频发会造成性能急剧下滑。\n\n一道最简单的题也能答出天差地别的层次，只有把这些技术细节分析到位才能体现出与其他candidate的不同。\n\n## 问题2：进阶题\n\nwarm up结束开始动真格的了，但一个优秀的面试官会让问题有连续性，也就是俗称的follow up，能否完成这题将决定是否见到大boss。针对这个找对象的问题的followup，往往是在上一题的基础上增加限制条件：\n\n重复数字的定义不再是数组内重复的两个数字，而是一定index范围内重复的两个数字，index超过这个范围则不算重复。\n比如[1, 3, 4, 1, 5]，index距离 k = 2，则该数组没有重复。因为第一个1和第二个1的index距离 = 3 - 0 = 3，超过了k。\n反之如果输入是[3, 4, 1, 5, 1]，k = 3，则该数组有重复。因为第一个1和第二个1的index距离 = 4 - 2 = 2，小于等于k。\n\n## 解答\n\n**解法一：naive解法**\n\nnaive的解法是每看到一个数的同时遍历周边k个元素，当然时间复杂度也是非常糟糕的O(n*k)。有没有更好的办法？\n\n**解法二：HashMap解法**\n\n不少同学会想到用HashMap记录value和对应的index。这样当遇到一个数x，那么只需查找：\n\n- Map是否已经有x\n- 原有的x对应的value（也就是index）是否与当前index距离在K以内\n\n这个次优解的时间复杂度O(n)，空间复杂度O(n)，比之前的naive solution提升不少，但是还有可优化空间。\n\n**解法三：Sliding Window解法**\n\n更优化的解法，是采用经典的sliding window，window长度是K。只需要把该window区间内的数字扔进HashSet，如果出现已经存在的数字则返回true。\n\n同步移动fast（代码中的i）和slow（i - k）同时更新set。添加新遇到的current index i的数（也就是fast指针），删除已经不需要的index为i - k的数（也就是slow指针）。具体代码如下\n\n![blog-2018-02-27-01](//images.contentful.com/04k2xg9gplcj/4HjWCvmACkQKEoea2Geiag/a01d27865018a2750ff5ba76b2a886ad/1.png)\n\n时间复杂度: O(n)\n空间复杂度: O(k)\n\n## 问题3：终极大boss\n\n最终的这个follow up 就是决定strong hire还是weak hire的关键性一轮。一个strong hire顶3个weak hire这是各家大厂的潜规则，大家来挑战下？\n\n在第二题的基础上再增加一个限制条件：value绝对值差在v以内都是重复数字。\n也就是说，如果两个数字绝对值差小于等于v，且index差小于等于k，则属于重复数字。\n比如 [1, 20, 5, 30, 40]，v=5，k=3，那么应该返回true。因为数字1和5是绝对值差小于v且index差小于k。\n\n## 解答\n\n**解法一：引入balanced binary search tree**\n加入一个value的限制让题目难度跃升一个level。但毕竟这还是一个follow up，所以我们可以在延续上一题的解法的同时加入新的算法。那么在k个元素内怎么知道是否存在value difference在v以内的数字呢？\n\n这里我们可以转换下思维，如果存在与当前数字x绝对值差在v以内的数字，那么一定落在[x - v, x + v]这个区间，如果一个范围内其他数字比当前x小的最大值和比x大的最小值都不在这个区间内，那么就不存在任一数字与x绝对值差小于等于v。\n\n这时候想到一个经典的binary search。如果是一串有序的数组，那么找到minimal largest与biggest smaller number都只需要O(logn)时间复杂度。所以，这题的一个解法就是引入balanced binary search tree，让已经遍历的数字保持有序的存在BST中。\n\nJava里的TreeSet就是一个balanced binary search tree，完美符合我们的要求。代码如下：\n\n![blog-2018-02-27-02](//images.contentful.com/04k2xg9gplcj/4ch4DEPoGkiA0a2smIcOyU/a0b5e77f72dbe673f195b424feb226af/2.png)\n\n这个解法的时间复杂度是O(n * logk)\n\n**个性解法**\n\n上面这个解法的时间复杂度已经优化到了O(n * logk)，但追求最优解的我们还可以想想是否有办法做到O(n)。答案是利用bucket。用v来作为bucket的value区间。\n\n比如给定数组[1, 5, 6, 20, 30]，k=4，v=4。value之间最大差值v是4，我们可以想想如何知道两个数字是否满足这个差值条件？\n\n在这个hint下我们发现bucket这个概念正好可以用得上。如果一个bucket代表的区间的最小值最大值确定不超过v，那么任意落入同一个bucket的两个数字一定满足差值小于等于v。所以，每一个bucket代表区间的长度是v+1。所以这个bucket的建立就是：[1, 5],[6,10],[11,15],[16,20],[21,25],[26,30]。最小值1与最大值30确定了整个bucket的范围。\n\n怎么利用这个bucket？\n\n遍历整个array，数字1对应bucket[0], 数字5对应bucket[0], 数字6对应bucket[1], 数字20对应bucket[3], 数字30对应bucket[5]。如果有两个数字被映射到同一个bucket（比如数字1和5）且他们的index差在K以内，那么返回true。\n\n还有一种容易被遗漏的情况是数字5和6，他们也满足了条件但是不在一个bucket。所以我们为了避免这类情况必须要check自身bucket以及左右相邻两个bucket。\n\n**注意点：**\n\n这个解法还有一个关键在于用什么数据结构来表示这些bucket。假如利用一个array来表示所有的bucket的话，每个index对应的元素应该表示落在index这个bucket里面的数(每个bucket里面最多只有一个数，否则在size为k的sliding window中就会出现重复数字)。\n\n虽然这个解法理论上可以达到线性时间复杂度，但是bucket的建立可能带来非常大的cost。试想，如果这个array的数字跨度特别大，V比较小，那么bucket的size会近似于max_number - min_number，完全可能是array size的指数级。\n\n![blog-2018-02-27-03](//images.contentful.com/04k2xg9gplcj/SDi58n9se2umsOGOaG2CI/b259fe682c07392fbae8900f1d98e54a/3.png)\n\n时间复杂度: O(n)\n空间复杂度: O((max_number - min_number) / (v + 1))\n\n但是，在这个解法的基础上我们还是可以通过观察进行再一步的优化，从而把空间锁定在O(k)，具体的方法留做作业大家思考一下。\n\n**重要提示：**如果一个bucket中并没有任何数字落在里面，我们是否需要真的记录这个bucket并给它分配空间，可不可以利用其它的数据结构来记录每个bucket的情况。\n\n## 总结\n\n其实每种解法都有自己的利弊，面试重要的不是最优解，而是在寻找最优解的过程中体现出的系统性逻辑性思维与扎实的数据结构算法知识。"}}},{"node":{"title":"西北大学来Coder Club学长学姐私享会","path":"/en/news/2017-07-08-north-western-coder-club-alumni-private-meetup/","node_locale":"en-US","id":"3e4649e4-e0ef-5be2-9c8c-1764e731323f","contentful_id":"9E9mFrvzTUCMcCKSM2AAG17","date":"2017-07-08T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"Tian Zhang：14年fall西北大学的学生，现任Snap软件工程师。本科专业EE，有少量硬件编程基础。14Fall进入西北EE Master项目，第二个quarter转入CS专业。16年6月入职Snap，17年1月升级。日常工作为web + data，搭建对内&外的工具，主营后端。"},"thumbnail":{"id":"1fe75570-216e-53ee-bfe0-d3e983cedd38","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":null,"body":{"id":"bf09f34a-f3d5-54e6-9084-1f6dabe8c045","body":"Tian Zhang：14年fall西北大学的学生，现任Snap软件工程师。本科专业EE，有少量硬件编程基础。14Fall进入西北EE Master项目，第二个quarter转入CS专业。16年6月入职Snap，17年1月升级。日常工作为web + data，搭建对内&外的工具，主营后端。\n\nEE转CS有什么学习心得？\n\n如何了解大公司的职位信息？\n\n在美国公司如何快速晋升，\n\n突破天花板？\n\n——学姐做客西北大学来Coder Club为学弟学妹指点迷津\n\nClub小助手：学姐好！首先想请问学姐，你当时在找全职工作的时候有实习经历吗？没在美国实习过是很大劣势吗？\n\nTian：西北大学的学弟学妹们好！第一个问题就有些伤感:P 我当时也试图在美国找实习，后来没找到，只好回北京找了一个小公司实习。但不管怎样，还是建议大家去实习，因为面试的时候，面试官拿着你简历，最好的开始就是谈一谈你实习做了什么。你在实习中做的Project或许不怎么fancy，这也很可能是因为Manager不给你好的Project，不必担心。我也明白找实习的确是挺难的，比如像我自己就没有找到。我想告诉大家的是，并不是没有实习就一定找不到工作。比如，你可以自己做几个Project——找不到实习，那就靠自己。或者你的数据结构算法足够强，这个也可以弥补没有实习经历的劣势。\n\nClub小助手：学姐这么一说，应该会让担心自己缺乏实习经历的同学们稍微松一口气了。这里有一位同学问，往前端和全栈方向发展的话除了算法还要准备什么呢？面试会考些什么？\n\nTian：我是主后端，虽然也做一些全栈，但我可能不能非常好地回答你这个问题，仅仅说一下自己的看法吧，毕竟也和组里很多做前端和全栈的人共事。 前端，我觉得可能就属于**入门容易，成为大师非常难**的那种；可能谁都能做，但是做得好很难。我们组的一个Senior，写得框架全公司都通用，非常厉害。如果你想要往这个级别发展，还是会很有前途的。根据我的了解，前端工程师在面试时会被要求现场搭一个东西，这是一个前端的面试官跟我说的。面试官会告诉应聘者需要搭建一个怎样的网页，你现场就得搭出来。至于如何准备，我觉得最好的办法就是自己做一个fancy的网站然后甩他一脸。因为前端不像数据结构算法这些，可以出个题然后讨论。当然全栈的话肯定涉及后端的问题，这些会考察的**数据结构以及算法知识**都是一样的。 我觉得作为一个软件工程师，不管你是做什么的，考考这些基础内容都不过分。所以这方面知识还是要巩固的，不能丢下。\n\nClub小助手：下面这个问题是小助手本人最关心的！学姐仅半年就在snapchat升了一级，你觉得获得快速晋升的要诀是什么？什么样的品质是求职发展必不可少的？\n\nTian：这个快速晋升，其实我觉得算不上多么了不起的成就，要说原因，主要可能还是我比较努力吧。另一方面，除了埋头干活，我比较喜欢想事情。比如大部分刚进来的new grad就是让你修修bug，给senior打打下手。然后可能就会让你自己做一个项目的一部分让你慢慢独立；当你能独立做项目的时候，再给你升一级。我刚开始也是从修bug开始的，但这个过程也能体现你的能力。你可以在这个过程中问一些有价值的问题，比如：我们system为什么要这样构建，而非那样的方式？或者你可以提出这个方法比那个方法更好，值得一试。 很多时候，因为资料尚浅，你的很多想法未必是对的，但这都是你的上司能理解和体量的，同时他们也会开始考虑是不是可以给你安排一个更难的项目。当时由于某些机缘巧合的原因，我刚进Snap没几个月，Manager就让我独立写一个项目。 当时他的设想是所有的布局构思都由他和一个senior做好，我只需写code就行。然而我觉得还是有点不甘心。于是有一次，他们俩还在讨论一个还非常模糊的构思的时候，我自己花了点时间，把每一步都画成流程图非常清晰地设计出来，包括一些他们没有想到的细节。这其实并不难，只要你愿意自己去琢磨，都能把问题想清楚。我就在组会上**主动把我的方案提出来**，问他们这样行不行。Manager给了我展示的机会，让我能够讲解自己的思路。当然我的方案有很多毛病，但这已经比你自己埋头干活要强太多了，而且Manager他们也给我提了许多中肯的意见。所以，学会**提出自己的想法**是非常重要的。\n\nClub小助手：说得太好了！那学姐对自己以后的工作发展会有什么样的打算呢？有什么好的职业发展建议给这些即将入职的CS的学弟学妹吗？\n\nTian：对于我自己的职业发展，我就简单说一说。我现在的公司是Snap，我非常喜欢我的工作，也非常喜欢洛杉矶这个城市。我也非常幸运经历了Snap从Startup变成上市公司的过程。我承认在IT公司三五年跳个槽很正常。不过我觉得未来两到三年内，我还会在这里，但我会transfer一下不同的组做一做尝试。 我现在对后端data比较感兴趣，但毕竟我们公司的主要产品是mobile app，所以也可能去app组，总之就是多多尝试。相对于做一个level 比较高的engineer ，我还是更喜欢做一个Manager，因为尽管我也喜欢技术，但更喜欢和人打交道。\n\nClub小助手：学姐关于事业发展的见解对我们的启发特别大！不过就像你说的，技术过硬和坚持不懈的努力是前提和基础。那么根据面试以及这一年多的工作经验，学姐对在校学生有没有什么课程推荐？\n\nTian：因为我自己是EE转CS，从转专业的角度来说，**数据结构与算法**是最最最重要的，就算是旁听都得学完。此外Computer System也是必不可少的。其他的就是一些技能的课，以及操作系统课也很不错，学有余力的同学可以考虑。\n\nClub小助手：西北大学来Coder Club中大部分学生都将在今年12月份毕业，对于这些同学来说，投简历的黄金时间是什么时候呢？\n\nTian：无论你会在什么时间毕业，**8月底至12月上旬都是大公司招聘new grad的黄金期**，这个时期内投递简历是比较容易获得面试机会的。而等到12月底到来年1月初，由于HR们大都在放假，所以很少给出面试邀约。等到1-2 月份，也会有一批面试，但到了3月份，只有少数公司如Amazon还会继续招人了。尽管时间紧迫，仍然要告诫大家**一定要在自己准备好后再投简历**，随意申请最后把自己搞在冷冻期里就不好了。 而且，即便9月-11月是招聘的黄金期，公司其实是全年都在招人的，我的同学们在几月份拿到Offer的都大有人在。\n\nClub小助手：那么学姐在工作面试中有哪些技巧？如何正确与面试官沟通？如何博得面试官多一些的好感？\n\nTian：首先想要建议大家，面试时少一些套路多一些真诚。 不要太在意所谓的tips或者技巧，要关注在如何从各方面提高自己，把自己打造成招聘者想要的人。面试一般考察非tech和tech两个方面。 非tech方面，语言是最重要的工具，大家必须提高自己的交流能力，无论是中文和英文。因为工作的关系，我现在也经常需要面试求职者。我发现很多美国年轻人和人交流时，会让人有种很愿意和他们聊天的感觉。而很多中国学生在这点上就很吃亏，感觉我向他们搭话时他们都没有积极的反应，这样面试官要如何对你另眼相看呢？因此，想要面试成功，首先就要让自己变成一个**善于和别人主动沟通**的人。面试中的Behavior Questions其实是最好准备的，2天或1周的时间就可以把所有典型问题都准备一遍。 我当年是这么准备的。首先，不要写稿，保证交流的自然。在准备时，可以对着镜子说，边说边观察自己的表情和态度。如果能打动你自己，就一定可以打动面试官。我认为整个面试的过程就是交流能力的体现，包括在技术部分；**只有表达得到位，才能让别人知道你的能力。**\n\n在技术面试阶段，面试官可能给你一个比较大的问题，暗藏了很多坑，这时候就要看你如何和面试官沟通，找到这些坑，并把这些坑填上。找到问题之后就要开始写代码了吗？并不是。一定要Think loudly，让面试官知道你在想什么，怎么想的，这点非常重要。 比如面试官问了一个问题，你可能想出来一个n^2的方法，这时候你一定要说出来你有一个n^2的解法是什么样的，并且你也知道这不是最好的，正在继续思考。面试官在了解你的想法后，可能会指点一二，帮助你找到更好的解法。如果面试官觉得你的想法还不错，你就可以开始写code。这时候也需要换位思考：如果有人一下扔给你好几千行代码，你肯定不会有耐心看。所以面试的时候要边说边写，把逻辑思路告诉面试官。 例如，我现在要实现什么，需要包一个函数，一定要把自己的思路介绍给对方。写完之后，试官可能会让你Debug，分析下时间复杂度什么的。因为复杂度也就那么几个，有的同学会猜，这恰恰是面试的大忌！千万不要猜答案，要把自己分析思路说出来。总之，我觉得硬实力是最基础的，但是软实力即沟通能力并不比硬实力的重要性低，希望大家注意。\n\nClub小助手：谢谢学姐为我们还原一个真实的面试场景！对于还没有拿到面试机会的同学来说，找内推是他们关注的重点。请教学姐，内推对找工作或实习的帮助到底有多大？作为一个在校学生，怎样才能找到可靠的内推？\n\nTian：这个问题的答案取决于目标公司，内推人，以及何时内推。普遍来讲，**有内推还是比自己找工作好太多！**大部分内推会让推荐你的人写段话，了解你的人会写的比较详细，这可能会非常有用。我有一个很厉害的学弟应聘Snapchat，找我做内推。一开始，不知道出于什么原因，他的简历居然被刷下去了，连面试机会都没得到。我知道以后就去找HR说，这是我认识多年的学弟，他的确很优秀，应该给他一个面试机会。最后HR同意了我的请求，把他的简历“捞”了上来，而我的这位学弟顺利通过了面试并拿到了offer。所以说熟人内推，可能是你和这个公司建立联系的最好方式。\n\n在找工作时，我在我想进的大公司都找到了自己的校友。对于这点，我觉得大部分同学刚来美国，人脉很少，来offer就是获取内推资源的绝佳平台。我在来offer上课期间，不仅老师帮我内推了不少公司，同学之间也会相互帮助推，可以说**在来offer，你想去的公司都会有同学可以作为你的推荐人。**\n"}}},{"node":{"title":"数据科学求职讲座总结: 认清两大误区, 牢记五大对策！","path":"/en/news/2017-08-11-data-scientists-job-hunting-tips/","node_locale":"en-US","id":"660a822f-6a38-506d-bac1-3e6e43883cba","contentful_id":"9E9mFrvzTUCMcCKSM2AAG23","date":"2017-08-11T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"在昨天的**数据科学就业讲座**中，Jason老师就湾区最近一年来数据科学行业的现状做了一个简单的概括。讲座中，Jason老师对同学们在找工作中的两大误区以及五大对策做了全面的分析。"},"thumbnail":{"id":"e879b5aa-140a-529a-ba5b-2decc30234a5","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1KHtAjCFOsUccyMKim0KCI/c0a4220ad652143096de35af927ad4b8/career-036-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"c864471c-bfb1-56d2-a761-5f3224039f8a","body":"在昨天的**数据科学就业讲座**中，Jason老师就湾区最近一年来数据科学行业的现状做了一个简单的概括。讲座中，Jason老师对同学们在找工作中的两大误区以及五大对策做了全面的分析。\n\n**两大误区**\n\n**误区一**\n\n同学们的找工作中的第一个误区就是过分依赖刷题。有的同学总想着在面试前找一些机经面经的题目刷一刷。但是，很多情况是找不到合适的机经面经，或者，即使找到了相关的题目，却没有非常好的答案或者答案不全面，这反而增加了同学们找工作上的困扰。\n\n**误区二**\n\n第二个误区则是和基础知识有关。很多同学在面试前想要巩固一下基础知识来提升自己的能力。但是打开资料一看，发现要记忆的公式很多，难以记忆。对于面试的时候会考察什么公式，提问什么内容，对知识的深度角度和广度都不了解。在这样没有复习方向的方向下复习会做很多无用功。\n\n**五大对策**\n\n**第一，要了解职位的要求**\n\n![career-036-01](//images.contentful.com/04k2xg9gplcj/1KHtAjCFOsUccyMKim0KCI/c0a4220ad652143096de35af927ad4b8/career-036-01.png)\n\n在图上，我们可以很清楚看到根据不同能力情况，所对应的职位也不一样。\n\n**第二，要有丰富项目经验的简历**\n\n很多同学在写自己简历的时候描述太过于学术，这其实对于找工作是不利的。对此，Jason老师建议大家使用三点论的方式来描述自己简历里面的项目。\n\n**第一部分，讲故事。**要说做了什么事情，解决了什么问题。\n\n**第二部分，描述模型。**要说自己用了什么样的模型什么样的方法解决什么样的问题。第三部分，写效益，要说最后的结果如何，对公司效益有了怎么样的提升，对自己的雇主产生了什么样的收益。这样的三点论述才能让HR了解你是否能用你的知识解决实际上的问题，毕竟学员们要竞聘的是公司的职位，而不是在实验室里面的工作。\n\n**第三，Coding能力**\n\n数据科学方面的职位专注的是对基础知识内容的掌握，虽然对Coding能力方面并没有特别硬性的要求，但是对Coding的基础还是要有非常充分的理解才行。不过在面试中遇到的与Coding相关的问题很多还是经典题型，不会有什么偏题怪题。\n\n**第四，机械学习模型的掌握**\n\n在机械模型方面虽然硬性要求不多，但是也不轻松，因为会多两场面试。而在面试中，很多是对模型的基础知识考察，所以我们要从公式入手了解模型，然后延伸，着重在应用方面的操作。\n\n**第五，案例分析**\n\n案例分析是面试中必考的内容，或者我们可以称之为考察Communication的一环。在这过程中，HR会提出真正要解决的问题让你解决，这时候，脑中要有套路地一步步解决问题，关于这点我们在课程中会详细讲解。\n\n最后Jason老师还强调了一点，同学们在申请职位的时候一定要看清对方的要求是什么，千万不要因为对自身的能力过于自信而盲目申请，结果只会欲速而不达。在讲座结束后，同学们的反响很热烈，并根据自身的情况向Jason老师提出了不少问题。针对同学提出的疑惑，Jason老师在微信上一一做出了解答。\n\n**提问环节**\n\nQ1：Jason老师，我是一个转专业的学生，如果我想走Machine Learning Engineer做AI相关的产品，而不只是分析处理数据的工作。老师建议我先从General Software Engineer做起还是Data Scientist做起?\n\nJason老师：根据我的经验，建议还是从Engineer做起，然后转到机械学习方向会更加容易一些。现在很多数据科学公司都是偏统计的，所以重点还是要看你最后能拿到的机会是什么。而在湾区，机械学习方面的工程师职位现在几乎不招收新人，门槛较高。所以从软件工程师入手再转到数据科学方向会更加简单一些。\n\nQ2：Data方向的Engineer对学历或者专业有没有什么要求呢？\n\nJason老师：这个问题很多同学都问，关于学历方面，其实只有少数比较极端的一线职位才会要求PHD，一般的职位Master甚至本科都能胜任\n\nQ3：我基础差，对Data的课程比较感兴趣，请问这个课程有什么要求吗？达到什么水平才可以报班上课呢？还有，Data Analysis 对于哪方面技巧更看重呢？\n\nJason老师：对于基础差的同学，我们的课程会帮你查缺补漏，将你不熟悉的内容先补起来。我们并不是死板的教科书课程，而是有迭代的，从浅入深的学习过程。只要学过大学数学基本上就能满足报班的需求。同时，我们对coding能力并没有要求。重点是学会如何做case study，学会怎么将一个数据转换成一个可以和别人communication的项目，这样才能充分展现你技术的含量。\n\nQ4：我想问下老师Machine Learning Engineer 和Data Engineer有什么区别吗？哪个机会更多点\n\nJason老师: Machine Learning Engineer更难一些，它对Modeling的要求比较高。而Data Engineer的要求就比较低，他专注的是在数据放入Model前的操作。不过，在不同的公司里面即使是相同的职位也会有不同的标准。而在机会方面，这个就要看个人的背景如何了。\n\nQ5：做kaggle是不是有所帮助?\n\nJason老师：这个问题要从两个方面来回答，因为他既有有帮助的地方也有有缺陷的地方。首先，有帮助的是我们做任何的学习都是需要练习的，通过练习，我们可以把学到的知识巩固起来。但同样这也是有缺陷的，因为我们是要对模型有深度的理解，而不是重复的刷题，特别是对于模型这一块，重复刷题不如将一个问题做深做全面，尝试用不同的方法解决，才能扩展自己的思维提高自己的能力。\n\nQ6：我现在是Data专业的学生，有一定编程基础，想往Data Engineer方向发展，课堂学过Machine Learning和Data Mining，请问适合上面试系统班还是数据班？\n\nJason老师：这位同学看起来基础不错，所以选择哪个班还是看你个人的兴趣。因为两方面你都需要作出努力才能更好的满足职位的要求。对统计的要求不高，不过只要你掌握了我们课上所讲内容的90%，就几乎覆盖了大部分职位的要求了。\n\nQ7：想问Jason老师，还是很纠结这些岗位数学到底要学到多深。是不是要搞清楚model的推导才行。谢谢！\n\nJason老师：这个要根据不同的公司不同职位的要求来判断，不过他们更加追求你所了解的广度而不是深度，因为在面试的时候他们更加希望了解你对模型有没有自己的理解。\n\n本次讲座非常火爆，很多同学都没来得及加入到我们的讨论中。来offer会在今后的活动中安排更多的讲座，让Jason老师再次和大家交流，请大家提早报名，不要错失良机。\n"}}},{"node":{"title":"2017北美留学生CS领域就业白皮书","path":"/en/news/2017-07-12-north-america-cs-job-market-white-paper-for-foreign-students/","node_locale":"en-US","id":"9b117c43-064a-575c-bb93-49a9006f64ba","contentful_id":"9E9mFrvzTUCMcCKSM2AAG18","date":"2017-07-12T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"来Offer广泛调研，悉心整理，用数据告诉你留学生'码农'们的职业发展现状和美国科技界招聘趋势。肯定有一个数字让你感叹——原来对就业这件事，你的误会这么深...2017关键词：留学生人数持续增长，STEM专业备受欢迎"},"thumbnail":{"id":"60306302-ce0b-5379-8216-210b3c17bcb1","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/N9bDXyWQEeas4C0wcyUOi/494f25c4563ba43268ed32740cbfc2bb/031-career-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"be313ed8-8f8c-5f9e-997a-05528479104e","body":"来Offer广泛调研，悉心整理，用数据告诉你留学生'码农'们的职业发展现状和美国科技界招聘趋势。肯定有一个数字让你感叹——原来对就业这件事，你的误会这么深...\n\n2017关键词：**留学生人数持续增长，STEM专业备受欢迎**\n\n自2010年，中国每年赴海外留学的人数持续上升，而美国始终是留学党的首选目的地国。至2016年，在美中国留学生人数已达到近**33万人**，占全美外国留学生总数的**1/4**，远超其他生源国。\n\n2013-2016 中国赴美留学人数/数据来源：2017中国留学生白皮书 by 前途留学\n\n![031-career-01](//images.contentful.com/04k2xg9gplcj/N9bDXyWQEeas4C0wcyUOi/494f25c4563ba43268ed32740cbfc2bb/031-career-01.png)\n\n在32.8万中国学生中，STEM专业学生始终占相当大的比例。就读于工程学的占中国留学生的**18.6%**，数学与计算机科学占**14.1%**。\n\n中国在美留学生就读学科/数据来源：2017中国留学生白皮书 by 前途留学\n\n![031-career-02](//images.contentful.com/04k2xg9gplcj/YLj5TDFSyyIO8WA8Geggo/c2cecdfefe0494f10a06f6fb39955c69/031-career-02.png)\n\n在所有留学美国的理工科学生当中，近9成是来自亚洲的留学生。理工科类的专业里，最热门的仍是工程类专业，有19万留学生就读，其中有中国学生5万人。计算机和信息科学紧随其后，有12万留学生，其中有中国学生超过2万人。\n\n2016年STEM专业亚洲留学生及中国学生人数/数据来源：美国国土安全部\n\n![031-career-03](//images.contentful.com/04k2xg9gplcj/oMxiN6hlC0kOMe6c2wK8i/6f05f3853ab8d6a95b580e116c7fbd8c/031-career-03.png)\n\n2017关键词：**留学生就业压力大，回国人数增加，但就业满意度堪忧**\n\n2016调查显示，70%的中国赴美留学生想在美国获得工作经验，20%的学生想长期留美，仅10%的学生准备毕业后马上回国。\n\n中国在美留学生毕业回国意向/数据来源：2017中国留学生白皮书 by 前途留学\n\n![031-career-04](//images.contentful.com/04k2xg9gplcj/1K9VglxMO4ewAKmGK4SO0S/59710dbdac5dceb116bb60f2b6313512/031-career-04.png)\n\n另一方面，超8成海归觉得回国后无用武之地，工作满意度整体偏低；85后海归薪酬水平同样不容乐观，月薪集中在5千-1万人民币。\n\n![031-career-14](//images.contentful.com/04k2xg9gplcj/5OMhZtNLkAawOW86EeSeWC/d8d175082c67e6971944cc29d4a544e5/031-career-14.png)\n\n2017关键词：**求职者扎堆美国东西岸，计算机领域高收入工作机会最多**\n\n金融危机后，美国逐渐进入经济复苏时期，劳工部预测从今年到2020年，失业率将稳定在4.8%-5.0%这一较低水平。\n\n美国失业率数据／数据来源：美国劳工部年报\n\n![031-career-05](//images.contentful.com/04k2xg9gplcj/4HcOhsxP5eiCqaEw0yaE4u/b86b6f69d3984b236346259201a0a044/031-career-05.png)\n\n与此同时，美国收入水平的**区域差异**仍非常明显，东西岸的加州、华盛顿州及纽约州，以其发达的经济和较高的薪资水平，吸引着周边乃至全美的年轻求职者。下图中颜色越深代表家庭年收入中位数越高，其中加州、华盛顿州和纽约州均达到**$60K**及以上。\n\n2015美国各州家庭收入中位数／数据来源：Business Insider\n\n![031-career-06](//images.contentful.com/04k2xg9gplcj/203GzyjVqgeS6oAKyUeS2e/999bb27cd5c5dfea1769c23a09f6d760/031-career-06.png)\n\n而在GDP排名全球第6、堪称富可敌国的加利佛尼亚州，最受留学生关注的无疑是宇宙中心——**硅谷**。数据显示，未来3-5年内，对程序员的需求仍呈上升趋势，其中以主攻移动应用领域的Software Developers需求量最大。\n\n程序员岗位新增预测（单位:千人）／数据来源：美国劳工局\n\n![031-career-07](//images.contentful.com/04k2xg9gplcj/68atgVyAvuKIqaMAAk4ams/7e057239c962b4f4ab7fc983929dc169/031-career-07.png)\n\nSA=Computer Systems Analysits, Programers=Computer Programmers, AD=Software Developers, applications SD=Software Developers, systems CS=Computer Support Specialists\n\n尽管美国经济复苏、IT业岗位需求丰富，但收入水平悬殊导致湾区、纽约等地求职者扎堆，留学生仍面对巨大的求职压力。\n\n2017关键词：**H1b申请人数出现下降，但身份问题仍是中国学生留美工作的最大阻碍**\n\n2017年，美国工作签证H1b的申请人数近年来首次出现大幅回落。不过，由于签证数（Cap）并未增长，仍有大量申请人未能抽中。\n\nFY14-17美国H1b申请数与Cap数／数据来源：美国移民局\n\n![031-career-08](//images.contentful.com/04k2xg9gplcj/5wc4Rf1UBOAuyAsIkEoKYO/b05c11772afcc5deae8ed74fa0dd63f0/031-career-08.png)\n\n残酷的现实是，留学生人数远远不及中国的印度学生和本地人员，占用了**6-7成**申请比例。依靠ICC、一人递交多份申请等手段，印度人在H1b申请的战役中获得了压倒性的胜利...\n\nFY12-16中印人士递交H1b申请数量／数据来源： Computerworld.com\n\n![031-career-09](//images.contentful.com/04k2xg9gplcj/1SdtVwZ0KQwYOAa0q8qicE/541be1c456954210e5bf25712d97dcca/031-career-09.png)\n\n在2017财年的H1b申请者中，超过70%在IT行业任职，来自印度的工程师，更有占据硅谷半壁江山之势。\n\nFY2017各行业申请H1b人数／数据来源：myvisajobs.com\n\n![031-career-10](//images.contentful.com/04k2xg9gplcj/2pXR1hcFAAs4AU4coU6wyg/8d347650977e701fb6934e854611433c/031-career-10.png)\n\n2017关键词：**硅谷一线公司纷纷裁员，硬件相关职位受重创**\n\n在经历了21世纪头十年的大幅增长以后，近几年信息技术领域新增职位速率已大大下降并趋于平缓。2017年上半年，包括Cisco、Microsoft在内的多家公司**大量裁员**，其中**硬件领域岗位受打击最为严重**。身处'过渡期'，大公司员工也面临失业的危机。\n\n![031-career-15](//images.contentful.com/04k2xg9gplcj/q8iy6VEOZwEmUMKyymYyU/c82683172dd38bbbd53f76f85af3a4cd/031-career-15.png)\n\n2017关键词：**一线公司收紧招聘，形势对New Grads尤为不利**\n\n与此同时，FLAG四巨头从2016年开始纷纷收紧招聘，大部分职位留给有工作经验的员工。2017年1月，Facebook内部quota公布2500招人计划，其中1700留给了**工作经验3年+**的candidates, 800个校招名额引发激烈争夺2017年2月，Google宣布2016-2017的**校招名额已满**。\n\n硅谷是工程师的圆梦之地，却也让众多留学生望洋兴叹——在目前如此严峻的形势之下，还有多少机会能留给我们，又有多少人有实力拿下梦寐以求的职位？\n\n2017关键词：**求职成功率保持高水平，来Offer学员展现超强战斗力**\n\n在美国，找工作实属不易，而对于来Offer学员来说，**挑战带来的却是更大的成就感。**自2013年成立以来，来Offer学员的求职成功率始终保持在80%-90%的高水平，仅2017年前5个月，据不完全统计，来Offer学员就**已斩获350枚Offer。**\n\n2016.1-2017.5／来Offer学员获得Offer数\n\n![031-career-11](//images.contentful.com/04k2xg9gplcj/6a4Na7W2cwGwaMYiQce2Eo/9524bf1584ca9315020a0b0ad37c546a/031-career-11.png)\n\n上一财年参与H1b抽签的学生中，有1/10来自来Offer，这一比例不可小觑！\n\n2017关键词：**转专业？零基础？我们没在怕的！**\n\n在历年的来Offer学员中，非STEM背景同学占到近60%，其中绝大多数对CS一无所知。\n\n2013-2017／来Offer学员学科背景\n\n![031-career-12](//images.contentful.com/04k2xg9gplcj/1kj1svUlPGgWYM8IQUCw84/7232016df92d5721734af8843c3c82ac/031-career-12.png)\n\n在硬件行业落寞、软件业职位缺口较大的今天，越来越多EE专业同学转向CS领域。来Offer历年学员中有近4成为EE背景，在老师们的帮助下，实现了向Software Engineering的华丽转身。\n\n2017关键词：**Women in Tech，程序媛小姐姐横扫硅谷**\n\n2013-2017／来Offer学员性别比例\n\n![031-career-13](//images.contentful.com/04k2xg9gplcj/2NHc2wYn8QYUYMKQ0EaMUk/c6272a1f48e9724004fe117816283b07/031-career-13.png)\n\n女生不擅长coding？NO！来Offer的学员中有近1/3是程序媛，她们不仅在学习中体现了过人的勤奋与智慧，也在工作岗位上展现了极高的情商，晋升速度出类拔萃！\n\n2017关键词：**来自工业界的技术大牛和面试官，带来技术和素质的全面提升**\n\n越来越多中国留学生进入美国名校，他们和美国名企、优质职位的距离却没有明显缩短。来Offer教师阵营由多位来自FLAG等一线公司的技术带头人、资深面试官组成，并通过及时答疑、考试后1对1电话指导等方式，细致入微地服务每位学生。\n\n来Offer不仅在短时间内为学员构建完整的CS知识体系，更带领同学写code、做项目、改简历、做模拟面试，按照一线公司的人才需求培养学员，全面加强综合实力。此外，来Offer更通过每月2次技术研讨会——来Meetup，和每月1次的职场交流会——来Talk，开拓学员眼界，带领他们在最热门的技术领域找到自己的求职方向。\n"}}},{"node":{"title":"90%的人没用过Google这个功能, 但它藏着硅谷求职的秘密！","path":"/en/news/2017-07-07-secret-google-tools-to-aid-your-job-searching/","node_locale":"en-US","id":"e91ddd45-c975-56b3-98e0-5e8c7816b22a","contentful_id":"9E9mFrvzTUCMcCKSM2AAG16","date":"2017-07-07T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"2015年，Google干了件大事，开放了Google Trends的实时数据，这意味着全世界人民从此共同拥有了一个巨大的、实时的数据库。只要你有网络，又足够好奇，完全可以自行设定不同的时间、地区作为过滤条件，添加多达5个关键词或关键句，来比较他们的搜索热度。Washington Post、Huffington Post等媒体都利用这个巨大数据库做过不少调查，题目包括'美国人民对哪个州最好奇？''俄勒冈枪击案后，美国民众对于枪支的兴趣减退了'等等。又一年的毕业季，钛媒体记者用Google Trends试验了一把，由Google提供的数据出发，观察了一下这几年北美职场一些知名大公司的'热度'。"},"thumbnail":{"id":"c7556264-98e6-52f8-9de0-3e8a7a088d8b","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/5IJjQyY5S8ygAmAEIO6Iwc/5632543eb9feffdbd068917affaaacbb/030-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"76c3f03d-75cb-58e6-b9ae-3237eba62b7f","body":"2015年，Google干了件大事，开放了Google Trends的实时数据，这意味着全世界人民从此共同拥有了一个巨大的、实时的数据库。只要你有网络，又足够好奇，完全可以自行设定不同的时间、地区作为过滤条件，添加多达5个关键词或关键句，来比较他们的搜索热度。Washington Post、Huffington Post等媒体都利用这个巨大数据库做过不少调查，题目包括'美国人民对哪个州最好奇？''俄勒冈枪击案后，美国民众对于枪支的兴趣减退了'等等。**又一年的毕业季，钛媒体记者用Google Trends试验了一把，由Google提供的数据出发，观察了一下这几年北美职场一些知名大公司的'热度'。**\n\n**大家都想去Google，Amazon有点'经济适用'**\n\n中国的软件工程师很爱用'FLAG'来代指几个美国著名科技公司，包括Facebook、LinkedIn、Amazon和Google；其中LinkedIn经常被人吐槽'都是因为大家太爱拼出一个词'才被强行加入。硅谷出名的高科技公司着实很多，记者在挑选例子的时候还是沿用了这四个公司的组合，另外添加了苹果这个偏硬件的公司作为一个比对项。\n\n![030-01](//images.contentful.com/04k2xg9gplcj/5IJjQyY5S8ygAmAEIO6Iwc/5632543eb9feffdbd068917affaaacbb/030-01.png) \n\n很显然，'美国人民最渴望进入的公司'这个名号，Google当之无愧。不管是将LinkedIn换成Microsoft、Salesforce这种以福利待遇闻名的老牌公司，还是Facebook、Uber、Airbnb、Snapchat这样的硅谷新贵（按相应成立和大规模发展的时间修改了搜索条件），没有任何一家公司的搜索热度能超过Google。\n\n不过进Google这件事的确越来越难了。曾在Google工作多年、现在在硅谷创立了在线教育和职业培训机构来offer的Rick Sun向记者介绍道，大概六七年前，只要求职者的简历进了Google的内推（注：内部员工通过公司系统对HR进行内部推荐）系统，基本上都能有面试的机会。但现在，'就算很认真地写了推荐理由，简历都不一定能通过筛选'。早在今年2月的时候，Google就宣布2016-2017的校招额度已经全部用完了。\n\n![030-02](//images.contentful.com/04k2xg9gplcj/2ronvYdpYUQ2yIwUWeCU0U/eb4e30fb56f464d55469c8103bb79046/030-02.png)\n\n对Google抱有美好憧憬并不影响大家脚踏实地、持续关注那些更有可能给出Offer的公司——假如把搜索的关键词改成'公司名称+Offer'，其他公司和Google夸张的差距一下子就缩小了。其中最值得注意的大概就是Amazon这个公司了，在搜索'怎么才能进XX'的时候，它在过去五年内的搜索热度平均值仅仅是Google的1/6，但在搜索'公司名称+Offer'的时候，这个差距就变成不到1/2。把这个数据翻译成人话，大概是这样：很多人都对怎么进Google有过兴趣，但是在真正的求职过程中，大家对于拿到Amazon offer更为自信——或者说，更多的人更加靠近拿offer那一步。在2015年底的大规模招聘季节，搜索'Amazon Offer'的热度甚至大大超过了Google。\n\n**H1B和写代码这两件事，印度人比美国人还关心**\n\nH1B是一个美国政府为引进国外人才而设置的签证类别，可它在印度的搜索热度竟然比美国本土还高。Software engineer career（以软件工程师为生）这个词组也是一样，过去五年里，美国与印度的搜索热度差别是27和100——100代表着全球这个词最高的搜索热度，而它出现在印度。单搜'Software engineer'，印度的搜索热度也比美国高很多，但是最高的地区是斯里兰卡。这和有关ICC的种种'传说'不谋而合——印度的大型软件公司Infosys、TCS、Wipro等等，在美国提供不同阶层的信息时代的廉价劳力，以此贡献了每年印度接近10%的GDP。最低等的工种是Programmer，几乎不需要懂怎么编写代码，只需要输入代码和跑代码即可，可以算是信息时代的蓝领工人。而对于'可造之材'，他们往往会给求职者提供1-3个月的集训，一般是较为初级的前端（比如HTML、CSS等用来搭建网页的代码），然后靠修改简历、捏造工作经历来帮助求职者获得面试机会，有些甚至还会在在线测试的时候帮助求职者作弊。最终拿到工作邀请后，求职者只能获得由外包公司提供的薪水，这一般只是公司下发的真正薪水的1/2，剩下的都按照提前签好的合同进入了印度外包公司的腰包。2016年，印度的外包公司占据了美国IT外包市场大约67%左右的份额，这个市场总额大约是1300亿美元。\n\n为了抵抗印度籍软件工程师大军，几乎所有的中国求职者都开始寻找各种助力。比如通过校友网络寻找内推机会，'在求职的各种方式里，内推是最有效率的。' LinkedIn全球校园招聘负责人Emily Campana在一场北美职场讲座的讨论中说道，她还强调了建立自己LinkedIn档案和完善简历的重要性。这场讲座上，她和Amazon、LinkedIn的前资深招聘官Ed Campana及Laioffer创始人Rick Sun讨论了北美职场上中国求职者面临的种种问题，认为一个有效交流的平台对于求职非常重要，'在了解大的科技公司在寻找什么样的人才、拥有一个互相支持的'社区'以后，找工作的部分也许没有那么难。'Ed这样说。\n\n除了这样的线下活动，Rick Sun创立的在线教育和职业培训机构来offer，也属于这类帮助北美中国求职者的平台之一，它和这些印度的外包公司还有些'针锋相对'的意思。**在此前接受媒体采访时，他曾直接表达过这样的观点，'中国人能做得比印度人更好。'**他的平台主要提升学生的硬实力——算法基础、数据结构、辅导他们做实际项目等等，辅以一个涵盖了北美大部分高科技公司的内推网络，提高学生拿到面试邀请和offer的机会。截止发稿，这个平台上拿到北美一二线科技公司offer的用户大概在1200名左右，Rick Sun表示平台上的学生最终获得工作机会的成功率达到80%。\n\n**Trump上台，中国工程师需要担心吗？**\n\n在关键词搜索的时候，相关查询里的内容也会提供不少额外的信息。比如在H1B的相关查询里，前10位中除了翻来覆去的H1B相关内容，只有Trump的名字异军突起。看来这位不走寻常路的美国总统的上任，的确让人们对于移民政策及相关工签政策有不少的担忧。LinkedIn的招聘官表示，这个担心并不必要。**'政策不会影响招聘，除非有法律禁止我们招聘中国学生，不然LinkedIn不会因为其他政策上的改变而限制自己的招聘计划。'Emily对钛媒体记者说。**而且Trump上台后对于H1B签证的种种攻击，主要也是在于对于这个签证的'滥用'与'造假'。此前USCIS（美国移民局）发出memo表示要加强审查的 'Computer Programmer（编程者）'这个职位，技术含量较低，和职位一般是'Software Developer（软件开发者）'的中国工程师们的关系也不大。**就算与政策无关，其实近几年，软件工程师们在北美找工作和职场发展也有了新的担忧。**'行业需求在增加，但是更多的转专业的人也在涌入求职市场。'Ed说道。'除此之外，这几年科技发展的太迅速了，公司的要求也随之提高——你必须不断地学习新的知识，才能在职场上长期保有竞争力。''在任何职场上，视野和能力都缺一不可，'Rick Sun说道，'比如在iPhone出现后，看起来只是一个手机，但它最终成为了一个采集各种数据的终端、改变了人类社交和生活的方方面面。在早期如果能看到这个平台的机会，就一定会事半功倍。'\n\n在Rick Sun眼中，未来的十年到二十年里这样的重要平台，是人工智能——AI，他向钛媒体介绍，他在USC念CS博士时主要的方向是高效AI和搜索算法，8年前他就已经开始做无人驾驶的研究了。据此前新浪科技对Rick Sun的专访报道，这位转行职业培训的AI工程师仍旧没有放弃研究，去年还发表了一篇AI论文。对于AI的重视与科研经验被他拓展到了平台的课程设置上，’我们希望帮助更多的中国工程师在AI时代做好准备，除了加强算法和数据结构等基础课程以外，现在的课程已经在从大数据、深度学习等角度覆盖AI行业里的先进科技领域，未来也会提供更多细分的课程。’\n\n（本文发自硅谷，作者/钛媒体驻硅谷记者丁诗贝）\n\n图片来自网络，版权属于作者\n"}}},{"node":{"title":"Call Stack 是什么?","path":"/en/news/2017-06-22-what-is-call-stack/","node_locale":"en-US","id":"4e4e7892-45fe-5ce7-90a5-0d73af5744e0","contentful_id":"9E9mFrvzTUCMcCKSM2AAG12","date":"2017-06-22T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"Call stack（通常译作'调用栈'）也是计算机系统中的一个重要概念。在介绍 call stack 之前，我们首先来回顾一下 procedure 是什么。在计算机程序当中，一个Procedure（通常译作'过程'）吃进来一些参数，干一些事情，再吐出去一个返回值（或者什么也不吐）。我们熟悉的Function、method、handler 等等其实都是Procedure。当一个Procedure A 调用另一个Procedure B 的时候，计算机其实需要干好几件事"},"thumbnail":{"id":"0682cdb5-465a-5c97-958b-429659b467c5","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1HCJMa6htqEeMogmI04M6o/547b6e4eaa0959d66e0dd4018478f339/technical-025-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":null,"body":{"id":"9f4163bd-5936-56a0-9294-7deef0c70f14","body":"我们在上课讲到递归函数调用的空间复杂度的时候曾多次提到过call stack的概念，然而很多同学表示不太清楚。今天我们就来讲一下call stack是什么。相信有了上一篇文章对virtual memory的介绍之后，同学们理解起Call stack来会相对容易一些。\n\n**Call Stack 是什么？**\n\nCall stack（通常译作'调用栈'）也是计算机系统中的一个重要概念。在介绍 call stack 之前，我们首先来回顾一下 procedure 是什么。在计算机程序当中，一个Procedure（通常译作'过程'）吃进来一些参数，干一些事情，再吐出去一个返回值（或者什么也不吐）。我们熟悉的Function、method、handler 等等其实都是Procedure。当一个Procedure A 调用另一个Procedure B 的时候，计算机其实需要干好几件事。\n\n**一. 是转移控制**——计算机要暂停 A 并开始执行 B，并让 B 在执行完之后还能回到 A 继续执行。\n\n**二. 是转移数据**——A 要能够传递参数给 B，并且 B 也能返回值给 A。\n\n**三. 分配和释放内存**——在 B 开始执行时为它的局部变量分配内存，并在 B 返回时释放这部分内存。\n\n同学们想一下，假设 A 调用 B，B 再调用 C，C 执行完返回给 B，B 再执行完返回给 A，哪种数据结构最适合管理它们所使用的内存？ 没错，是stack，因为过程调用具有 last-in first-out 的特点。当 A 调用 B 的时候，A 只要将它需要传递给 B 的参数 push 进这个 stack，再把将来 B 返回之后 A 应当继续执行的指令的地址（学名叫 return address）也 push 进这个 stack，就万事大吉了。 之后 B 可以继续在这个 stack 上面保存一些寄存器的值，分配局部变量，进而继续构造调用 C 时需要传递的参数等等。 这个 stack 其实就是我们所说的Call Stack。（这里的描述有些简化，实际当中计算机会做一些优化，如果参数和局部变量不太多的话就懒得放在 call stack 里，而是直接使用寄存器了。） Call stack 在 virtual memory 里其实就是一段连续的地址空间，靠一个叫做 SP 的寄存器（32-bit 叫 ESP，64-bit 叫 RSP）来指向栈顶。 既然是连续的，于是它在使用上比我们理论课上讲的抽象的 stack 要更灵活一些，更接近 array 而不是 linked list，可以访问任意元素，而不仅仅是栈顶元素。（当然进栈出栈还是只能在栈顶进行。）这也就是为什么尽管它叫做 call stack，我们依然可以同时有不止一个参数和不止一个局部变量的原因。\n\nExample\n\n举个例子吧。假设我们有这样一段求阶乘的代码：\n\n![technical-025-01](//images.contentful.com/04k2xg9gplcj/1HCJMa6htqEeMogmI04M6o/547b6e4eaa0959d66e0dd4018478f339/technical-025-01.png) \n\n当 main() 调用了 fact(n)，fact(n) 又调用了 fact(n-1)，fact(n-1) 即将调用 fact(n-2) 的时候，它的 call stack 差不多是这样：（具体情况大同小异，和编译器优化有关。）\n\n![technical-025-02](//images.contentful.com/04k2xg9gplcj/43DZ4j7j1esSw8G8WmoSEq/96f94f2e41aaf0ff8cc3476605580f45/technical-025-02.png)\n\n其中每个 procedure 分配的内存区域叫做它的 stack frame（通常译作'栈帧'，吕老师译作'梦境'）。这也就解释了为什么当我们分析递归函数调用的空间复杂度时，既需要考虑 recursion tree 的深度，也需要考虑每层所分配的局部变量的大小。 对于上述 fact() 函数，它的 recursion tree 的深度是 n，这就意味着总共有 n 个 stack frame。每个 stack frame 里面除了保存 return address 和一些寄存器的值之外，还需要保存参数 n 和局部变量 result，它们都是 O(1) 的。所以 fact() 总的空间复杂度是 O(n) 的。\n\n希望同学们能够通过了解 call stack 进一步理解空间复杂度的计算，在面试的时候一通百通。\n\n（本文在写作过程中参考了 Randal E. Bryant 和 David R. O'Hallaron 所著的 Computer Systems: A Programmer's Perspective 第二版和第三版。）\n\n**汤老师**\n\n来offer王牌讲师之一。清华大学计算机系信息学竞赛保送生，美国哥伦比亚大学计算机系软件系统实验室博士生，曾在 OSDI、CACM 等操作系统领域最顶级学术会议和期刊上发表多篇论文。曾参与 Chrome 和 Google Cloud Platform 的研发工作。\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"从10年EE工程师到谷歌senior SWE，我只用了3个月","path":"/en/news/2017-05-19-from-ee-to-goole-swe/","node_locale":"en-US","id":"ca96aabb-e85f-5677-a983-dab5761b2229","contentful_id":"9E9mFrvzTUCMcCKSM2AAG7","date":"2017-05-19T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"大家好，我是Ying Luo。我的背景和大部分来offer学员可能不太一样：EE PhD、有10年相关工作经验。 我曾连续在几个Startup工作过，这段经历让我转到了fullstack方向。但是Startup干活快糙猛，什么方向都做结果就是都不精通。我自己在家做Leetcode练了几个月，到了大部分题目时间足够的话都能AC的水平。主要问题是："},"thumbnail":null,"thumbnailAlt":null,"authorProfile":null,"body":{"id":"cf898af9-9be2-50e9-8655-e07cffad4def","body":"大家好，我是Ying Luo。我的背景和大部分**来offer**学员可能不太一样：EE PhD、有10年相关工作经验。\n\n我曾连续在几个Startup工作过，这段经历让我转到了fullstack方向。但是Startup干活快糙猛，什么方向都做结果就是都不精通。我自己在家做**Leetcode**练了几个月，到了大部分题目时间足够的话都能AC的水平。主要问题是：\n\n**1.很多我认为应该在规定时间里做出来的难题不能保证在规定时间里面能做出来；**\n\n**2. 很多能在规定时间里做出的题代码质量自己都不满意；**\n\n**3.对题目之间的联系和各类题目的归类不是太得要领，经常做了后面忘了前面；**\n\n**4.精力有限，时间太紧张，我在公司的工作非常忙，基本8，9个小时全部在写代码和开会，晚上做题目进度很慢。**\n\n有个朋友给我介绍了**来offer**，跟孙老师联系后，孙老师给我试听了Binary Search那一节课的视频，我立刻被折服了，马上开始上课。我只上了算法大班，主讲老师是孙老师、吕老师和赵老师。**课程经过精心设计，难度交叉上升：**孙老师对算法的深刻理解和精辟总结让我对很多算法的理解焕然一新；吕老师的java语言课面面俱到，巨细靡遗；赵老师的系统设计更是顶尖开源框架的第一线工程师亲自现身说法。最关键的是老师们每节课后都要花大量时间亲自答疑，**保证每一个问题都做到完全解答**。如果大学里的教授们讲课水准和敬业精神都能像他们这样，计算机系毕业生的素质大概会上一个新的台阶:-)\n\n我认为拿了offer并不是一个终点。如果想在工作上有进一步发展，还是需要回来参加**来offer**的其它课程，会对职业发展帮助良多。还有内部作业平台来code的标准答案的代码质量也是精益求精，很多代码在其他地方是见不到的。上完整个课程之后，很像令狐冲学会了独孤九剑的精髓：以前都会的一招一式，现在能够融会贯通，需要的时候挥洒而出，而不像以前那样，卡在一个招式上，下面不知道该怎么办。面试的其实反而没什么太多好说的，就是一句话：**功夫在诗外**。到面试的时候你应该已经准备好了，否则不应该去浪费双方的时间。抛开算法的基础，**首先，我觉得要放松自己去交流。**\n\n对像我这种已经在职场混迹数年的工程师可能不是问题，毕竟我们已经对跟产品经理开会的时候拍桌子，散会之后称兄道弟已经非常熟悉。但对新毕业的学生可能是一个坎，所以需要注意一下。**另一个要点，我觉得是应该由你自己来引领整个面试过程。**不管见过还是没见过，会还是不会，思路不能停下来或者卡顿，要从各个角度来试图解决问题，听取反馈，融合反馈，然后迅速提高。为什么这一点重要，因为现实工作中的问题真的就是这样解决的。\n\n好，就写这么多，拿到了Google Senior Level的Offer其实只是一个新的开始。\n\n在这里祝大家早日有offer！\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"西北大学来Coder Club学长学姐私享会","path":"/en/news/2017-06-27-usc-alumni-shares-flag-interview-stories/","node_locale":"en-US","id":"63070569-d366-52f4-a167-ef4d353044a1","contentful_id":"9E9mFrvzTUCMcCKSM2AAG15","date":"2017-06-27T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"在学习方面，我遇到的最大的挑战是**基础比较薄弱**。曾想借助Coursera补充基础知识，但Coursera的课程有这样一个问题：简单的问题花费时间过长，而困难的问题讲解又太仓促。在求职中，转专业同学时常能感觉到自己的**CS素养不够，缺乏最基本的CS的知识，很多专业课都没有学过。我在硕士入学一年之后就开始进行求职面试，很多基础知识都没来得及补，而这些专业课上训练出来的专业素养又恰恰是面试官最看重的。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"54346c83-7407-500e-9ebc-c717ffb6ed57","body":"**USC来Coder Club学长学姐私享会嘉宾**\n\n**Xiaoyue：**南加州大学（USC）CS 专业研究生一年级，本科为软件工程专业，目前在Amazon实习。\n\n**Yuning：**USC CSSE 应届硕士毕业生，7月份即将入职YouTube。本科就读国内大学与美国密苏里大学的2+2 EE专业。硕士毕业前没有CS相关的实习经历。\n\n**Club小助手：**感谢两位USC学姐为大家分享求职心得！相信有很多同学都和Yuning学姐一样，想从EE转向CS，请问在转专业中遇到的最大挑战是什么？\n\n**Yuning：**在学习方面，我遇到的最大的挑战是**基础比较薄弱**。曾想借助Coursera补充基础知识，但Coursera的课程有这样一个问题：简单的问题花费时间过长，而困难的问题讲解又太仓促。在求职中，转专业同学时常能感觉到自己的**CS素养不够，缺乏最基本的CS的知识**，很多专业课都没有学过。我在硕士入学一年之后就开始进行求职面试，很多基础知识都没来得及补，而这些专业课上训练出来的专业素养又恰恰是面试官最看重的。\n\n**Club小助手：**这么听上去，EE转CS的同学真是不容易啊…那学姐对转专业的学弟学妹们有什么建议呢？准备周期需要多长，又该如何做学习计划？\n\n**Yuning：**对于准备周期，我觉得半年时间足够；至于学习计划，如果时间足够，可自学一些课程，首先是以**打好算法和语言的基础**为主。应至少熟练掌握一门语言，以及了解多线程并发的概念及实现，系统设计，linux系统的常用命令。当时来offer的课程对我帮助很大，比如孙老师的算法课和吕老师的Java课。在制定个人学习计划的时候，应该有的放矢，把重点和注意力放在自己不足的地方，一步步的填补自己的不足。\n\n**Club小助手：**群里刚刚有位同学提了这样一个问题，作为转CS专业的学生，在操作系统这个方面上需要了解多深？在面试中，具体哪部分的知识会更重要呢？\n\n**Yuning：**其实这位同学的认识有一个根本上的问题，那就是在你找工作的时候公司并不会因为你是转专业的学生而降低要求。我觉得在操作系统这上面，首先要把学校教授的相关知识掌握好，来Offer的系统设计等课程也是很好的补充。对于面试的重点，每个公司各有不同。比如Yahoo会问一些比较基础的知识，像内存如何分配，以及一些简单的概念问题，但不会让你就多线程进行编程。而Dropbox的onsite面试有一道题就是写一个多线程的web crawler，且会有很多follow-up questions。所以在学习巩固操作系统知识的时候，可以**依你申请公司的不同量力而行**。时间充足的话可以多掌握一些，没什么时间就**集中解决基础问题**，因为大部分公司并不会问多线程的问题。\n\n**Club小助手：**Xiaoyue是CS科班出身，又有Amazon的实习经历，目测毕业后的求职会很顺利吧！不知道你在求职中有没有体会过Yuning学姐那样'知识不够用'的情况？\n\n**Xiaoyue：**嗯我本科和硕士都是CS专业，对这个问题感触还是挺深的。就我了解，美国每个学校CS的课程设置都不一样，其中有几个内容会跟面试时的职位要求比较贴切，比如算法，数据结构，数据库，软件开发，web开发等；有的学校会教Java，有的学校是C++。但是，光靠学校的课程的确是**不足以应对面试**的，因为这些知识比较理论化，和实际工作脱节，在一些公司看重的方面又缺乏深度。而面试的时候，面试官通常会问的比较深入，而且更贴近实际工作。比如，现在学校里的课程很少会讲OOD（反正USC没有讲:-D），一般只讲object-oriented design和 system design，但是**面试还是经常会考察OOD**。面试中考察的基础知识都差不多，但每个人肯定都会有一个自己精通的语言，比如Java或者C++，一些考官就会针对这门你最擅长的语言，问得特别深入。如果你在简历上写了熟悉的语言，一定要确保面试时经常会问的那些细致的问题都要会回答。总而言之，即便是CS科班出身，应对面试还是要做大量功课的，一定要看面经，根据公司的具体要求去做准备，而且要**提高知识和实际工作结合的能力**，加深对知识的理解。\n\n**Yuning：**就我而言，最重要的首先是完善简历。如果你的简历表达不足，是很容易被HR筛掉的。在简历方面，你要根据职位的要求来制作和投递相应的简历，简历上的经历与你的职位越契合，获得面试的机会就越大。另外，你还需要了解HR在筛选简历时的喜好。其实很多时候，HR并不是技术人员，他们只注重与一些词汇。所以，我们要学会有技巧地描述我们所做过的项目，让HR可以一眼就看中你的简历。来Offer的孙老师当时帮助我改过简历以后，我收到面试的次数大大增加。当然了，我们不仅要过HR这一关，也要让技术人员也认可你得简历。我的建议就是大家可以**多看看印度人的简历**，他们的简历就很好，很会吹，大家要学会'取其精华'。当你有了一个好的简历之后，你一定要抓住任何一个内推机会。当然有的公司并不注重内推，比如微软，这个时候就要求你们一定要在on-campus的career fair抓住机会跟面试官好好聊一下了。最后一点就是投简历的时机十分重要。如果你早一点开始投简历，只要你的简历过关，就有更大的机会拿到面试。如果错过了时机，那么除非简历非常出类拔萃，否则拿到面试的机会将会大大降低，因为你要等上一轮的人全部面试完并且全挂了才可以。\n\n**Club小助手：**现在我们都知道了内推的重要性，但像我这种认识的人不多，或者专业也不是CS相关，接触不到很多公司里面的人，有哪些获得内推的有效途径呢？\n\n**Yuning：**我就说一说我是怎么找内推的吧。首先，我在Linkedin上疯狂加人，比如本科校友，usc校友，只要是中国人我都会加，虽然并不是所有人都会回加你。等到他们加你了以后，可以写一封十分诚恳的信，介绍一下自己的情况。如果你自己能力不够、准备不充分，别人也是不大愿意推荐你的。在LinkedIn上，你也可以加一些陌生人。大家可以想象一下，如果你将来工作了，在网上收到了一个中国同胞的内推请求，只要对方不是特别粗鲁，你一般都会愿意帮忙的，对吧？（:-D）另外，如果大家报名了来Offer，那么来Offer的老师就能提供非常好的内推资源。我每次去找来Offer的孙老师，他都帮我内推了，比如我最后成功进入Google，也要感谢孙老师的大力推荐。\n\n**Club小助手：**谢谢学姐分享找内推的方法，希望大家都get到啦！Yuning学姐也提到投简历的时机很重要，请问找full-time工作的话哪个时间投比较好呢？\n\n**Yuning：**就我个人而言，我觉得投简历比较重要的时机是**八月份**。如果你没有准备好的话，九月初你一定要开始。我是九月初开始投简历，有很多比我晚一到两周的同学，他们的面试都会比我晚到三周，甚至是一个多月。这样的时间差，就可能导致当你on-site面试的预定时间到了的时候，这个职位已经招满了，那么你的面试就会被取消。如果你一切ready的话，那么八月初就可以开始找内推了。从你开始找联系人到拿到机会还是有一段时间的，更要提早开始行动。你可以列一个公司列表，管理你的求职进度。\n\n**Club小助手：**准备简历和获得内推机会很重要，面试中的良好表现才是决定成败的关键。但是我身边的很多同学对面试的概念非常非常模糊。想问一下两位学姐，在真正面试时，应该如何正确地同面试官交流？\n\n**Xiaoyue：**其实跟面试官交流的时候，首先就是不要害怕不要紧张。适度的紧张是可以的，但不要太紧张，只要当成是跟朋友交流就好。一开始你就要掌握主动权，比如跟面试官主动问好；要尽量跟面试官保持交流，让气氛轻松一点。在面试官提问之后，可以**按自己的理解重复一遍**，这样做有两个好处，一个是帮助自己理清思路，另一个是也保证自己理解对题目，如果你会错意跑题那就太惨了。在思考问题的时候也不要一言不发，要学会think loud，让面试官了解你的思路和思维方式。知道解法以后，也不要立刻下手写，而是要跟面试官解释自己要做什么。面试官要是觉得可以，他会让你写；但如果这个解法不是他想要的，他可能就会给你一些提示或者让你再想一想，这样就会特别好。\n"}}},{"node":{"title":"Subsets II 的多种解法","path":"/en/news/2017-06-02-multiple-ways-to-solve-subsets-ii/","node_locale":"en-US","id":"e9d724dd-1457-5907-8434-e47613052296","contentful_id":"9E9mFrvzTUCMcCKSM2AAG9","date":"2017-06-02T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"Given a collection of integers that might contain duplicates, return all possible subsets.Note: The solution set must not contain duplicate subsets"},"thumbnail":{"id":"d27cd825-b365-5f2d-ae3f-46ecf4f60f49","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3MKJ6fHGJqW80GGKwEo8CY/7c346879e650a4597fc0b9e083ffffd9/technical-009-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":null,"body":{"id":"3805ec18-9dc8-5547-b58d-6157257de5d8","body":"题目: All Subsets II -- with Duplications\n\nGiven a collection of integers that might contain duplicates, return all possible subsets.Note: The solution set must not contain duplicate subsets.\n\n我假设给的input nums[] 都是已经sort好的\n\nFor example:\n\nIf nums = [1,2,2], a solution is:\n\n[[2],[1],[1,2,2],[2,2],[1,2],[]]\n\n#### 解法一: pure recursion\n\n用pure recursion的话就比较难处理这个问题了，因为涉及到一个重复的问题。最简单的办法是用HashSet来帮助我们处理掉重复，但这样并不实际降低时间复杂度。让我们再来分析一下有duplication的情况下recursion的表格:\n\n![technical-009-01](//images.contentful.com/04k2xg9gplcj/3MKJ6fHGJqW80GGKwEo8CY/7c346879e650a4597fc0b9e083ffffd9/technical-009-01.png)   \n\n可以看到，从12到112这一层，新增的内容不再是12里所有的subsets，而是12中新增的subsets。这时候我们就需要在recursion里面返回或者追踪这个 新增的size 来确保我们处理duplication时的逻辑依然正确。\n\n![technical-009-02](//images.contentful.com/04k2xg9gplcj/6512KXEudymEcWyagOgagU/be69d5707a9a78fec5d92f6fa3693ddc/technical-009-02.png)\n\n#### 解法2.1: DFS (topdown)\n\n让我们再来看一下上一题的DFS recursion tree在有重复的情况下是怎么样的:\n\n![technical-009-03](//images.contentful.com/04k2xg9gplcj/3S8ARnQawwOi2i8qMUGkiK/dd11da51bc966277d88ad0c4af029927/technical-009-03.png)\n\n可以发现**蓝色**的这两段里面有重复项，去掉其中的任意一个分支便可以了。对上一题的 **解法二** 做以下修改:\n\n![technical-009-04](//images.contentful.com/04k2xg9gplcj/2O9bwKH1HOmEGCioMKy0cO/7eb6f3ec56cac1d2172c7dab60d4004a/technical-009-04.png)\n\n这就比解法一pure recursion 中要追踪一个int[] lastAdded 变量的值简单多了。\n\n**DFS的修改2**\n\n刚才做的是直接剔除一个重复的recursion分支；那么以下这个常见的做法是对 DFS recursion树 做了什么样的改变呢？这次先来看代码：\n\n![technical-009-05](//images.contentful.com/04k2xg9gplcj/VH3lYgW7UycMQesiuO0ME/e9db8691ad3d2808e12a92de88ebc091/technical-009-05.png)\n\n和上一种修改的思路不同，这次是利用'往后看'的思路来去重，以下是DFS recursion树结构：\n\n![technical-009-06](//images.contentful.com/04k2xg9gplcj/25nqHGizVOWMqG0iMQcUAu/07692ae768634e69638f2664ec9b3157/technical-009-06.png)\n\n**红色**部分为被剔除的分支，**蓝色**部分为新加入的分支。这个方法直接改变了树结构，而不仅仅是从把重复项从分支中剔除。新加入的分支直接把重复项给**跳过了(while循环 level++)**。所以，新的DFS recursion树是这样的：\n\n![technical-009-07](//images.contentful.com/04k2xg9gplcj/1uLrNCb3BSYE8IA68oscy0/ef363c5397ff33554ce6b8271cfbeb5e/technical-009-07.png)\n\n#### 解法三: 对解法二树结构的不同看法\n\n解法三的去重方式可以和 解法二.2 的相同。但是不能用 解法二.1 的去重方式。\n\n![technical-009-08](//images.contentful.com/04k2xg9gplcj/2ahmSvyzUsIcgsOYYckOc6/20b41370584d6b1cd06068a67bb83fe1/technical-009-08.png)\n\n![technical-009-09](//images.contentful.com/04k2xg9gplcj/bp8nUWtVsWwGceeYmoSOQ/7febf482db6f26c2fb2d2b79fe958979/technical-009-09.png)\n\n**解法四: 另一种DFS**\n\n对于解法三的修改，也有两种常见的模式，但这两种的逻辑是一致的(产生的recursion tree一样)。\n\n![technical-009-10](//images.contentful.com/04k2xg9gplcj/f8l7gcqamkcgQaQUWUcU8/071ef9b7d1fd2cc7f655209b1aeb9c36/technical-009-10.png)\n\n需要被剔除的是**蓝色**这段分支。\n\n![technical-009-11](//images.contentful.com/04k2xg9gplcj/5b4ssgE4JyQUkE4g46M4kM/7b79a70c6ff41fe301e60e300d5193b1/technical-009-11.png)\n\n或者\n\n![technical-009-12](//images.contentful.com/04k2xg9gplcj/1iwgNf0wde82C2oMQK4ikS/3084c9297f95d1ba906eb5bf272440ae/technical-009-12.png) \n\n以上，分别从四种常见的解All Subsets的方法来分析他们背后的逻辑和思路。还有一些其他的解法，比如iteration，bit operation mapping，或者是其他结构的recursion tree本篇不再赘述。\n\n参加**来offer**学习的不仅仅是一些更高效的算法和好的归纳总结，更多是培养解题思路和方法，让知识结构系统化，从而提高自己分析问题的能力。而这些能力，才是面试中真正需要表现出来并且能打动面试官的。\n"}}},{"node":{"title":"对话无人车顶尖专家, 0距离体验无人车魅力","path":"/en/news/2017-06-25-autonomous-car/","node_locale":"en-US","id":"ec56f5b7-eb36-5389-8301-cd353491042f","contentful_id":"9E9mFrvzTUCMcCKSM2AAG14","date":"2017-06-25T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"'无人车'作为科技界风口浪尖的热门领域，近来一直备受关注。来Offer在新兴无人车技术公司——JingChi.ai举办了第二期'LaiTalk高端职业论坛'，在工业界专家的带领下，近距离感受了无人车的魅力。简单开场之后，JingChi公司的CTO——Tony Han，为大家介绍AI领域的发展现状，以及JingChi的技术优势和企业文化。"},"thumbnail":{"id":"d2fa5e8b-5648-5a95-b849-efcfadbfcacb","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1UgMjzVnVusGGwCe4EQOWS/aee47d8771dea1373e4cf922f2809a1b/028-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":null,"body":{"id":"185e8b6f-3a34-55a7-9fa8-58c74a04a7ea","body":"'无人车'作为科技界风口浪尖的热门领域，近来一直备受关注。来Offer在新兴无人车技术公司——JingChi.ai举办了第二期**'LaiTalk高端职业论坛'**，在工业界专家的带领下，近距离感受了无人车的魅力。简单开场之后，JingChi公司的CTO——Tony Han，为大家介绍AI领域的发展现状，以及JingChi的技术优势和企业文化。**\n\n**Tony Han**\n\nCTO. UIUC ECE PhD. 前百度自动驾驶事业部首席科学家、密苏里大学终身教授。在百度任职期间，曾带领感知、仿真、硬件等团队，同时从事AI领域研究，主要为计算机视觉，机器学习和语音识别方向。曾获 2011 年国际人脸表情识别与分析大赛特定人识别第一名，2012 年国际计算机视觉动作识别大赛第一名， 2013 年 ImageNet国际物体检测大赛第二名。\n\n**为什么选择进入无人车领域？**\n\nTony Han说，每年很多人死于交通事故，而自动驾驶技术将有望让出行变得更安全，更舒适，更高效。而中国也十分有可能成为无人车领域迅速成长的沃土。Tony Han介绍说，中国的基础设施做的非常好，中国政府提供更有力的支持，这一切都能让自动驾驶的普及更快实现。\n\n讲到JingChi公司的发展，Tony Han更加激情澎湃。作为一家根植于中国市场、服务中国大众的技术公司，JingChi在成立短短2个月就取得了突破——成功获得CA VAT Permit，可以进行实地驾驶测试，这是其他Startup从未达到过的速度。 Tony Han现场播放了无人车'钻杆测试'视频，在拿到汽车3周之后，公司就让汽车出色地完成了钻杆动作，可谓神速。 其他优势还包括定位技术，高质量的HD Map，Deep Learning技术应用等等。 因为有了过硬的团队和技术，JingChi也在第一轮就完成了$30 Million的融资，与OEM厂商也建立了稳定的合作关系。\n\n无人车是工业界多种尖端技术的结晶，Tony Han向大家简单介绍了无人车涉及到的15大核心技术，包括HMI，Sensing，HD Map，Perception，Localization，Planning，Prediction，Decision，Control，OS，Embedded Server等。 其中一个最考验技术水准的难点就是ADS——Automatic Driving Scenarios. 在实际驾驶中，无人车必须预先建立和储备大量的ADS以应对复杂的路况和场景。JingChi正试图通过先进的Deep Learning技术来解决这一问题。 Tony Han的分享结束后，一些在场同学也提出了他们的问题，涉及产品设计到技术等各个层面，Tony Han都一一发表了看法。\n\n![028-01](//images.contentful.com/04k2xg9gplcj/1UgMjzVnVusGGwCe4EQOWS/aee47d8771dea1373e4cf922f2809a1b/028-01.png) \n\n**来Offer校友分享环节**\n\n接下来，主持人请上来Offer校友、刚刚加入JingChi团队的金秋，分享她的求职故事和在JingChi工作的感受。 金秋学姐在UCR取得博士学位，研究方向侧重于交通和环境方向的智能系统的应用。 她坦言，博士刚毕业时汽车行业不甚景气，周围很多同学都放弃了多年的研究方向，做了'General Coder'。但是她觉得舍弃自己多年的研究经验十分可惜，且对汽车行业抱有热情，因此决定仍坚守阵地。凭着这份热忱与执着，以及在来Offer的捶打磨练，金秋通过吕老师的引荐，认识并最终加入了JingChi团队。金秋说，没想到自己在坚持梦想的过程中，无人车的时代就这么来临了。现在的工作很喜欢，也很适合自己。\n\n谈到同学们都关心的面试和求职，金秋分享了不少宝贵经验。首先，自己在面试前做了很多准备，来Offer的老师们也给予了很大的帮助。其次，去面试之前，要对整个行业和职位做足了解。最后也是至关重要的，**就是拿出自己对职位和专业的热情**。金秋认为，自己在面试时表现出的对无人车的热情，帮助她打动了团队，也让她能够快速融入团队。在入职短短一周的时间里，给金秋触动最大的就是公司的成长速度。来公司第二天就开始Code Review，紧接着马上投入到真正的工作当中，即便是不精通的领域也要在实践中'补课'。 不过，团队里所有成员都很有经验和技术，热心给予帮助和指导，让金秋觉得每天都收获良多，充满成就感。\n\n**参观无人车**\n\n![028-02](//images.contentful.com/04k2xg9gplcj/3dR89GfpxS2OOaYw26AUuS/a7afe7357408a2701faf8672c53a271c/028-02.png)\n\n接下来，同学们在JingChi工程师团队的带领下前往车库，实地参观JingChi的无人驾驶汽车。对同学们提出的问题，工程师们耐心地给予解答，现场交流气氛十分活跃。\n"}}},{"node":{"title":"Subsets I 的多种解法","path":"/en/news/2017-05-26-multiple-ways-to-solve-subsets-i/","node_locale":"en-US","id":"04c7d9f4-9b5f-5548-9e9d-b95b77a03a8d","contentful_id":"9E9mFrvzTUCMcCKSM2AAG8","date":"2017-05-26T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"Given a set of distinct integers, nums, return all possible subsets."},"thumbnail":null,"thumbnailAlt":null,"authorProfile":null,"body":{"id":"e3a094ec-1d80-566b-a0c4-7adfe23a1a43","body":"题目：Given a set of distinct integers, nums, return all possible subsets.\n\n* Note: The solution set must not contain duplicate subsets.\n\n* 我假设给的input nums[] 都是已经sort好的\n\nFor example,\n\nIf nums = [1,2,3], a solution is:\n\n[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]\n\n**解法一、pure recursion (bottom up)**\n\n由要解决的problem的定义出发，尝试划分成相同problem的子问题，并且利用子问题的结果来解决原来的问题，而最关键的点有两处：**base case**和**induction rule**。\n\n**base case代表的是最小号的不可分的问题，induction rule表示的是如何利用子问题的结果。**比如，我们要找 'abc' 的所有subsets，我们可以尝试先划分子问题找到induction rule：先找到“bc”组成的所有subsets {'', 'b', 'c, 'bc'}，由'abc'组成的所有subsets包含两类：1）包含'a'的subsets 和2）不包含'a'的subsets。\n\n我们可以看到2）就是子问题'bc'的结果，而1）可以由2）的每个subset加上元素'a'来组成，依次类推。而另一个关键点base case：最小的不可分割子问题，也就是''的所有的subsets，自然只包含一个元素''。针对原来的问题，将递归的过程从下往上表现出来如下所示，当递归深度是nums.length时，这个解法利用的是下一层recursion的结果来生成这一层的结果。\n\n![technical-008-1](//images.contentful.com/04k2xg9gplcj/3EAhZrqz3iIk4a4eWeQMCm/51f5cd17e10a16ada9db5ddb2d9f0591/technical-008-1.png)\n\n![technical-008-5](//images.contentful.com/04k2xg9gplcj/3GFLBQgoJWYqwm00a2wK6A/e18b2da75d9743a9dc6f2a06933eb9f1/technical-008-5.png)\n\n优点: 思路简单\n\n缺点:在不需要返回所有的结果的时候比较浪费空间，因为当前层recursion必须要知道下一层的全部结果\n\n**优 化**\n\n计算机在进行递归的时候会有额外的栈上的空间开销，当递归层数很深的时候回有可能stackoverflow，这是一个我们需要注意和重视的情况。从上面的解法不难看出，我们可以比较容易的将它转化成Iterative的解法，从最小号的问题开始解决，利用相同的induction rule，这也是Dynamic Programming解法最根本的来源。\n\n![technical-008-6](//images.contentful.com/04k2xg9gplcj/6fRtl0G1QkS6yqSqWyM04m/d02aa9c76d708a5dd54dfa266ef99868/technical-008-6.png)\n\n**解法二、DFS (top down)**\n\n根据孙老师的传授的要诀，用DFS基本方法解决问题时要明确两点:\n\n<div class=\"blog-content-add-padding blog-content-add-border\">\n\n1\\. 每一层代表什么含义\n\n搜索到当前层时所有可能的解(孙老师授课时对这个问题描述得更深刻，我没有完全理解)\n\n2\\. 每层有多少个状态需要尝试\n\n对于subsets有两个状态：加 或 不加 当前元素\n\n![technical-008-6](//images.contentful.com/04k2xg9gplcj/6fRtl0G1QkS6yqSqWyM04m/d02aa9c76d708a5dd54dfa266ef99868/technical-008-6.png)\n\n**代码比解法一简单很多:**\n\n![technical-008-7](//images.contentful.com/04k2xg9gplcj/2A3bI6K2B2ya6wAY6osiWu/fc6c97f0c56637994ec66ad1a374ef13/technical-008-7.png)\n\n**解法三、对解法二树结构的不同看法**\n\n在得到DFS Recursion tree之后，我每次都是从leaf node取值。那么从树结构的中间取值可不可以？答案是可以的。\n\n![technical-008-3](//images.contentful.com/04k2xg9gplcj/5lL9O59mfY8SkwiQMKmwqK/fcc34df52a3f17617e39062bbedaca3e/technical-008-3.png)\n\n观察发现，每次都取左节点的值(包括root)，可以得到同样的结果。或者换一种角度看，因为所有的右leaf节点都可以有多个父节点与之对应，而与之对应的父节点肯定不是leaf节点。再观察发现这些多个节点中只有一个左节点。并且，除了左leaf节点外，其余的左节点都有恰好对应一个右leaf节点。需要多引入一个 boolean on Left 的变量来判断。这里并不能完全省略所有的右节点，因为右节点帮助我们再生成下一层的左节点。\n\n![technical-008-8](//images.contentful.com/04k2xg9gplcj/4Btkm679de408i0yuSYkO6/96d735850029a949a6ca22d8ff79604f/technical-008-8.png)\n\n**解法四、另一种DFS**\n\n![technical-008-4](//images.contentful.com/04k2xg9gplcj/1RIF1ugYWIiQUgIUw0SYUg/a01a9a1ffcc7e03293c8e0c684a00cb0/technical-008-4.png)\n\n这也是另一种常见的DFS思路，依然根据孙老师传授的要诀来解释这种思路:\n\n**1\\. 每一层代表什么含义**：长度相等的所有可能性\n\n**2\\. 每层有多少个状态需要尝试**：每一层新增的状态根据上一层来决定，如果上一层打印到了nums[st], 则这一层新增的状态是从 st + 1 到 nums.length - 1\n\n<div class=\"blog-content-add-padding blog-content-add-border\">\n\n**划重点**\n\n这个思路用到的是另外一种构建subset的方法：**'每个size为k的subset都是由一个size为k-1的subset加上一个元素得到的'**。而我们在构建subset的过程当中要**避免出现重复**，比如：'123'， '132'， '213'，'231'，'312'，'321'这几个都是相同的subset，我们只应该让它在我们的构建方法中出现一次，否则会有重复。\n\n常见的Intuition是**“如果我们在构建subset的过程中保持一定的顺序，那么上述这些可能出现的subset只会出现其中的唯一一个！'**，那么我们可以选用的方法是，在构建subset的过程中，每次新添加的元素**保持递增**的顺序，这样'132'，'213'等等都不会出现在我们的结果里面，当我们已经有了一个size为1的subset '2'，我们是不会再把“21”构建出来的，下一次新添加的元素只能是比2大的所有选择。\n\n![technical-008-9](//images.contentful.com/04k2xg9gplcj/4wQ1uPUoYouiYwKMUE4waU/8fc998a0cb0c89381b5db9f83b5a1475/technical-008-9.png)\n"}}},{"node":{"title":"Maximum Subarray Sum Problem","path":"/en/news/2017-05-03-maximum-subarray-sum-problem/","node_locale":"en-US","id":"2f5c38cf-3b64-5503-8d5f-797e6a9803fa","contentful_id":"9E9mFrvzTUCMcCKSM2AAG5","date":"2017-05-03T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"Recursion is one of the most powerful algorithm design technique that it allows you to solve a complex problem by programs that are extremely concise and easy to reason their correctness. Basically, you need to reduce the original problem into one or more simpler instance of the same problem. The subdivision will continue until the instance we get can be solved directly. The maximum subarray sum problem is one of the classical algorithm problems and it is stated as follow:Given an array that contains n integers, try to find the subarray that has the largest sum and return this sum.Though people may be already very familiar with the optimal solution, we are trying to solve this problem in a hard way from **a pure recursion perspective**, only by which we are able to perceive the beauty and elegancy, and to obtain a deeper appreciation of recursion."},"thumbnail":{"id":"7d45b728-01ca-5422-baa2-75cb4cb522f4","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/2UUN9MIe64Cesimg2aGaQu/d9eeab51833cf9440c418aa95590c908/technical-016-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"dc9f5372-6e4a-59da-8bdd-9ba2cbac0f06","body":"Recursion is one of the most powerful algorithm design technique that it allows you to solve a complex problem by programs that are extremely concise and easy to reason their correctness. Basically, you need to reduce the original problem into one or more simpler instance of the same problem. The subdivision will continue until the instance we get can be solved directly. The maximum subarray sum problem is one of the classical algorithm problems and it is stated as follow:Given an array that contains n integers, try to find the subarray that has the largest sum and return this sum.Though people may be already very familiar with the optimal solution, we are trying to solve this problem in a hard way from **a pure recursion perspective**, only by which we are able to perceive the beauty and elegancy, and to obtain a deeper appreciation of recursion.\n\n**1\\. The 'brute force' recursive definition**\n\nIf we think about the **location** of the subarray with the maximum sum, there are only two possible cases:\n\n1) Either it is the current array itself.\n\n2) Or it is **completely contained within one of the two parts** after the partition of the current array. Since we do not know the exact part, the simplest way to make sure we have the desired answer is to try every possible partition and the resulting parts and pick the one with the largest answer.\n\nBased on this analysis, let’s recursively define **the maximum subarray sum of the input array A[1..n], which we denote by MaxSubarraySum(A[1..n]).** We will have\n\n![technical-016-01](//images.contentful.com/04k2xg9gplcj/2UUN9MIe64Cesimg2aGaQu/d9eeab51833cf9440c418aa95590c908/technical-016-01.png)  \n\nThe python code is as follow:\n\n![technical-016-02](//images.contentful.com/04k2xg9gplcj/7a1bD2xol2KqyWIgmkUecq/a2e8f14fdfe37d6d459c866ed91220ed/technical-016-02.png)\n\nWhat will be the time complexity then? If Tn is the total number of compares and additions to solve the maximum subarray sum problem with n integers, we have T1 = 0 and\n\n![technical-016-03](//images.contentful.com/04k2xg9gplcj/5txSYQWDYc2OmIQcmiuwO2/d1dec3ee7679b9f05843a0be83dd061f/technical-016-03.png)\n\nTo get the total number of compares and additions, we add the number of compares(which is n - 1 inner max operators and n - 1 after applying the outer max operator) and the number of additions (which is n - 1) for the reduction stage after the recursion to the number of compares and additions used for the subarrays after partitioning.When the partitioning element is the kth element, the subarrays after partitioning are of size k and n - k.\n\nYou can see that now our analysis reduces to the above equation that does not depend on properties of the algorithm. First, let us change the second part of the sum of the right side because of the symmetry to get:\n\n![technical-016-04](//images.contentful.com/04k2xg9gplcj/1egMczI7cK4o4kqWO4iYGc/bd9781919cbd952cee7d387fc41a01f0/technical-016-04.png)\n\nThen subtract the same formula from the formula for n + 1 to eliminate the sum and rearrange terms to get:\n\n![technical-016-05](//images.contentful.com/04k2xg9gplcj/7o1MaT4RgckAIG2W62s4qk/7edb0ec8abb7c4ef40a9c8a832656e66/technical-016-05.png)\n\nThis can be solved by adding both sides by 3 / 2:\n\n![technical-016-06](//images.contentful.com/04k2xg9gplcj/65XQkQNKp2SsCg60sCciQA/952c73e88cdbc58e6c7f14895ca5074d/technical-016-06.png)\n\nIterating, we have our final result since T1 = 0:\n\n![technical-016-07](//images.contentful.com/04k2xg9gplcj/3U5o8ys15YKA8WcW80ese6/130f6ffea3defee196c0ef7928069f82/technical-016-07.png)\n\nThus,\n\n![technical-016-08](//images.contentful.com/04k2xg9gplcj/64tGH4wgBqiismc0aekIIY/fe38af0dd1066ae78fa46b13952048d6/technical-016-08.png)\n\nAs the above analysis shows, it is exponential.\n\n**2\\. Can we improve on top of this? Definitely.**\n\nThe obvious reason why it is so slow is because it recomputes the result for the same subarray from scratch over and over again. In order to speed up our recursive algorithm, we can mark down our recursive results and look them up again if we need them later. This is called memoization. For python implementation, what we need to do is add a cache to store the results of our recursive call and only perform the actual calculation on a certain instance of the problem if we do not encounter it before. Using decorator syntax in Python allows us to alter the functionality of a function without actually changing the source code of that function. Also, the code is more readable:\n\n![technical-016-09](//images.contentful.com/04k2xg9gplcj/Tkn6M43VOmMM6CiEyqmIg/5a25220e5a83c0e51dccb39fe1cf87dc/technical-016-09.jpg)\n\n**Doing memoization clearly helps to reduce the time complexity,** but by how much? Pay attention to the way we fill our cache: each entry (i, j) is filled only after all of its predecessors (i, k) and (k, j) when i + 1 <= k < j are filled. If we ignore the time we spend in recursive calls, it requires linear time to evaluate the recurrence for each problem instance - subarray that starts at i and ends before j of the original input array. Since the recurrence for cache(i, j) is evaluated once for each pair, we can conclude that the new implementation will perform O(n^3) operations, an exponential time improvement over the naive recursive algorithm. **A further improvement is once we see how the cache is filled, we can replace the recursion with a specific computation order to fill this cache efficiently.** I will omit the code and let you guys to figure it out:-)\n\n**3\\. Can we still improve on top of this? Definitely.**\n\nDo we really need to try out every possible partition? If we can reduce this, then we can improve our algorithm significantly. Let us think again about the **semantics** of MaxSubarraySum(A[1..n]): we will find the subarray that has the largest sum among all those subarrays of which the length is less than or equal to n. If we focus on the length, then there are only two possibilities that a certain subarray is the desired answer: 1\\. Either the subarray of which the length is n, which means the original array iteself, has the largest sum2\\. Or a subarray of which the length is less than n is the one. But this case will be covered by the union of all the subarrays of A[1..n-1] and all the subarrays of A[2..n] because this set covers all the subarrays of which the length is less than or equal to n - 1.Based on the analysis above, we will have\n\n![technical-016-10](//images.contentful.com/04k2xg9gplcj/2I434xqnT2y2k2EMIemCYu/f924cac9e79ab3c4750e1a787efb635c/technical-016-10.png)\n\nWhen we implement this algorithm, in order to have a good time complexity, we can use the same memoization technique to avoid recomputation for the same instance and **precompute the sum of all the possible subarrays** (In the following code, I intentionally use the old way to calculate the sum in order to keep the codes succinct.):\n\n![technical-016-11](//images.contentful.com/04k2xg9gplcj/17KjtVsGmyqSkq0iyAsAEs/3d37ddfce1fff0d82fd475f874040326/technical-016-11.png)\n\nBy doing this, since we have O(n^2) different instances of the problem and each instance is required O(1) time to be evaluated because we do not have to spend O(n) time to do the summation and number of other instances it depends on is only 2, also, it is evaluated once as well, so the total time complexity is O(n^2).\n\n**4\\. Can we do even better than this? Definitely.**\n\nLet us look at the first recursion method: We will try solve the maximum subarray sum problem for every subarrays after every possible partitioning and the final answer will be picked between the largest one among them and the sum of the input array itself. The reason we need to enumerate all the possible partitions is because this will guarantee that the subarray with maximum sum will be contained by one of the partitioning result if the input array itself is not the answer. But, the question is, do we really need to do this enumeration? For a given partitioning, let’s say the subarray with maximum sum is not contained by any of the two subarrays, then there is only one remaining possibility:\n\n![technical-016-12](//images.contentful.com/04k2xg9gplcj/4M5gqdIjQ4EK2k8wyeQ4Ks/170491b6f2d69e9adb3860e0389be7d0/technical-016-12.png)\n\nAs the above graph shows, the red subarray is the subarray with largest sum and is not completely contained with the left subarray or right subarray after the partitioning (denoted by the black vertical line). It actually contains two parts: **a suffix subarray of the left part which has the largest sum and a prefix subarray of the right part which has the largest sum.** That means we do not need to waste our computation power for computing results of all the possible partitioning. We just have to look at one particular partitioning results and to handle the third case specially. Let’s say we the subarrays we have after the partitioning are almost the same in size. Then we will have the following new recursive rule as follow:\n\n![technical-016-13](//images.contentful.com/04k2xg9gplcj/1Z2DHjxYVCmAS02cu06cGE/bf26338fbdd95fabebdaa49d7ace860a/technical-016-13.png)\n\nFor the MaxSuffixSum(A[1..t]), the easiest way to do it is to enumerate all the possible suffix subarrays of array A[1..t] and pick the maximum one. The process for computing MaxPrefixSum(A[t + 1..n]) is also basically the same. The following is the python implementation for the aforementioned rule(In this implementation, I use generator to avoid list slicing):\n\n![technical-016-14](//images.contentful.com/04k2xg9gplcj/2u0cXMeLx2mQYOO24cMik2/509feaaf071fc9ed6a2067a3b33cf7a9/technical-016-14.png)\n\nFor the time complexity, since we will first recursively solve the two subproblems that are both half in size and then use O(n) time for the remaining part, we can easily see that the final answer is O(nlogn).Looks good? But we haven’t **fully utilize the power of a recursion**. Notice that we have to spend O(n) time to do the calculation for the third part, is there any way to reduce this? What happen if we delegate the computation to the recursion?Let’s define **MaxMetrics(A[1..n]) to be a tuple of (MaxSubarraySum(A[1..n]), MaxSuffixSum(A[1..n]), MaxPrefixSum(A[1..n])).** Basically, it means solving MaxMetrics(A[1..n]) will give us those three results we care about. Now, we need to answer what the recursion rule for MaxMetrics(A[1..n]) will be.Since we have a working recursion before, let’s try to improve on top of that. For MaxSubarraySum(A[1..n]), we do not have to do anything special. Everything should remain the same. But, for MaxSuffixSum(A[1..n]) and MaxPrefixSum(A[1..n]), how can we find the answers for them based on the results of solving two subproblems that are both half in size?Let’s look at MaxPrefixSum(A[1..n]) first because these two are symmetrical. Now, if we think about the relationship between a specific prefix subarray of A[1..n] and the left half subarray of A[1..n], we will only have two possibilities:\n\n1\\. Either the prefix subarray with the largest sum is completely contained by the left half subarray\n\n2\\. Or the prefix subarray with the largest sum contains the left half subarray completely. Essentially, it consists of the whole left half subarray and the prefix subarray with the largest sum of the right half subarray\n\nClearly, that means:\n\n![technical-016-15](//images.contentful.com/04k2xg9gplcj/2RXA0CKo80W6suEiIIwMiq/23efbd54e89c8db0b0bcadbfe4c6d847/technical-016-15.png)\n\nAnd, the MaxSuffixSum(A[1..n]) is as follow:\n\n![technical-016-16](//images.contentful.com/04k2xg9gplcj/4hp15DhGxqcsekiEmmUW0E/3c836332b87af533d0e4b13e9fe00955/technical-016-16.png)\n\nNotice that if we still do the summation in a native way, the total time complexity for calculating the MaxPrefixSum(A[1..n]) will still be O(n). So what if we also delegate summation to our recursion? Since it is pretty easy to calculate the Sum(A[1..n]) from the results of those two subproblems because\n\n![technical-016-17](//images.contentful.com/04k2xg9gplcj/23sUdsCr0Qw80cSkmwGeGI/64cdbd287b661ef0c81929af7777e229/technical-016-17.png)\n\nSo, let’s refine our recursive definition of MaxMetric(A[1..n]): It should consist of MaxSubarraySum(A[1..n]), MaxSuffixSum(A[1..n]), MaxPrefixSum(A[1..n]) and Sum(A[1..n]). The implementation in Python will be as follow(I will use named tuple to represent those 4 targets we want to calculate for MaxMetric(A[1..n])):\n\n![technical-016-18](//images.contentful.com/04k2xg9gplcj/5uTWUpxKEg0o6SAqmiAKwS/0c56d1df85b315f093420437e116d52a/technical-016-18.png)\n\nWhat is the time complexity this time? Well, since we reduce the O(n) workload at the current recursive call to O(1), that means if we use the same notation for the time complexity analysis from the first part of this article, we will essentially have:\n\n![technical-016-20](//images.contentful.com/04k2xg9gplcj/aF3FdeAdmo8coaKUey8gG/aa75a489dccbefb14e42399f9b4055e5/technical-016-20.png) \n\nExpanding this equation or using the master theorem will give us the final answer for Tn: O(n). We can take another route since the previous improvements are all based on the very first “brute force” recursive rule. Next time, we will look at our second recursive rule to see where the recursion can lead to. Keep tuned!\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"Next larger number in a sequence","path":"/en/news/2017-02-28-next-larger-number-in-a-sequence/","node_locale":"en-US","id":"7d79f0f8-b1a2-5519-ad40-01c3dbccf4a5","contentful_id":"8E9mFrvzTUCMcCKSM2AAGq","date":"2017-02-28T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"Given a sequence of integers, for each number, find the index of the next higher number, which is on the right side of the current number."},"thumbnail":{"id":"d9d774e7-ac05-566b-8f7c-0a7cc7c8afba","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3dTYcul7rqK60wOak2yIqe/6ebfe8c80e7e9c426c2bf5772aea0473/technical-019-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"5d596f29-9ede-5d08-a966-26533c31cf46","body":"Given a sequence of integers, for each number, find the index of the next higher number, which is on the right side of the current number.\n\n给一个含有n个整型数字的数组input，对于其中每一个数字，找到其右边第一个比它大的数的位置(index)，如果不存在符合要求的数，则用-1表示。例如：Input: [3, 2, 1, 4, 1, 9]Output: [3, 3, 3, 5, 5, -1]\n\n解题思路\n\n**暴力解法往往会被很多同学忽视，而实际上它有着极为重要的作用：**从工程的角度上来讲，有一个解决方案永远都好于没有解决方案，而工程师首先需要能够有一种方法来解决问题。从算法设计的角度上来讲，知其然更要知其所以然，所有的算法都是对暴力解法的层层优化，用一种更有效率的方法来解决问题。在这个过程中能够体现出的观察力，分析能力才是解决问题的法宝，也是成为一个高质量的工程师能力和核心竞争力最好的体现。\n\n首先，当我们看到这道题，我们至少应该得到一个最暴力最原始的解法。暂且称之为Naive解法。这个最暴力的解法就是：**对于每一个数组中的数，都过一遍这个数组，把我们所要找的数找到。**\n\nSolution 1: Naive解法算法：利用两层循环。针对数组中每一个数字，以其右边作为起始位置，向后搜寻第一个比它大的数。\n\n代码如下：\n\n![technical-019-01](//images.contentful.com/04k2xg9gplcj/3dTYcul7rqK60wOak2yIqe/6ebfe8c80e7e9c426c2bf5772aea0473/technical-019-01.png)\n\n该种解法的**最坏情况**发生在：当数组中的数是完全递减的时候。这样就需要n*(n-1)/2次比较。所以，**Naive解法的时间复杂度是O(n^2)，额外空间复杂度是O(1)。**通过观察和分析找到已有解决方案中效率不高的步骤来进行优化。观察的关键在于找到原有方案中效率不高的部分，一般来讲可以分为两大类：\n\n**不必要的计算**\n\n**重复的计算**\n\n在这个过程中，利用观察例子来找到规律是必不可少的步骤，而用例子来帮助理解和解释问题也是最有效的方法。我们可以通过观察例子进一步考虑如何优化时间复杂度：**在基本解法中，每一个数字都被多次比较。**例如：在示例的input中，3要和2比，再和1比，然后和4比较才能得知4是3的下一个较大的数；2也需要先和1比较，再和4比较才能得到它对应的结果。实际上，如果我们知道了2比3要小，当2和1比较时，得知1比2要小的时候，我们并不需要再将3与1进行比较了。这样的比较其实是多余的。基于这一点，我们可以进一步考虑如何优化Naive方法。很显然，如果我们可以提前比较3与2之后，又比较了2与1，那么3和1就不需要再比较了。从中，我们可以发现一个规律，[3, 2, 1]是一个递减的数组，当一个新的数字到达，它比当前的数要小的话，那么它一定不是当前数之前数字的结果。我们可以借用一个stack维持一个非递增数列从而实现这样算法，移除多余的比较。基于此，我们可以得到如下解法：\n\nSolution 2: 优化数据结构选择\n\n**额外的数据结构—stack:** 利用一个stack去记录所有非递增的数列。存储这些数的index。算法: 从左向右扫描input数组。\n\n**分成两个cases来处理：**\n\nCase 1: 如果当前栈为空或者新扫描到的数字比当前栈顶的数字要小，就把新到的数字加到栈中。\n\nCase 2: 如果新扫描到的数字比当前栈顶要大，我们就开始从栈中pop出数字，并把pop出来的数字的对应结果记为当前数的index。\n\n终止条件：扫描完所有的数字。栈中还剩余的数字为没有下一个较大数的数字。\n\n代码如下：\n\n![technical-019-02](//images.contentful.com/04k2xg9gplcj/66ERn3dKVysYSg62qKAGGM/dc217cdd15154aa22e2ee6d47e1c74b9/technical-019-02.png) \n\n针对数组中的每一个数，其最多入栈出栈一次。此种方法的时间复杂度是O(n)。使用了一个额外的stack，最坏的情况是所有的数字都被压入栈。此种方法的空间复杂度也是O(n)。\n\n**自主的继续发现问题和解决问题，永远不满足于现有的解决方案是我们应有的态度。**\n\n**对现有方案效率的分析可以帮助我们继续寻求更优的方法，层层推进继续尝试其它的突破口。**\n\n在面试中，如果能给出上述方法，一般来说，可以达到面试官的要求。**但是，我们能不能进一步思考，并提出一个解法，把空间复杂度也给优化了呢？**让我们回顾一下Naive解法，我们会发现，Naive解法并没有利用已经找好了的数字。**如何利用已经计算过的结果是如何优化空间复杂度的关键。**我们可以试图从这一点入手，尝试使用已经得到的信息。对于每一个i]。我们可以尝试从紧邻其右边的第一个数input[j], j = i+数input[i]，假使对于所有input[j], j>i，我们已经找到答案。我们所要做的是找到当前数input[i]所对应的答案output开始查找，如果这个数字比当前数字大，很显然当前数字的答案已经找到。如果input[j]小于input[i]，并且input[j]并没有next larger number，很显然input[i]也不会有next larger number。如果input[j]小于input[i]，但是input[j]存在next larger number，则说明index在j与output[j]之间的数小于input[j]，很显然这些数也会小于input[i]，那么这些数字一定会小于input[i]，我们不需要考虑这些数，直接跳到j=output[j]进行下一轮判断。从后往前对input数组进行扫描，通过这样的一种算法，我们就可以利用已经找到的结果，从而减少时间复杂度。\n\nSolution 3:\n\n算法：从后往前扫描，针对每一个数（index记为 i ）。Initialization： j = i + 1\n\nCase 1: 如果input[j] > input[i]，则output[i] = j.\n\nCase 2: 如果input[j] <= input[i]，则：Case 2.1：如果output[j] = -1，则output[i] = -1。Case 2.2：否则，j = output[j]。重新开始判断。\n\n终止条件：扫描完所有input数组。\n\n代码如下：\n\n ![technical-019-03](//images.contentful.com/04k2xg9gplcj/3ovEIFllYQKkoGyU4OKgme/538ba8e7eaadd35a78eb8e2eeb6fc55f/technical-019-03.png)\n\n从上述代码可以看到，针对每一个数字，操作j = output[j]至多计算一次。同时外围的循环i也是一轮遍历。**所以该算法是一个线性算法，时间复杂度亦为O(n)。**同时，由于该算法并没有使用额外的存储空间，**我们可以认为其空间复杂度是O(1)。**在对基础数据结构和算法扎实的理解的基础上，通过大量的练习，思考和总结才能真正开拓思路和提高系统的分析能力。\n\n**对大家的小建议是：**\n\n不要急于尝试思维跳跃来寻求最佳解决方案，欲速而不达。\n\n重视基本解法，从最基本的解法出发，通过多个例子来加强自己的观察能力和找到优化突破口的能力。\n\n永远不要放弃尝试，对于现有方案时间和空间复杂度的分析是层层推进的起点。\n\n图片来自网络，版权属于原作者"}}},{"node":{"title":"抽到H1B这天, 我想对她们说: Fight Like A Girl！","path":"/en/news/2017-04-22-fight-like-a-girl/","node_locale":"en-US","id":"4176dc79-ac22-5720-b70e-4fb9d1cbb104","contentful_id":"9E9mFrvzTUCMcCKSM2AAG4","date":"2017-04-22T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"张阗，任职于Snap，热爱旅行和码字。两年半前来到美国，从EE学生转型软件工程师 。来Offer 2015年冬季班学员 今天，收到了抽中H1B的消息。一时间，突然有很多话想说。感谢的话要说… !![course-022-03](//images.contentful.com/04k2xg9gplcj/1QTRb7Kz3u4aEcaYKoqs4o/fb5479e2a28216785f4104616ad635c9/course-022-03.png) 还有一些话，想说给那些和曾经与我一样，如今正对未来迷茫、对梦想困惑的女孩们。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":null,"body":{"id":"333253bb-86fb-5280-ba3c-460d6ee483a1","body":"**张阗，**任职于Snap，热爱旅行和码字。两年半前来到美国，从EE学生转型软件工程师 。**来Offer 2015年冬季班学员**\n\n今天，收到了抽中H1B的消息。一时间，突然有很多话想说。感谢的话要说…\n\n![course-022-03](//images.contentful.com/04k2xg9gplcj/1QTRb7Kz3u4aEcaYKoqs4o/fb5479e2a28216785f4104616ad635c9/course-022-03.png)\n\n还有一些话，想说给那些和曾经与我一样，如今正对未来迷茫、对梦想困惑的女孩们。\n\n'女孩子嘛，别整天跟着一群男孩疯跑，腿上摔个疤穿裙子多难看。'\n\n'男孩子啊，多放出去跑跑，摔几跤才是男子汉。'\n\n'女生嘛，作业不会做还有男朋友。'\n\n'男生啊，一定得好好学，不然怎么给女朋友讲题。'\n\n'女人嘛，何必一个人在外面那么辛苦，还是嫁个好人家最重要。'\n\n'男人啊，多出去闯荡闯荡，先立业后成家。'\n\n大概很多人都是听着这些话长大的。我和很多女孩一样，曾经也顺理成章地接受了这些设定：\n\n女孩要文静；女孩太聪明不好；女孩不用太拼。\n\n可这些话有多荒唐，说的人没意识到，听的人也未必意识得到。\n\n我的硕士学校在**美国中部，**那里软件工程师岗位比较少，即使有，工资水平也低得可怜。不怕你笑，在那里，我曾经的package是一年两万五千刀，似乎还能勉强糊口。所以快毕业的时候，我就计划搬到西海岸的湾区去，毕竟硅谷在那里。我试图劝几个妹子一起过去，但她们都提出了各种担心——'那儿人生地不熟的，生活多不方便'，'那么远，搬过去多辛苦'。\n\n最后搬到湾区的十多个人只有两个女生，我是其中之一。\n\n我从来没去过湾区，也没有任何朋友在那里。2015年12月，飞机在旧金山降落的时候，我不知道接下来几个月住在哪里，不知道手里的钱什么时候会花完，更不知道这段失业的日子会有多长。湾区的冬天寒冷多雨，一点都没有想象中阳光加州的样子。我找了一个偏远但便宜的单间，房子里的租客互相都不认识。湾区公交不便，我没有车，离一起去的几个同学也特别远。**我常常一整个星期都不开口说一句话，**唯一一次出门就是去楼下的超市，认真地在一个个价签里找出最便宜的那个。刚开始的两个月，我投了上百家公司一个都没有回音。最让人崩溃的不是失望迷茫，而是不知道这片失望迷茫的浓雾还有多远。**失声痛哭是常有的事，可是除了抱抱自己根本没人知道，**默默擦干眼泪还是要回到电脑前投简历、练英语、准备面试题。我的房间背阴，房东为了省钱经常不开暖气。每次夜里被冻醒，我手脚发抖，心也在抖。不久，春节到了。**我自己其实还扛得住，真正承受不了的是面对父母。**父母从来没说过一句给我压力的话，他们总说，如果我想留下他们全力支持，如果我想回去他们也非常欢迎。\n\n可我成为了以前最看不起的'啃老族'，我自己没脸。\n\n除夕视频，看到家人们聚在一起热闹地包饺子，我努力大声说话大声笑，显得这边不那么冷清。父母问吃得好不好，穿得暖不暖，钱够不够。我说，很好，很暖和，花不完。后来我搬到了更中心一点的地方，但这一次是客厅。户型没法隔断，我只能用纸箱把床围起来，算是有一点私人空间。这个公寓不带家具，我用极低的价格从一位好心学姐那里买了几件二手的。没舍得买床架，就直接把床垫铺在地下睡。\n\n![course-022-01](//images.contentful.com/04k2xg9gplcj/4isuHUczskauiU66OOaAG8/c41530fff9579a9ddc78336b27c665d0/course-022-01.png) \n\n二月底，春天来了。我逐渐接到了一些面试，男朋友也从中国来探亲。2016年3月4日，在来offer的帮助下，我终于拿到了第一个offer。三月底，我和Snap签约。然后来到洛杉矶，吃喝玩乐四处浪，开始享受真正的阳光海滩。我送给自己的24岁生日礼物是最喜欢的车，用工资买的。后来我搬进了现在住的公寓，签一年租期的那天我简直像做梦一样。**因为这天往前数一年，我在4座城市搬了9次家，**其中有两次是一个人搬的。颠沛流离了一年，我一直过的都是'不知道下个月在哪里'的日子。\n\n而我却无比感谢这段颠沛流离。以梦为马，四海为家，我什么都不怕。上周我去洛杉矶本地的一个非盈利组织演讲，这个组织致力于免费培训教育水平低/生活困难/年长的女性学习编程。我讲我刚开始英语不好，紧张到连电话都不敢接；第一次面试一行代码都没写出来，暑期实习完全没找到；在湾区小黑屋不见天日闭关三个月……我说：**'我是中国人，两年半前来到美国。当时我怎么也想不到，现在能以一个Snap工程师的身份，在这里做一场英语演讲。'**我看到，听众们眼睛里闪着光。演讲结束后，主办方邀请我成为以后每一期课程的固定嘉宾。\n\n所以我想把这些都写出来。\n\n我非常反感被叫做'女汉子'。**我不是什么'汉子'，我就是一个女孩。**我喜欢花和毛绒娃娃，家里色调是淡粉淡蓝。我喜欢裙子，喜欢化了妆美美地拍照。我花痴偶吧大叔，看剧看书经常感动到流泪。我也喜欢旅行，最近刚一个人坐了44个小时火车横穿大半个美国。我也喜欢legging和运动鞋，正在健身房举铁练肌肉。我写代码的时候很冷静，也经常加班到深夜。\n\n![course-022-02](//images.contentful.com/04k2xg9gplcj/5Ia8g2ze1yUGMsw4wAc8eS/9842181a0c50f8223d56f73b141d937c/course-022-02.png)\n\n'女孩'，从来不应该是别人定义我们的标准，也不应该是我们给自己设限的理由。愿每一个女孩，都骄傲地，**像女孩一样奋斗。**\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"Search in Rotated Sorted Array","path":"/en/news/2017-02-03-search-in-rotated-sorted-array/","node_locale":"en-US","id":"25eb2444-a296-5c38-a1e7-fc7c79d536d3","contentful_id":"3E9mFrvzTUCMcCKSM2AAGq","date":"2017-02-03T00:00-08:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1.You may assume no duplicate exists in the array."},"thumbnail":{"id":"cff974f4-9532-58a1-b22c-7c210265b598","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/556tCNLoRaQIq8qqq0aAEe/2c5fc5822807f7c9a632c198fc91afac/technical-010-1.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"307fe664-081c-5e25-a9d5-f0c38775ea41","body":"说起经典面试题，我最记忆犹新的是我的第一次技术面试——2008年我申请研究生时被问到的这道题。题目描述是这样的：\n\nSuppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).\n\nYou are given a target value to search. If found in the array return its index, otherwise return -1.You may assume no duplicate exists in the array.\n\n#### 方法一\n\n俗话说的好，没方法不如烂方法。如果把这道题给一个大一新生，想必他一定会说：so easy，循环一圈挨个比一下不就好了。没错，如此暴力搜索确实可以解决问题，Java 代码也很直截了当：\n\n![technical-010-1](//images.contentful.com/04k2xg9gplcj/556tCNLoRaQIq8qqq0aAEe/2c5fc5822807f7c9a632c198fc91afac/technical-010-1.png) \n\n**不要小看如此直接的代码，这里面也是有不少坑可以掉的。**同学们面试时最容易忽视的就**sanity check**，也就是这段代码第1-3行的部分。不然的话，如果输入数组**null**，那么程序在运行时会抛出**NullPointerException**。接下来嘛，十有八九面试官也会向同学抛出**NullOfferException**了。\n\n另一个初学者经常容易混淆的概念是nums == null和nums.length == 0的区别。其实如果拿现实生活做类比的话，前者就好比说我没带钱包，而后者则是我带了钱包但里面没有钱。此外，这两个检查的先后顺序也是很重要的，**null check必须在前面**。这是因为在 Java 语言里，**逻辑表达式是按照从左到右的顺序遵循 short circuit求值的**。在这个表达式里如果逻辑或（||）的前半段nums == null为true，那么后半段无论为何值整个表达式的值也一定为true，于是Java 在这种情况下根本就不会试图去执行**nums.length**。然而如果我们反过来把它写成了nums.length == 0 || nums == null，那么当nums == null 的时候还是会抛出**NullPointerException**。\n\n说了这么多，我们返回头来看这个算法本身。它对是对，然而并不优。由于它要把数组里每个元素都和 target 比较一遍，时间复杂度是 O(n) 的。归根结底，它并没有利用到数组已经几乎排好序的条件。那么有什么办法利用这个条件来优化呢？\n\n#### 退化版问题一：Search in Sorted Array\n\n我们先从简单问题来考虑，假设这个数组并没有被 rotate 过，那么这道题就变成一道经典的在有序数组里查找一个元素的问题，其方法自然是 **binary search**。\n\n**Binary search算法**的核心要义在于我们每次可以排除掉数组里一半的元素，在剩余的另一半里继续寻找 target，并不断重复这个过程。由于数组已经按照升序排列，于是我们只需将数组最中间的元素和target进行比较，如果相等则说明刚好找到，不然如果数组的中位元素小于 target则继续在后半个数组里寻找，反之则在前半个数组里寻找。整个过程的结束条件是要么我们找到了target（返回其 index），要么数组里的所有元素都被已经排除掉了（返回 -1）。对应的Java代码如下：\n\n![technical-010-2](//images.contentful.com/04k2xg9gplcj/2iDQocrRl2A46sKYy0KMwI/a7b8ceb62fb1dcbd529bab5a809be83d/technical-010-2.png)\n\n这段代码里也有几个细节值得注意。首先第1-3行就不必说了，希望看到这里sanity check已经融化到同学们的血液中了。第6行的循环为什么一定要**left <= right**？如果写成left < right行不行？同学们在面试的时候也要注意，写出正确代码只是最基本的要求，在此之上还要能够回答面试官的各种challenges。此时我们可以举一个最简单的例子来思考，假设数组只有一个元素，那么left = right = 数组唯一的元素。**如果循环条件写成left < right的话，这个循环根本就进不去，直接就返回 -1了。**接下来第11行，为什么这里一定要left = mid + 1 而不是left = mid？我们继续举一个最简单的例子。假如数组只有唯一一个元素 nums = {5}，而我们的 target = 7。第一轮 left = right = mid = 0（都指向数组唯一的元素 nums[0] = 5），如果第11行这里不加一的话，则下一轮循环依然是 left = right = 0，于是就死循环了。可见这里加一是必须的。同理，第13行的减一也是必须的。除此之外，第7行之所以不直接写成 mid = (left + right) / 2 是为了防止两个大整数相加溢出。这也算是面试时的一个小细节。Binary search 由于每次可以排除掉数组里一半的元素，其时间复杂度只有 O(log n)，远远好于方法一的暴力搜索。然而我们只解决了退化版的问题。对于 rotate 过的有序数组又该怎么办呢？\n\n#### 退化版问题二：Find Minimum in Rotated Sorted Array\n\n在回到最开始的问题之前，我们再来看一个比刚才稍微进化一点（但依然是原题退化版）的问题。问题描述如下：\n\n<div class=\"blog-content-add-padding blog-content-add-border\">\n\nSuppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).\n\nFind the minimum element.You may assume no duplicate exists in the array.\n\n\n\n这道题和原题的唯一区别在于我们不需要找任意 target，而只需要找到数组里的最小元素。数组里的最小元素出现在哪里呢？如果是严格升序的数组，其最小值一定是第一个元素。对于 rotate 过的数组，其最小值一定出现在该 rotation 的唯一拐点。如下图所示：\n\n原数组：\n\n![technical-010-3](//images.contentful.com/04k2xg9gplcj/63CbX4pLc48QCW6oImuuq8/2fcb39017f08571035ea33ed2356fdd5/technical-010-3.png)\n\n新数组：\n\n![technical-010-4](//images.contentful.com/04k2xg9gplcj/1FNFgpO7FymQwSai2kisMa/78b114f14d2c219b9690a4844d851278/technical-010-4.png)\n\n除此之外，我们注意到严格升序的数组一定满足其最左端元素的值小于最右端元素的值，而 rotate 过的数组一定是最左端元素的值大于最右端元素的值。由于数组的最小值（拐点）是唯一的，我们可以按照如下思路进行 binary search：**如果一段数组已经是严格升序，那么直接返回其最左端元素即可。**不然我们可以把数组分为两半，其中一半一定是严格升序的，而另一半依然是一个 rotated sorted array，且其中包含原数组的最小值（拐点）。这样我们可以排除掉严格升序的那一半，而在另一半里继续找最小值。具体来讲，假设 binary search 的左端点为 left，右端点为 right，中间点为 mid。首先，如果 nums[left] < nums[right] 则说明数组已经严格升序，直接返回 nums[left] 就是最小元素。不然如果 nums[mid] > nums[right] 则说明右半段数组是 rotate 过的（且 mid 不可能是最小元素），最小值一定出现在 nums[mid + 1] ...nums[right] 当中。否则说明右半段数组是严格升序的，最小值一定出现在 nums[left] ...nums[mid] 当中（注意这里并不能排除掉 mid 本身）。如此循环，直到搜索范围只剩下一个元素，就是我们要找的最小值。对应的 Java 代码如下：\n\n![technical-010-5](//images.contentful.com/04k2xg9gplcj/4DOC3SToBy4kgmuow0MGWc/60544919290fc2d5c532d23d930e524d/technical-010-5.png) \n\n同学们可以比较一下这道题与上一题的经典 binary search 代码的异同，并仿照上一题的方法思考一下第6行的循环条件写成 left <= right 行不行，第12行写成 left = mid 行不行，第14行写成 right = mid - 1 行不行。这里不再赘述。这道题我们也是每次排除掉数组里的一半元素，**所以时间复杂度还是O(log n)**。\n\n#### 方法二\n\n在有了前面两个退化版问题铺垫下，最开始的问题也就迎刃而解了。我们只需要首先用退化版问题二的方法找到数组的拐点，然后把数组 rotate 回严格升序的，再用退化版问题一的方法来寻找 target 即可。Java 代码如下：\n\n ![technical-010-6](//images.contentful.com/04k2xg9gplcj/4F3ZS5h2dyMmYSCGqWymw8/446f34009956fb91368472d149fc6bdc/technical-010-6.png)\n\n两次**binary search**的时间复杂度都是O(log n)，总的时间复杂度为**O(log n + log n) = O(log n)**，比方法一的 **O(n)** 好太多了。然而代码写成这样未免太啰嗦了。有没有办法只用一次**Binary Search**就一步到位呢？必须的。\n\n#### 方法三\n\n其实一步到位的方法还是利用了经典 binary search 的思想，每次将数组分为两半，将最中间的元素和 target 进行比较，如果相等则说明刚好找到。**唯一的区别在于如果不相等时接下来该继续搜索哪一半。**这时就要将退化版问题一和退化版问题二的思路结合起来。既然两半当中一定有一半是严格升序的，我们只需要判断 target 是不是在这一半里面即可——是则搜索这一半，不是则搜索另一半。Java 代码如下：\n\n![technical-010-7](//images.contentful.com/04k2xg9gplcj/4G8w0ZlJ7aEIyIaWoQu0e/f2b628762a6cd2e7b0201c1479d4ea51/technical-010-7.png) \n\n**时间复杂度还是 O(log n)，然而代码却简洁了不少。**\n\n通过这道题，希望同学们在学习 binary search 的时候不要死记硬背，而是深入理解并融会贯通，遇到新题能够化繁为简。\n\n**汤老师**\n\n来offer王牌讲师之一。清华大学计算机系信息学竞赛保送生，美国哥伦比亚大学计算机系软件系统实验室博士生，曾在 OSDI、CACM 等操作系统领域最顶级学术会议和期刊上发表多篇论文。曾参与 Chrome 和 Google Cloud Platform 的研发工作。\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"来Offer专题 | Virtual Memory","path":"/en/news/2017-12-14-virtual-memory/","node_locale":"en-US","id":"8bcf2c3f-4136-51b6-a244-b7979bcdb729","contentful_id":"2n8Y9m8egcak6y6I6k0g0q","date":"2017-12-14T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"最近有不少转专业的同学问我们说尽管大家已经学会了很多数据结构和算法的知识，可是每当见到一些计算机系统方面的名词术语还是一头雾水。于是我们打算写一些专题文章，帮助本科不是计算机专业的同学快速了解一些计算机系统的基本概念。今天先来讲讲Virtual Memory。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"09e11a4d-fc8c-5172-9cc6-7f91b6069620","body":"**汤老师**：来offer金牌讲师。清华大学计算机系信息学竞赛保送生，美国哥伦比亚大学计算机系软件系统实验室博士生，曾在OSDI、CACM 等操作系统领域最顶级学术会议和期刊上发表多篇论文。曾参与 Chrome 和 Google Cloud Platform 的研发工作。\n\n最近有不少转专业的同学问我们说尽管大家已经学会了很多数据结构和算法的知识，可是每当见到一些计算机系统方面的名词术语还是一头雾水。于是我们打算写一些专题文章，帮助本科不是计算机专业的同学快速了解一些计算机系统的基本概念。今天先来讲讲**Virtual Memory**。\n\n**Virtual Memory（虚拟内存）**，顾名思义，是针对**physical memory（物理内存）**来的。远古时期的计算机（五十年前的大型机或者三十年前的个人电脑）是不用虚拟内存的，那时候要想跑一个程序，必须先把整个程序加载到物理内存里才能执行。可是内存又小又贵，而人们不仅想跑大程序，还想同时跑好几个，有限的物理内存吃不消了可怎么办呢？\n\n于是人们想到了虚拟化。（注：其实不仅是虚拟内存，广义的虚拟化概念可以解决许许多多的计算机问题，比如大家常用的 virtual machine, virtual file system, VPN 等等都是虚拟化在各个领域的应用。）\n\n简单来讲，**虚拟内存就是让每个进程看起来都好像拥有一个大而独立的地址空间**。什么意思呢？我们一个词一个词来讲。\n\n## 地址空间\n\n首先说什么是地址空间（address space）。计算机的内存说白了可以想象成一块连续的数组，数组里面的每个字节都有一个唯一的地址。\n\n比方说我新买的（键盘手感巨烂的）电脑有 16GB（即 2^34 bytes）的物理内存，那它的物理地址空间就是 {0, 1, 2, ..., 2^34 - 1}。\n\n## 大\n\n接下来再说大。就是说**不管我实际的物理内存有多大，虚拟内存都可以假装有很大**。比如我的电脑号称是 64-bit 的，也就是说我电脑上跑的每一个进程都以为它拥有一块 {0, 1, 2, ..., 2^64 - 1} 的虚拟地址空间。那要是物理内存不够了怎么办？\n\n我们可以把虚拟内存看作一个缓存的工具，正在使用的部分放在物理内存里，暂时不用的部分就扔在磁盘上好了。\n\n## 独立\n\n独立的意思是说**尽管每个进程的虚拟地址空间长得都一样，但它们都是私有的**。不同进程的同一个虚拟地址可以映射到不同的物理地址。例如，所有 64-bit 程序的代码都是从内存地址 0x400000 开始的，然而不同程序其中的内容是不一样的。\n\n这就好比说吕老师住了个Town House，隔壁是孙老师的Town House，尽管这两栋房子的外观设计一模一样，但吕老师家门口挂了幅盗梦空间的海报，而孙老师家同样的位置是这样一张风景画：\n\n![blog-1214-01](//images.contentful.com/04k2xg9gplcj/5MICMeRCE00UOcCq8KIyAg/1d8709288e900b218174a92e47369c2c/blog-1214-01.jpg)\n\n这是怎么实现的呢？简单来讲，系统把虚拟内存和物理内存都划分为等长的 page（页），并为每个进程维护一个 page table（页表）用来将虚拟页映射到物理页。\n\n这样当我们访问一个虚拟地址时，系统就可以通过查表将其翻译为物理地址。如果这个地址所在的页当前不在物理内存中，则系统会先将它从磁盘取出来替换掉内存里另一个暂时不用的页。整个过程是由操作系统和硬件协同完成的，这里不再赘述，感兴趣的同学可以参考任何一本操作系统教材。\n\n![blog-1214-02](//images.contentful.com/04k2xg9gplcj/3d1Qm5WC8MKA2muWmyEgiq/2f16bf22413fad18cfba1fdeb6cf2799/blog-1214-02.jpg)\n\n虚拟内存让进程的链接和加载、共享和分配内存、访问权限控制等都变得很容易。连续的虚拟页不必要在物理上连续，而不同的虚拟页也可以映射到同一个物理页。\n\n举个简单的例子，几乎所有的C语言程序都会用到printf函数，于是我们在物理内存中可以只有一份printf的实现，而让各个进程对应的虚拟页全都映射到同一个物理页即可。\n\n## 常犯错误\n\n最后我们来简要讨论一些同学们在写程序时常犯的和虚拟内存有关的错误（以下以 C 语言为例；Java 也会相应地报错或抛出异常）：\n\n - **访问空指针或坏指针**。比如指针指向的虚拟地址并没有映射到实际有意义的数据，或者我们试图去写一块只读的虚拟内存区域，都会导致 segmentation fault。\n - **访问未初始化的内存**。如果一个局部变量没有初始化而我们误以为它是零，程序的结果就会不对。\n - **缓冲区溢出（buffer overflow）**。例如一个函数的输入参数是一个字符串，函数里有一个固定大小的 buffer。如果我们没有检查该字符串的长度就将它拷贝到 buffer 中，一旦输入字符串超出了 buffer 的长度就会造成 buffer overflow，从而覆盖掉其它有意义的数据。\n - **缓冲区溢出有一个特例是所谓的 off-by-one error**，也是同学们常犯的错误。一个长度为 n 的数组 index 是 0 到 n-1，此时如果访问 index 为 n 的元素就越界了，会读到甚至覆盖掉别的数据。\n\n（本文在写作过程中参考了 Randal E. Bryant 和 David R. O'Hallaron 所著的 Computer Systems: A Programmer's Perspective 第三版。）"}}},{"node":{"title":"经典面试题目详解：正则表达式匹配","path":"/en/news/2017-01-11-how-to-do-regex-matching/","node_locale":"en-US","id":"79ade642-5c98-5ebd-8454-60b652aefd7c","contentful_id":"2hn0YAKAgsQ6a2Y6wuMu6y","date":"2017-01-13T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"本篇文章将从最直观的分治（divide and conquer）角度出发，推导出指数复杂度的DFS解法，再利用记忆化搜索（memoization）减少重复的计算，最终转化为迭代（iterative）的动态规划（dynamic programming）解法。"},"thumbnail":{"id":"c607040e-fd06-5e61-b98e-b42774062123","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/4n9QHpEorYQe6QEAQEuwsg/a8e819fe5473ff53d471ceaa73eda046/technical-020-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"1dcdaa67-6ca1-5198-adda-c384c5011f56","body":"本篇文章将从最直观的分治（divide and conquer）角度出发，推导出指数复杂度的DFS解法，再利用记忆化搜索（memoization）减少重复的计算，最终转化为迭代（iterative）的动态规划（dynamic programming）解法。\n\n**题目:** 写一个程序判断一个正则表达p式是否匹配一个字符串s。\n\n正则表达式由小写字母，星号（'*'）和点（'.'）组成;\n\n' . ' 匹配任意字符\n\n' * ' 匹配任意数量（可以0个）的前一个字符\n\na-z 匹配字符本身\n\n匹配\n\ns = 'abc', p = 'abc'\n\ns = 'aaaab', p = 'a*b'\n\ns = '', p = 'a*b*c*'\n\ns = 'abcdefg', p = '.*'\n\n不匹配\n\ns = 'abc', p = 'a*'\n\ns = '', p = 'ab*'\n\n**分治/ Divide and Conquer**\n\n分治做为一种经典和重要的算法设计思路，是很多解题的出发点，练习分治的能力是极其重要的。考虑一般p与s都不为空的情况。从s与p的头观察\n\n● 如果p的第二个字母不是’*’ - 如果p的第一个字母是 ’.’ 那么只要s.substring(1)与p.substring(1)匹配，则s与p匹配。- 如果p的第一个字母是’a’-’z’，那么只要s与p的第一个字母相同，且s.substring(1)与p.substring(1)匹配，s就与p匹配。\n\n● 如果p的第二个字母是’*’，那么如果p去掉头2个字符后能匹配某一个s的后缀，且p的前2个字符能匹配剩下的前缀，则s与p匹配\n\n**方法 1 : 分治/深度优先搜索**\n\n![technical-020-01](//images.contentful.com/04k2xg9gplcj/4n9QHpEorYQe6QEAQEuwsg/a8e819fe5473ff53d471ceaa73eda046/technical-020-01.png) \n\n**分治的方法不难理解，但是运行效率较慢。** 假设s的长度是n，p的长度是m，最坏情况下每一层recursion会产生O(n)个递归调用，而recursion的深度是O(m)，按照DFS的复杂度分析公式，时间复杂度高达O(n^m)。\n\n**方法 2 : 改进分治** 在分治的过程中，核心的部分就是induction rule的构建，而对于同一个分治的定义，是可以有不同的induction rule的，不同的induction rule带来的效率也是不同的\n\n对于’*’的情况，我们可以只分成2种情况讨论：匹配空前缀，或者匹配非空前缀。\n\n● 如果’*’匹配空前缀，且s匹配p.substring(2)，则s与p匹配\n\n● 如果’*’匹配非空荐椎，且s.substring(1)匹配p，则s与p匹配\n\n注意第二种情况中的子问题并没有改变p的值，’*’在子问题中保留了下来，可以进一步匹配s.substring(1)的前缀（可为空）。\n\n![technical-020-02](//images.contentful.com/04k2xg9gplcj/36Ta9P5wE0MkAqgGO4wQIM/99ab5426de2d8b98a5e4e8b6be7ba055/technical-020-02.png) \n\n**改进后的分治每一层dfs最多可以产生2个个递归调用，时间复杂度减少到了O(2^m)**在Java 7中String.substring的复杂度是O(n)的。注意到dfs的参数始终是最初s与p的某个后缀，我们可以用两个指针表示s和p的后缀的起始点，从而减少不必要的字符串复制。\n\n![technical-020-03](//images.contentful.com/04k2xg9gplcj/2JdX8xwRTWqy0W6qsuM06a/76487b4a9cb3044dd41e58dc3e0c7997/technical-020-03.png)\n\n**方法 3 : 记忆化搜索**通过观察现有解决方案来找到效率不高的地方，继续利用对常见数据结构和算法的理解进行优化，是系统解决问题的过程中能够体现出的重要能力之一**注意到dfs在搜索过程中有可能会对完全一样的参数（相同的子问题）计算多次。**对于同样的参数，dfs的计算过程和结果都是完全一致的，所以没有必要做重复的计算。避免重复的计算的方法就是把计算的结果按照dfs的参数存下来，这样以后遇到之前计算过的dfs时可以直接返回上一次的计算结果。\n\n![technical-020-04](//images.contentful.com/04k2xg9gplcj/6mlOyp1PYQIM8caCy6mImW/1d2d4effed100f0eab82afa3dacbe7eb/technical-020-04.png) \n\n记忆化搜索看似只是小小的优化，但对运行时间却能有巨大的提升。不同子问题的个数总共有O(mn)个，每个子问题只计算一遍。每个子问题的开销不包含任何循环，所以只有O(1)。所以**总的时间复杂度变成了O(mn)。**记忆化搜索分配了O(nm)的空间，换来的**运行时间的提升，是一个空间换时间的策略。** 仔细思考不难观察出来，**分治法它本质上是在一个图上做一个深度优先搜索，而记忆化搜索本质上是按照这个图的拓扑顺序（topological order）的逆序填表。**如果我们能用简单的循环描述出图的拓扑顺序，那么就可以用迭代的形式来完成填表的任务，这就是著名的动态规划。\n\n**方法 4 : 动态规划**除了递归的方式完成任务，同时我们也能从迭代的角度思考问题，通常迭代的形式复杂度容易分析，运行时间会比递归稍快，但实现难度高\n\n![technical-020-05](//images.contentful.com/04k2xg9gplcj/1wzaqFKh1OEWKEw00WE4C8/7e3732fa3ec7628d7f6dc3c67f5c12b6/technical-020-05.png) \n\n注意到填dp[i][j]的时候，我们可能会用到dp[i][j + 2]， dp[i + 1][j] 和dp[i + 1][j + 1]。由于我们的填表顺序是从下向上，从右向左，所以p[i][j + 2]， dp[i + 1][j] 和dp[i + 1][j + 1]的值一定在dp[i][j]之前填好。动态规划的时间、空间复杂度与记忆化搜索一样，也是O(mn)。 **动态规划和记忆化搜索分别从迭代和递归的角度完成了同样的任务。**迭代的形式复杂度容易分析，运行时间会比递归形式稍快（递归会有函数调用产生的时间开销），但实现难度较高。**推荐初学者从分治、搜索的方法着手。**\n\n**方法 5 : 动态规划空间优化**我们在考察已有解决方案的效率的时候，往往要从两方面去考虑，除了时间之外，大家往往忽视的是对空间的分析和优化动态规划还能否进一步改进呢？答案是肯定的。注意到我们是按照一行一行的顺序填表的，每填一行的时候只需要用到下一行的值。也就是说，其实我们只需要保存最近2行的值就能够完成填表的任务了。\n\n![technical-020-06](//images.contentful.com/04k2xg9gplcj/3rYhEbE1OUg0CqAKUQGym8/3c0a576a1f1382989d283e53e2063de2/technical-020-06.png)\n\n代码实现上我们可以使用'滚动数组'的技巧，数组只声明2行，填的时候用行号除以2的余数做index。这样填表能够自动覆盖不需要的行，最大化的利用空间。**空间复杂度从O(nm)减少到O(m)。**\n\n**经典试题总结：**\n\n正则表达式匹配做为一道经典的面试题目，考察的重点在于大家对分治思想的掌握，对于基本的DFS算法的熟练程度和对于动态规划的理解。知其然更要知其所以然，动态规划和DFS等系统的解决问题，其背后考核的是一名合格工程师层层分析优化的思维过程。除此之外，是不是能够准确和正确的处理各种不同的情况，对代码的准确性和可读性的考察在这道题目中也得到了很好的体现。我们不管要解决什么问题，都需要有扎实的算法设计的基本功和系统思维的能力，层层推进来不断在现有解决方案基础上开发更有效率的方法。\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"来Offer独家习题讲解 | Multi-Versioning","path":"/en/news/2017-12-04-coding-exercise-multi-versioning/","node_locale":"en-US","id":"ef42dfae-1179-587e-af97-b70a7b2b49d3","contentful_id":"xzQKfkOoAoUO4cSAQ6w0A","date":"2017-12-04T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Algorithm"],"description":{"description":"来Offer的金牌讲师吕老师最近出了一道关于System Design的原创习题。虽然是道热腾腾的新题目，但题目中的原理却是在工业界被广泛应用的。掌握这道题，无论是在求职应聘还是在职场工作中，都能让你受益。下面，就让我们一起帮助习题中的主人公 —— 赵老师，完成他的Time Machine吧！"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"b861c2f8-2316-56d0-83e3-b17c5d42b4a5","body":"来Offer的金牌讲师吕老师最近出了一道关于System Design的原创习题。虽然是道热腾腾的新题目，但题目中的原理却是在工业界被广泛应用的。掌握这道题，无论是在求职应聘还是在职场工作中，都能让你受益。下面，就让我们一起帮助习题中的主人公 —— 赵老师，完成他的Time Machine吧！\n\nDr.Zhao: “Shhh… Press the diamond on my Tesla to turn on a time machine!”\n\nOK, let's build a time machine for Dr. Zhao.\n\nThe time machine has memory, just like our computers. For each memory read or write, the user may use the following methods to operate. The time machine’s memory supports these **two basic operations:**\n\n**(1) byte read (long location)** returns the value of a given memory location\n\n**(2) write (long location, byte value)** updates the value of a given memory location\n\nTo act as a time machine, Dr. Zhao wants us to add one more operation:\n\n**byte read (long location, long timestamp)**\n\nWith this added operation, the magic of our time machine starts!\n\nSpecifically, it can return the historical values of one given memory location. For example, I may read the value in location L 10 days ago, or even years ago. We do not need to worry about the time machine being restarted. With the magical diamond, Dr. Zhao’s time machine will never fail. Now, how to design such a time machine with your code?\n\nYou may start with something like:\n\n**interface TimeMachine {**\n\n**byte read (long location);**\n\n**write (long location, byte value);**\n\n**byte read (long location, long timestamp);**\n\n**}**\n\nDr. Zhao is waiting for your implementations. As a limitation, you CANNOT use any language built-in data structures except arrays. You may want to implement your own data structures like linked lists, binary trees, or hash maps.\n\nA few follow ups:\n\n1\\. Suppose there are multiple threads operate on the same time machine concurrently, how to handle these operations? What will be the performance impact?\n\n2\\. If the machine keeps running and we keep writing new values into the time machine, what will happen? How to deal with this? What will be the performance impact?\n\n3\\. Dr. Zhao now allows us to use language built-in data structures like LinkedList, HashMap, TreeMap, etc. Can you easily replace your own implementations with them?\n\n**讨论和解答**\n\n其实计算机软件系统中经常会遇到这样的“时间机器\"。这种时间机器的语义在工业界项目中是广泛存在的，一般被称为Multi-Versioning。\n\n设计这样的“机器”，主要要解决的问题有两个：\n\n► 1\\. 系统中可能存在的地址是非常多的。\n\n在这个问题中，我们沿用一般计算机中的⽅方法，用64个二进制位描述一个内存地址。可以想象，如果把这些地址跟我们对应的“时间机器”程序中的地址⼀一对应的话，会是一件⼏乎不能做到的事情。\n\n► 2\\. 对于每个地址，如果我们真的要能够⽀支持读出历史某个时刻的值的话，那么我们就真的需要把这些内容保存下来。可是系统中，时间是在不停增长的，与此同时，每个地址对应的值也可能在不停地被修改。如何保存这些历史上的值，会是另一个问题。\n\n我们可以先从一个最简单的问题开始考虑：假设我们的时间机器中可以保存历史任意时刻的内存中的内容，而不需要考虑内存的消耗，那么上述的两个问题就被分开了。\n\n**STEP 1**\n\n我们⾸首先考虑问题1，如何组织系统中大量的内存地址呢？其实计算机科学中一个最常见的解决思路就是Hashing。\n\n就像一般的hash算法一样，我们可以将若干个内存地址按照某种规律映射到⼀个“桶”（bucket）中。这样，⼀个近乎于无穷大的内存地址空间就可以用有限的数据元素来管理了，如下面这个图：\n\n![blog-126-01](//images.contentful.com/04k2xg9gplcj/3zbfZthS1agM8Scg4wMom0/5a64a41d0477ac174e73a88b6d26c51c/blog-126-01.png)\n\n在这里，我们使用了⼀一个叫做history table的数据结构来组织所有的时间机器内部的数据。\n\n**STEP 2**\n\n能够把所有的内存地址都映射到history table中之后，我们就可以着⼿手解决另⼀一个问题了了，也就是如何组织所有系统中曾经有过的值。\n\n对于这一点，我们可以做一个很简单的扩充：History table中的每一项拥有一个链表。对于任意一个地址，我们可以在History table中按照时间的先后顺序，倒序保存每次写入的值，每次写⼊对应链表中的一个节点，记录每个值的同时记录写入的时间。这样，History table中保存着所有被映射到同⼀个项上的地址的所有历史上的值。\n\n链表的每⼀项会存有如下内容：操作对应的地址（addr），操作发⽣的时间（t），和操作写入的新值（val），如下图：\n\n![blog-126-02](//images.contentful.com/04k2xg9gplcj/2g1gCWaNnKEokySY26AIoC/c04539e7fd176cd99a919d53dced7de0/blog-126-02.jpg)\n\n整个链表的整体组织如下图：\n\n![blog-126-03](//images.contentful.com/04k2xg9gplcj/46zUnTXUHKqOoeIeaCesoc/d441e84d79e405fb213215d5d665460a/blog-126-03.jpg)\n\n因此，当写入地址L时，我们只需根据地址L找到对应的history table中的一项，然后创建⼀个链表节点，记录当前写对应的地址L，值和时间。此后，将这个节点从头部插入链表即可。随着时间推移，链表⾃自然会形成时间倒序。\n\n当读取地址L时，我们只需在链表中找到对应地址的首个节点即可。当读取特定时刻t的地址L时，我们需要在链表中找到对应地址的、写入时刻⼩于t的首个节点就好了。若我们遍历完整个链表仍然不能找到满足条件的记录，那么说明这个地址从来没有被写过。\n\n接下来很多同学的疑惑都集中在，如果系统⼀直不停地运行下去，**那么这个链表会无限地延长呀，这种情况怎么办呢？**\n\n而工业界中解决无限增长的历史记录的问题也非常简单：**扔掉。**\n\n对于很多实际系统，通常可以设定一条记录的最长存在时间（Time to live, TTL）。超出TTL的数据都将被系统自动回收，这样就可以避免历史数据无限堆积的问题了。如果系统被多个线程并发访问时，我们可以设定一个系统整体的时间，然后让并发的操作线程上锁后更新链表并更新系统时间即可。\n\n若允许直接利用Java等语言中的预定义数据结构，我们可以充分借用TreeMap等数据结构加速链表查询的步骤。事实上，很多⼯工业界中按照时间进行记录的部分都利用了TreeMap加速查找。\n"}}},{"node":{"title":"如何设计一个Abuse系统－从百度贴吧事件说起","path":"/en/news/2017-01-11-how-to-do-regex-matching/","node_locale":"en-US","id":"01ef79d6-2459-5533-a03e-a7d8b961a238","contentful_id":"1yq7hd14oU0GoUug6ce2sU","date":"2016-01-06T00:00-08:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":" "},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"813d0d5a-ebab-56d3-ba59-1cfe3f202021","body":"最近小编正在关注国内引起沸议的百度贴吧事件（百度把疾病类贴吧卖给不具医疗资质的广告商）。对于在美国的大部分同学来说，可能用百度的机会不多，所以也并不会觉得对自己对生活有多大影响。但是在这里小编也建议咱们的同学，遇到热门的IT事件，除了看热闹之外，还可以借着这个机会了解一下相应的IT知识，比如在这个场景下，我们可以考虑如何设计一个Abuse系统（当然对于该事件的主人公而言，是考虑他们是否需要一个Abuse系统(小编不语)）。小编也带领大家简单过一遍回答系统设计问题的流程。\n\n**什么是Abuse系统？**\n什么是Abuse系统呢？一句大白话，就是检查你的用户的行为是否有违规、违法的行为及其应对如过滤、警告、甚至封禁等。比如在这个事件当中，广告商是否具有医疗资质其实是一个需要审查的事情，或者即使是正规的厂商，但是发布和自身信息不一致的内容来欺骗用户也是一个Abuse的行为。Abuse系统就是公司内部的神探夏洛克，避免公司违反了各种政策法规，影响用户体验和公司声誉，乃至导致整个公司的损失。\n\n**如何反问面试官？**\n在这里也提醒一下大家，很多系统设计的面试场景与算法面试不一样，面试官都会故意把题目说得很含糊，而等待你去具体分析你的受众、需求等等（所以他才叫做系统设计）。所以同学们如果听到这个题目，第一反应就是需要你去反问面试官，你想给什么产品设计一个Abuse系统呢？如果是Airbnb，那么可能针对的有些用户发布的房屋照片不实；如果是Uber，那么针对的可能是刷单的用户；如果是Facebook，可能是有些帖子是有种族主义、暴力倾向等问题的；如果是eBay，那么可能是有些商家发布假的商品信息等等。总之，这是一个工业界一直在思考，也有很多应用场景的地方。\n\n**猜想具体的场景**\n约定好具体的场景之后，同学们就需要继续去想，具体的violation可能有那些，比如大部分的公司政策都是不允许有色情、暴力这些硬的底线。具体的各自的场景也会有不同的policy，比如如果是社交帖子，可能会有一些是Spam的内容，占用大量资源；如果是Uber，那么可能是司机伪造里程；甚至针对某一个产品的不同用户也需要考虑不同的policy，比如针对未成年用户是否需要更严格的限制，针对不同地域（可能拥有不同文化习惯）的人群是否需要有对应的调整，这些都是同学们可以很好地和面试官聊天的地方。\n\n**设计整体架构**\n设计好了目标之后，我们就需要从大的框架上去思考这个实现。比如，我们首先需要能够identify一些疑似abuse的内容。如何identify，是用Machine Learning去学习，还是人工去筛选，还是交由用户去加tag，这些都是需要深思的问题。获取到了疑似的abuse的内容之后，是否需要进一步的审查以提高准确性？如果需要，是人工继续去筛选，还是用更好的算法去探测？确定abuse的内容之后，根据其危害性，相对应的应该做出哪些反应，是过滤掉内容，警告这个用户，还是乃至屏蔽这个用户？\n\n**填充技术细节**\n有了大的框架之后，我们可以根据各自的经历和技能，去深入讲述其中某一部分的内容。比如如果有同学对于Machine Learning很擅长，就可以详细描述里边的Classifier的设计和评价，比如到底是用SVM还是用神经网络；如果同学擅长后端设计，可以讲述如何做到负载均衡以及提高可靠性；如果熟稔于网络安全，可以跟面试官详细讲述如何抵御用户的可疑行为及进一步的欺骗行为，诸如此类。\n\n以上就是面对一道系统设计题常见的思路，与算法题不一样的是，系统设计题对同学们对宏观设计、交流能力、表达能力都有很大的要求。这也是刚毕业的同学可能稍微欠缺的地方。Abuse系统虽然是同学们都会接触到一些，但是可能学校上课期间很少有讲到的项目设计。如果想了解更多工业界的项目设计，可以报名参加来Offer的培训课程，包括由一线工程师带你手把手实现一个IT项目并且详解Project背后的思考。\n\n图片来自网络，版权属于原作者"}}},{"node":{"title":"从芝加哥到硅谷, CS求职攻略有何不同？","path":"/en/news/2017-08-01-different-cs-job-searching-strategies-between-chicago-and-silicon-valley/","node_locale":"en-US","id":"975b93bf-b3ca-5313-9eb7-ee27bdb03d2a","contentful_id":"9E9mFrvzTUCMcCKSM2AAG20","date":"2017-08-01T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"首先感谢两位来自芝加哥的学长来微信群和大家分享经验！两位本科、硕士都是CS专业，绝对是科班出身了，那么你们觉得这么多年在学校学到的CS知识足以应对面试和找工作吗？"},"thumbnail":{"id":"8b358215-0428-5590-92fd-ce3cd3f87f5b","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/6FsKKxEONa4gWcOaaQQq2M/2bca6626c3f3dfbf9fb4dd09e74abf52/035-career-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"6f545d3a-10c8-5e8f-bab8-7536dd9f8acd","body":"![035-career-01](//images.contentful.com/04k2xg9gplcj/6FsKKxEONa4gWcOaaQQq2M/2bca6626c3f3dfbf9fb4dd09e74abf52/035-career-01.png)\n\n**Club小助手：**首先感谢两位来自芝加哥的学长来微信群和大家分享经验！两位本科、硕士都是CS专业，绝对是科班出身了，那么你们觉得这么多年在学校学到的CS知识足以应对面试和找工作吗？\n\n**Richard：**总的来说，学校的课程还是偏重理论但缺少实践的。比如，学校的算法课基本都不讲代码，只讲理论，但面试的时候却主要考察你的编程能力。\n\n**Ruoyu：**我同意Richard学长的观点！大公司一般为general hire，应聘者基础知识扎实就行，公司会花时间精力培养你；而Startup往往要求你进公司能马上投入工作，因此更看重专门技术，这就需要自己课后有针对性的补课了。当然大家绝对不要认为学校学的东西没用，学校课程其实是非常有用的，能够为你打下基础。在这个基础上，为了找到理想的工作，你可以自学比较popular的语言，多接触一些前沿技术。\n\n**Club小助手：**说到找工作，大家对'内推'两个字都格外敏感。请问学长内推对你们找工作帮助有多大？在校生或New grads该如何找内推人呢？\n\n**Richard：**内推对找工作的帮助的确太大了。我在美国的所有的工作都是通过内推得来的。除了在学校的老师和同学发展人脉关系以外，我建议多去参加在本地举办的**tech meetup**。一般这种活动上在职人员很多，而且大家都是同道中。如果时间紧张，一些弱联系也可以多利用，比如校友，但还是要花一定时间精力培养感情的。\n\n**Ruoyu：**内推绝对是同学们获得面试最高效的方法。以我所在的Service Now为例，有招聘需求时，Director都会先问组内人员是否有推荐，他们会优先查看这些被推荐人的简历，没有合适人选才会让职位信息go public。找内推最好是自己认识的人，他们不仅了解你的闪光点、能更好的推介你，而且还能向你透露一些内部消息，比如公司对这个岗位的要求和考察的侧重点。Linkedin也是一个比较好的内推资源来源，大家可以多加校友。一些论坛上也有大量内推信息，但质量没有保障，不是特别建议。\n\n**Club小助手：**两位学长都在芝加哥求学，而现在都到了湾区打拼，那么你们认为在芝加哥找工作和在湾区，公司考察的技能点有何不同？在芝加哥能找到满意的工作吗？\n\n**Richard：**芝加哥和湾区的就业环境，最大的差别应该就是工作机会的多少了。因为芝加哥金融行业发达，所以很多公司**要求Engineer对金融或Trading有一定的了解**，因此建议学有余力的同学选听一些financial mathematics的课程。芝加哥招人流程一般不是那么正规，尤其对于中小公司来说，找内推是第一重要的。至于技术上的准备，基础算法题目足够了解，并在leetcode上找相关题目强化练习一下就行。\n\n**Ruoyu：**就像Richard老师刚说的一样，之所以越来越多人来到湾区就业，还是因为工作机会量的差距的确是很明显的。芝加哥的很多职位要求你同时具备CS和金融的相关技能，而在湾区，只要会coding都能找到一份工作。\n\n**Club小助手：**那么对于找工作时要做的另一件事——**刷题**，学长有什么好的经验吗？\n\n**Ruoyu：**刷题的确是挺重要的，即使是CS专业同学，也要靠勤写勤练来提高动手能力。刷题到后期会形成条件反射，看到题目就能反应出答案。面试官不傻，他们看你解题的状态就能判断出你是否做过原题，所以只知道答案对面试非常不利。因此，即便是对题目再熟悉也不能只记答案，要理解整个解题过程和思路，懂得举一反三。\n\n**Club小助手：**通过内推和打造简历，终于到了面试这一关！两位学长觉得**面试中需要主要什么**？交流上有什么技巧？\n\n**Richard：**面试当中，交流的过程和效果是最重要的。有专家说面试时的第一印象在最初的半分钟就已形成；如果第一印象很好，后面的交流就是在巩固这一印象，如果第一印象欠佳，想要推翻这个印象就会更困难了。有时你感觉面试官出了刷题时遇到过的原题，这时候也不能操之过急，因为一般面试中的问题都比较模糊，考察的是你能否在交流中让问题具体化。你需要通过高效的沟通，逐步明确题目要求。在做题过程中，讲出你的**think process**很重要。大家一定要边讲边写，向面试官介绍每一步的input和output是什么，目的是什么。从开始到结束，要非常有逻辑。\n\n**Ruoyu：**在面试中，coding只是很小的一部分。即便是最后到了工作岗位上，升职快的人也往往都是情商高、会交流的人。因此在面试过程中，面试官最想知道的是求职者能否快速融入未来的工作环境，所以主要考察的是沟通能力，以及会不会提问。和刚才Richard学长讲的一样，拿到题目后第一步就是交流，搞清requirement，做好design并且向面试官解释你的整体思路，千万一拿到题目就埋头做。还有一点希望大家注意，面试官很可能是你未来的上司，不过在面试中一定要自信，因为双方都是平等的。\n\n**Club小助手：**两位学长都有换工作的经历，不知道你们在选择新东家的时候，除了待遇高低，还会考虑哪些因素？\n\n**Richard：**其实不光是跳槽，大家毕业后从学校进入公司，也是一次很重要的转折。在选择offer时，我建议刚毕业的同学尽量去大公司，因为大公司会花更多时间精力去培养你，可以快速成长。对转专业的同学来说，最好选择一份两个专业的知识都能用得上的工作。至于薪资待遇，刚毕业的学生基本都差不多。以我个人为例，第一份工作去的是上市公司，此后的几次跳槽虽然公司越来越小，但随着能力的提高，自己能handle的工作越来越多、越来越复杂。因此在一段时间的工作过后，进入小公司的高级职位对人的锻炼更大，自己能对公司产生的影响更大，未来的发展机会也会比在大公司更好。\n\n**Ruoyu：**我觉得在选择一份工作的时候有几重境界。如果这份工作自己很喜欢、很擅长，待遇也很好，那当然是最完美的。如果达不到这个水平，那么就选择一家前景好的公司。如果以上两点都无法满足，那自己在这个岗位上有好的发展也是不错的。\n"}}},{"node":{"title":"再不Go就来不及了: 下一代高性能编程语言Go","path":"/en/news/2017-08-02-programming-language-go/","node_locale":"en-US","id":"439e99b0-24b3-5404-b625-5acab88bdf62","contentful_id":"9E9mFrvzTUCMcCKSM2AAG21","date":"2017-08-03T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"最近TIOBE Index发布了最热门的编程语言，Go是Top10编程语言中唯一一个排名在显著上升的语言，其他语言如Java（继续稳坐第一名），C/C++都出现了不同程度的下滑。 ![](034-technical-01.png) 那么这个Google精心打造的下一代高性能编程语言Go，到底有什么过人之处呢？"},"thumbnail":{"id":"78eda50d-4e8c-5162-a3ab-9bb515f023e8","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1QE7zmvdg4Y0UIgw8iAqyS/4bae72ecf7b712e73b48c4dcfcf7599b/034-technical-01.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"db446411-9104-5d44-88d3-fdcd641ab4d4","body":"最近TIOBE Index发布了最热门的编程语言，Go是Top10编程语言中唯一一个排名在显著上升的语言，其他语言如Java（继续稳坐第一名），C/C++都出现了不同程度的下滑。\n\n![034-technical-01](//images.contentful.com/04k2xg9gplcj/1QE7zmvdg4Y0UIgw8iAqyS/4bae72ecf7b712e73b48c4dcfcf7599b/034-technical-01.png)\n\n那么这个Google精心打造的下一代高性能编程语言Go，到底有什么过人之处呢？\n\n**Google出品**\n\n2009年Google正式发布了Go这一下一代后端编程语言，希望能够帮助Web开发人员能够以Google的规模和速度来开发应用，并且专注于高性能和易用性的均衡。自从出道以来，即使在Google没有做任何强制捆绑的情况下（大家可以对比苹果对Swift的支持），Go凭借自己的技术特性，受到了程序员和公司的各种欢迎，每年在TIOBE的排名都在不断的上升。2017年更是把很多语言都拖下马来，挺进前十最受欢迎的语言。\n\n**机器友好**\n\n用一句话来说，Go是在对机器友好和对程序员友好之间平衡的比较好的一种新型语言。首先什么是对机器友好呢？就是编译器写出来的二进制代码足够快速有效。\n\n在这方面来说C/C++无疑是比较好的，甚至很多操作系统都是用C/C++编写的。Java则因为其虚拟机和跨平台支持的原因，在运行速度上要稍逊一筹。Go没有使用虚拟机，所以其机器代码会比Java好一些，比较接近C/C++。\n\n这个指标对很多追求性能的公司来说很重要，比如Dropbox就用Go来开发自己的Memcached系统（称之为HAT)，这种缓存系统要求就是反应极快，因为直接影响了用户的操作延迟。\n\n**程序员友好**\n\n那么什么是对程序员友好呢？最简单的一个指标就是实现同样一个功能所需要的代码长度。Go的语言在设计的时候参考了Python等解释性语言的优点，所以很多方面是优于Java而且远胜于C/C++的。举个简单的例子来说，在Java里边每一个Web Service收到前端的JSON都需要转成Java内部的Object(或者叫做Model)。在Java里边很可能有多少个field就有多少行Set函数，以至于甚至要单独写一个class来存储这些转换的代码。而Go里边只需要一个decode函数就可以直接转换，大大减少了代码长度也规避了很多可能出现的错误。其他比如多线程，channel等的理念也都是Java里边写起来要很费事的，但是Go作为设计之初就是专门为Web Service提供开发的，相应的功能都提供了很简洁的接口。Java则在设计之初(上世纪90年代)为了满足其通用性，有很多非常累赘的设计。\n\n**Bug还没有找到！**\n\n接下来我们对比一下Python这种解释性语言和Go。\n\n很多读者可能用Python写过机器学习相关的代码，感觉很熟手。这的确也是Python在工业界的一个最大的应用，写起来很多算法都可以套用别人的代码。但是Python是明显不适合作为工业界的web service来使用的，因为Python是一个解释性语言，也就是只有解释到了某一行代码的时候解释器才会去看代码是否写错了，而不是像Java/Go/C/C++这些编译型语言在编译早期就排查了很多Bugs。在production上面这个是致命的，因为这会埋下很多定时炸弹，只要提交代码那个时候没有问题，服务器也检查不出来。等到将来这个炸弹被触发的时候，往往都是一些莫名其妙的难以理解的Bug。无数程序员哭晕在厕所的故事我就不举例了。基于这些，并没有哪一个主流大公司会用python搭建自己的主要的后端平台。\n\n**Go的未来**\n\n大家可能也会留意到现在除了Google以外，Go在各个startup（如Dropbox，Pinterest，SpaceX）和一些老牌的公司(如Facebook，eBay)都受到了很大的欢迎。国内的IT公司更是用的很多，比如京东用Go打造自己的消息推送系统，美团和新浪微博也都用Go开发自己的后台流量支撑系统等等。因为Go是一门全新的语言，所以开发人员要重新学习这门语言并且迁移服务需要一段时间。\n\n如果你想了解Go以及其在Google Cloud当中的应用，欢迎报名参加来Offer的项目实战班，资深工程师手把手教会你如何开发下一代的互联网应用。\n"}}},{"node":{"title":"招码农没有那么容易, 每个公司有自己的脾气","path":"/en/news/2017-04-05-hiring-policies/","node_locale":"en-US","id":"ef64f108-556f-55e5-95b3-c9d695e414ea","contentful_id":"9E9mFrvzTUCMcCKSM2AAG1","date":"2017-04-05T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"不论是FLAG，还是独角兽，每家公司都有着自己的企业氛围、企业文化。天天泡在职场里的码农们，在自家公司的影响下，也带上了一些独有的气质。 Uber的员工对于加班的定义明显有所不同. Snapchat的员工看到Facebook，内心就很复杂；"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"082f0204-85f2-56f8-9c5c-7cc43b128717","body":"不论是FLAG，还是独角兽，每家公司都有着自己的企业氛围、企业文化。天天泡在职场里的码农们，在自家公司的影响下，也带上了一些独有的气质。\n\nUber的员工对于加班的定义明显有所不同.\n\nSnapchat的员工看到Facebook，内心就很复杂；\n\nGoogle的员工说话前总先看对方腰间的工牌；\n\nAmazon的员工对换组一事早已司空见惯；\n\n都说'三十年河东，三十年河西'。在硅谷，时局变幻可能用不了三年。昨天还和你一起聊天的同事，明天可能就去了独角兽当元老；前天刚刚拿到十八线小公司 offer的隔壁老王，第二天就可能因公司被FLAG收购，一跃成为一线码农....放眼望去，IT这盘棋，群雄割据，百家争鸣。笔者不才，曾在Pinterest当过几年面试官，每当和同事们聚在一起时，大家都喜欢'煮自家酒论别家英雄'，谈论着如果自己当CEO，会从Google，Facebook，Amazon等公司挖什么样的人过来...既然脑洞已经开到了这里，那就让我们先来细数一下几家公司的'脾气'，再来谈论每家公司'人才'的特点。我就随便说说，你且随便看看罢：\n\n**Google**\n\n蜀道难，难于上青天！**每个码农都想进入Google那座围城，仿佛这就是程序员就业的最高殿堂。**但也有人就把这里当做一个过渡站，想镀层金就跑路。不可置否的是，Google的人才的确很多，而且个个技术过硬，身手不凡。就好比三国演义里面的蜀国一般，牛人无数，充满传说。Google里的高手们擅长于无声处就搞定几个大项目，然后用一篇大paper告知世人：'这是我们的玩儿剩的（旧技术），原理在这，代码你们自己发明吧。'**Google的傲娇源于实力。**他们搭建的系统结构，其运行能力和稳定程度领先世界上其他公司好几个档次；当Google已经开始用人工智能生成代码了，百度还在无人车和人脸识别等领域内讧。 公司如此，于是传说也相应而生。比如，Google的顶梁柱之一——Amit Singhal在搜索方面很有建树，面试时曾当着公司创始人的面说：'我要重写你们的搜索引擎'。这就像是攒了钱去吃米其林三星，一进门就对厨子说，'你这菜不行，放着我来。'Amit确实做到了他许诺的事情，而且这么多年来，以他为首的搜索质量把关小组'一夫当关，万夫莫开'，严格控制筛选可以launch的实验。虽然Amit英雄末年没有躲过那一场桃花劫，但是留下的产品技术还是为人称道的。\n\n还有Jeffrey Dean，硅谷坊间一直流传着关于他的传说。比如：Jeff Dean构建完代码后提交代码，只是为了检查编译器和连接器没有BUG。Jeff Dean很会做人，情商极高，做了不少顺水人情——帮助不少team解决了悬而未决的难题，不少manager在办公室买高级咖啡机，就是为了Jeff Dean能偶尔来赏脸喝杯，讨论点小问题。**从Google挖人有些困难，但是肯花钱挖个中高层一定有好处，带来的不光是项目经验还有四方的追随者。**\n\n阿里早年间挖走了Mustang作者，这人帮阿里重建了搜索引擎，给千人千面的淘宝体验打下了坚实的基础；Pinterest挖走了Caffeine作者，这位老师一手带大Pinterest的探索体验，从建立索引到搜索，从推荐系统到质量管理，一个都没有落下。\n\n前面说了高手，接下来也说说偷懒的。并不是每一个Google的工程师都值得创业公司挖，**面试时候一定要小心那些顶着光环但不做实事，不去思考的渣渣。**我曾经面试过一个来自YouTube的做搜索的员工,问他视频搜索有什么特点，和网页搜索的不同在哪里？他回答：'做视频搜索质量没有什么用。'当时我内心就想，'既然没用你还做这么多年干什么，这不是打自己脸么？'\n\n还有的Google程序员把时间都花在了琢磨琐事上：'写程序用Tab还是空格？''不同的服务是放在同一个代码库还是分开存放？''用Thrift而不用Protobuf是不是太没有效率？'……有的人可能觉得这是浪费时间，可有的公司吃就这一套。于是这些爱捉摸的Google员工们改改简历、添加几句自己的'成就'，就变成了director和CTO。**然而现在纯技术创业在走下坡路，产品功能在迅速迭代，很难保持代码风格一致性；**没有好的系统支持，如何将上亿行代码保存在同一个代码库中又能节约编译时间；达不到上百万的qps，用Thrift和Protobuf细微的压缩差异从何体现。**这和同为FLAG的Facebook风格可大相径。**\n\n**Facebook**\n\n汉家萧鼓空流水，魏国山河半夕阳！**Facebook整个职场弥漫着一种来自于非洲大草原的野性**，员工不止有狼性，还有狮性，虎性...怎么凶猛，怎么来。而Facebook也乐于积攒这些新鲜血液，关键时刻，整个团队都可以像喝了大力一样，move fast and break things。Facebook的员工充满野心，从他们的创始人到底层员工都充满梦想。拿Mark Zuckerberg来说，今年个人目标是走遍美国50个州，可以窥探出竞选美国总统的野心。Facebook的员工注重实战，他们不一定有着最强的理论技术和实战经验，但是面对问题时总能设计出一套可行的解决方案，来满足每天12亿活跃用户的需求。就好像三国演义里面的魏国，有着一统天下的能力但缺少对个体的生动描写。Mark比较相信中国程序员，传说早期受到不少亚裔工程师的帮助。另有一帮中国信息学竞赛高手很早就加入Facebook，一马当先解决了许多难题。第一个加入Facebook的华人是赵海平，擅长软件性能优化和架构分析，Facebook早期主要依靠PHP语言，他创立了项目HipHop，重新编写了该语言的实现，使其速度提高了5到6倍。\n\n还有魏小亮老师，邵铮老板，符文杰教主等一些自带光环的角色也很早就加入Facebook。小公司很喜欢从Facebook挖人，因为Facebook出品的员工对产品理解深刻，对技术有追求。而Facebook的员工相对而言比较喜欢跳槽，因为当初，他们也是从别的大公司跳来Facebook的。Facebook的员工能给公司带来很多宝贵的经验，就拿Airbnb的XT老师来说吧，他是从Facebook几经转折过去的。当时Airbnb在尝试如何使用机器学习来做搜索排序，推荐排序等问题，但是学出来的模型一直比不过手调的模型。XT老师去看了不到一周，就找到数据当中存在的问题，之后这模型效果就节节高。我很少听说Facebook有什么偷懒的程序员，但是不成熟的确实不少。Facebook的员工平均年龄只有28岁，和你我一样，虽然有几年工作经验但是基础却不扎实，这也部分造成了move fast的时候难免break things。有的人进入Facebook几年训练，还是和毕业生处于差不多水平，一直忙于维护系统或把某功能实现的后台由A转移到B，没有受到比较大的挑战。还有人悄悄反应，现在员工之所以这么拼命，部分原因是前人搭建的系统比较难以维护。所以新的公司口号变成了work hard and get fired。\n\n大部分码农都幻想自己在2008年那时候能加入Facebook，现在错过了只能等一等看看下一个Facebook在哪里。**如果能挖到不那么浮躁的Facebook程序员，写程序比别人稳定一点，那你是幸运的。**\n\nFacebook年轻人多，干活拼，但是说到竞争可能还是比不过老大哥Amazon。\n\n**Amazon**\n\n白浪分吴国，青山隔楚天！Amazon的职场我只有听故事才能听到，扁平的结构加上自上而下的项目管理，员工工作风格让我想到了中国高考，开发，监控和维护，多手都要抓，多手都要硬。这家公司成立时间最久，到现在都23岁了。他们主攻电子商务领域和云服务，和其他两大巨头专做广告的策略很不同。如果说世界上最聪明的人都在忙着让你怎么点击广告，**那Amazon就在一直研究怎么让你买得放心、用得舒心。**Amazon做项目非常追求质量，他们没有测试和运维的工程师，只有软件工程师。这些工程师自己做开发，自己写测试，自己来维护。经过这么一训练，工程师就变得和三国中的东吴士兵一样，水路两栖。Amazon有不少牛人，他们设计了S3，设计了Dynamo，设计了独有的推荐算法还有Deep Scalable Sparse Tensor Network Engine。但是说到公司最出名的工程师，当属他们的创始人——Jeff Bezos。为了避免员工将问题简单化、鼓励他们多思考，Bezos禁止员工用幻灯片演示内容，要求员工每次都填写6页的方案报道。放到程序里也可以理解为放慢速度，提高质量，从写文档设计就开始想这个程序在什么情况下会出错，并且订正他——否则，你就要在凌晨爬起来改。\n\n另外，做工程师出生的老板更加相信人们互相竞争对产品的重要性——他设计了扁平化的管理结构：大多数人都在同一个level上，可以相互竞争而不用在意政治因素。**其次，他鼓励量化一切。**这给竞争带来了统一的衡量标准，减少了人为干预和不公平事件的发生。Amazon的各项规范，令Amazon的单兵作战能力大幅增强，同一个工程师可以从前端做到后端，同时还负责运营，他们推广的AWS被众多创业公司采用，也给他们工程师跳槽做了垫脚石。**于是乎，坊间有传闻，从Amazon挖人，挖的容易，用的放心。**但是有的时候Amazon也会跳出这么一类人，他们擅长作演讲，把简单的东西做复杂，最求perfect over progress但是却达不到。见过一个从Amazon出来的工程师，最初头衔不高，但是很会说。每次做演讲前就从分布式系统各项理论开始聊起，从CAP到不同的consistency模型，从paxos都raft，从machine learning到risk analysis，好像要各种东西都了解一些才能往下继续进行。Amazon的文化，造就了创业公司的预备役，这些人往往怀揣一身EC2和S3的本领。但也有不少打肿脸充胖子，凭借6张纸换得一个好职称的嘴炮程序员。\n\n其实说这么多，就是想让大家明白，名校，名公司都只是一层壳，想给自己的公司挖来几个牛人，要看到那些真正solid的程序员，不要进了别人的圈套。\n\n**王 栋**\n\n来offer特约作者。清华大学姚班07级，信息学竞赛国际金牌。目前任职于硅谷电商网站Wish，专注搜索推荐算法及系统设计。曾任独角兽公司Pinterest搜索排名负责人，带领团队设计和实现了高度可扩展的搜索平台，以及机器学习搜索结果排名算法。\n\n![code-wang](//images.contentful.com/04k2xg9gplcj/4xFX5Y1dpeaeIWQQg8UQEa/0a284623ff014e3504fce29f5104a40b/code-wang.png)\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"揭秘Pinterest大规模搜索引擎实战","path":"/en/news/2017-06-03-pinterest-large-scale-search-engine-practice/","node_locale":"en-US","id":"9c7ee1ce-c160-51f1-bc93-701b76e2837c","contentful_id":"9E9mFrvzTUCMcCKSM2AAG34","date":"2017-06-30T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical"],"description":{"description":"WWW大会上出现一篇论文'Related Pins at Pinterest: The Evolution of a Real-World Recommender System'，介绍了Pinterest推荐系统四年的进化之路。四年前，我加入了Pinterest的Discovery Team，那时候大半个Discovery Team都在忙着搭建这个叫Related Pins的新功能。我一不小心见证了Related Pins四年的发展，Related Pins如何从2~3人的项目发展到一个十几人的团队。"},"thumbnail":{"id":"17d494ea-9700-58e6-9780-3047160237d8","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/261aQpsgYAUaIGUyiKEwq6/0a31aadff691e61406183385bc125b69/technical-017-main.jpg?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"3d247a2b-1e29-5f78-9436-f0007045f72c","body":"![technical-017-main](//images.contentful.com/04k2xg9gplcj/261aQpsgYAUaIGUyiKEwq6/0a31aadff691e61406183385bc125b69/technical-017-main.jpg) \n\n**Pinterest推荐系统四年进化之路** (本文首发于硅谷程序汪)\n\n今年4月，WWW大会上出现一篇论文**'Related Pins at Pinterest: The Evolution of a Real-World Recommender System'**，介绍了Pinterest推荐系统四年的进化之路。四年前，我加入了Pinterest的Discovery Team，那时候大半个Discovery Team都在忙着搭建这个叫Related Pins的新功能。我一不小心见证了Related Pins四年的发展，Related Pins如何从2~3人的项目发展到一个十几人的团队。\n\n既然这篇论文已经发表，大家不妨一起看看Related Pins的进化史。**系统结构：道生一，一生二，二生三，三生万物**看Pinterest推荐系统首先要了解产品和数据特征，用户在Pinterest上可以点击一个Pin看大图；可以再次点击跳转到Pin背后的网页上去；如果在网页上待很长时间，我们则称这次点击是'长点击'；另外用户可以把Pin保存在自己的Board里。这个用户'保存'的比例是Pinterest最关心的产品指标。在Pinterest的数据模型中，每一个Pin都有自己的图片，链接和描述；每个Pin都存在一个Board当中，但是不同的Pin可能有相同的图片，被保存在不同的Board里。下文提到的Pin通常指包含相同图片的Pin的集合。\n\nPinterest的推荐系统进化经历了这么四个阶段：\n\n1\\. 在我2013年刚加入公司的时候，推荐系统主要基于Pin-Board的关联图，两个Pin的相关性与他们在同一个Board中出现的概率成正比。\n\n2\\. 在有了最基本的推荐系统后，我们对Related Pin的排序进行了初步的手调，手调信号包括但不局限于相同Board中出现的概率，两个Pin之间的主题相似度，描述相似度，以及click over expected clicks得分。\n\n3\\. 渐渐地，我们发现单一的推荐算法很难满足产品想要优化的不同目标，所以引入了针对不同产品需求生成的候选集(Local Cands)，将排序分为两部分，机器粗排，和手调。\n\n4\\. 最后，我们引入了更多的候选集，并且提高了排序部分的性能，用机器学习实现了实时的个性化推荐排序。\n\n**候选集进化：兵来将挡，新需求来，新候选集挡**\n\n最初的Related Pin只有一种候选集生成算法，并且我们直接把生成的候选集推荐给用户。后来引入了Memboost和基于机器学习的排序算法，候选集的生成更加注意Recall以及结果的开放性，所以产生的候选集越来越多。**Board Co-occurrence:** 主要的候选集生成算法还是基于用户的Pin和Board关联图，最初是Map/Reduce离线算法。对于每个Board，输出这个Board里面所有的Pin Pairs，然后在Reducer里面计算每组Pin Pair出现频率。由于数据量太大，所以我们进行了随机取样。在排序过程中还引入了Pin的描述和主题相似度等特征进行手调，效果很好。后来我们发现基于Map/Reduce取样的算法得到的相关度还有提升空间，对于罕见的Pin常常不能生成足够多的候选集，所以开始使用online的随机游走生成候选集。这个随机游走算法被称为Pixie，通过对Pin和Board关联图进行几十万步的模拟随机游走产生候选集，能够很好地解决上面提到的两个问题。**Session Co-occurrence:** 基于Pin和Board关联图的算法有很好的Recall，但是有时候他们不能理解Pin里面很细微的主题，一个Board也容易随着用户兴趣的转移而转换主题。这些问题可以通过挖掘有时效性的用户行为得到更好的解决，所以Pinterest也搭建了一套Pin2Vec系统来弥补co-occurence的不足。Pin2Vec通过学习用户在一定时间内的保存行为，得出N个最流行的Pin的嵌入向量。通过一个Pin的向量和学习网络，既可以预测用户接下来想保存什么Pin，也可以找到与用户询问Pin最为相似的几个Pin。\n\n**Supplement Candidates:** 除了以上提到的基础的候选集，Pinterest还采用了另外两种算法来对结果进行发散，并且解决冷启动的问题。每一个Pin会有相应的描述，主题等文字信息，由此可以产生基于搜索的候选集。这个候选集里的Pin比以上两种算法生成的相关度要差，结果相对发散，但是能给用户带来更好的探索体验。另一种是基于图片相似度产生的候选集，可以直接借用极度相似的图片生成的推荐结果，也可以把类似的图片Pin推荐给用户。\n\n**Segmented Candidates:** 最后，为了优化产品的生态系统，Related Pin引入了针对新鲜内容的推荐集合。在Pinterest走向国际化的道路上，又针对不同的市场做了不同的推荐集合。\n\n**排序过程：从拍脑袋到机器半自动**\n\n对于基本的搜索引擎和推荐系统，在有了大量数据之后，最容易实现的排序方式就是记住用户在每一个Related Pin页面与哪些Pin进行过互动。由于用户在使用不同客户端时，对不同位置的同一个Pin互动存在一定的偏差，所以我们在生成这个记忆的时候采用了**clicks over expected clicks**算法。一个Pin的Expected Click是这个Pin在不同位置上的impression数量与该位置的期望点击率的乘积。\n\n我们设一个Pin的Memboost得分是clicks over expected clicks：然后将Memboost得分和原始基于Pin和Board关联图，主题相似度和文字相似度得分线性结合在一起：这种简单的排序被实验证明是非常有效的。这个通过手调和记忆进行排序的过程在Pinterest度过了快三年的时光，在引入了越来越多的候选集后，人们逐渐意识到下一个大的提升可能来自于learning-to-rank。Related Pins设计了ranker对候选集根据query pin，当前用户，以及当前用户的上下文进行重新排序。在排序的时候采用了四类不同的特征：\n\n![technical-017-02](//images.contentful.com/04k2xg9gplcj/4CRyKWserSKgqmoqwImwKk/a96b83aa49afc31b771dc0a398b25b3f/technical-017-02.png)\n\n**Pin的特征:** 包括文字信息，图片信息，文字向量，主题类别信息以及Pin的人口信息 (如不同性别，不同国家和语言的统计信息)。\n\n**历史特征:** 包括上文提到的Memboost，用户过去进行的不同类别的动作信息，点击，长点击，保存等等。\n\n**用户特征:** 用户的性别，国家和语言。用户过去保存过的Pin，文字信息，主题信息等。\n\n**用户实时特征:** Query Pin是来源于主页，搜索还是哪一个Board。最近搜索过的问题，特征向量，最近保存过的，点击过的，长点击过的Pin。\n\n![technical-017-03](//images.contentful.com/04k2xg9gplcj/6hY3qIpdGoKCmUWUo4woIg/dff6e0c4e757b700528bd7ce5ecd2439/technical-017-03.png)\n\n在最初的版本里，我们从Memboost得分中生成训练目标，通常认为一个拥有高Memboost得分的Pin好于一个低Memboost得分的Pin，有Memboost得分的Pin好于一个随机的Pin，然后采用pairwise loss训练一个RankSVM模型。但是上面的版本很难模拟不同用户对结果不同的反应，所以我们转移到一个基于Session的训练模型。每一个Session都包含一个Query Pin，当前用户，动作以及一系列的推荐pin。当用户保存一个pin时，我们把这个pin和之前的pin取出，做pairwise的学习。(笔者认为: 在这个实践过程中应该还引入了周边的pin，以及一些不相关的popular pin作为反例，不然学出来的结果有可能会反转原先排序)版本三采用了RankNet loss和GBDT模型来模拟用户非线性的行为，新的模型也能更好的考虑**'如果Query Pin的类别是艺术，那么视觉相似度是一个很强的信号'**这样一类组合特征。\n\n最后，版本4则由pairwise loss回归到pointwise loss，虽然学术界一直认为排序问题listwise优于pairwise，pairwise优于pointwise，但实践中pointwise常常能达到与pairwise一样好的推荐效果。从人理解角度来看，其实用pointwise来预测用户的点击率，保存率更容易解释，从而用得分作为一个参考，在排序过程中引入其他信号，全面的优化产品的生态系统。\n\n**结语：路漫漫其修远兮**\n\n推荐系统在学术界已经有很多年的研究，但是在工业界里使用的往往还是最简单的算法，大量的数据能够很好地弥补算法上的不完美。Pinterest这篇文章很好的描述了推荐系统这几年是如何跟随一个创业公司从2~3个人就能搭建的简单系统成长到一个十几个人的团队维护和提高的包含3~4个components的大系统。在成长过程中，他们面临了'cold-start', 'rich get richer', 'engagement is not always correlated to relevance'等挑战，虽然不是每一个问题都能完美解决，但是提出有效的方案去减小问题影响正是工业界所需要的。\n\n笔者为能见证这一功能的完善和队伍的成长感到荣幸，预祝Pinterest早日上市。\n\n**王 栋**\n\n来offer特约作者。清华大学姚班07级，信息学竞赛国际金牌。目前任职于硅谷电商网站Wish，专注搜索推荐算法及系统设计。曾任独角兽公司Pinterest搜索排名负责人，带领团队设计和实现了高度可扩展的搜索平台，以及机器学习搜索结果排名算法。\n\n![code-wang](//images.contentful.com/04k2xg9gplcj/4xFX5Y1dpeaeIWQQg8UQEa/0a284623ff014e3504fce29f5104a40b/code-wang.png)\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"面试解题时, 有效方法与最优解, 到底应该选哪个？","path":"/en/news/2017-03-17-working-or-best-solution-which-is-better/","node_locale":"en-US","id":"3294e650-5617-53ee-86ec-4b7636c93f18","contentful_id":"9E9mFrvzTUCMcCKSM2AAG31","date":"2017-03-17T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career","Technical"],"description":{"description":"发现一个有趣的题目的最优解看似有趣，但有的时候会让你在面对复杂问题时把程序弄得更复杂。**比方说，如何搭建一个user autocomplete service？从算法和数据结构的角度考虑，第一反应就是建立一个trie。当面试官让你对user按照follower多少排序的时候，**你可以让trie每个节点多存一些数据。**当面试官说她既想autocomplete user first name，又想autocomplete user last name的时候，你可能想按照first name, last name建造一个trie然后按照last name, first name建造一个trie。那如果用户名又有middle name怎么办？面试官想按照id autocomplete怎么办？面试官想personalize user autocomplete怎么办？"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"86ba04f8-0a93-58b7-b6fc-1194e1efe3ab","body":"3年前硕士毕业前夕，我担心找不到工作，一口气投了27个简历。遇到面试题时，总想如何表现自己，总是在寻找一个问题的最优解。每当给你一个N行M列的矩阵，N和M小于1000，那么就开始想怎么得到一个时间复杂度O(NM)的解法；每当给你一个包含N个数的数组，让你优化什么东西，那么就开始想怎么样做到O(N)或者O(NlogN)；每当给你一个big number，那么一定有某种数学方法在O(logN)或者常数时间得到答案。\n\n**发现一个有趣的题目的最优解看似有趣，但有的时候会让你在面对复杂问题时把程序弄得更复杂。**比方说，如何搭建一个user autocomplete service？从算法和数据结构的角度考虑，第一反应就是建立一个trie。当面试官让你对user按照follower多少排序的时候，**你可以让trie每个节点多存一些数据。**当面试官说她既想autocomplete user first name，又想autocomplete user last name的时候，你可能想按照first name, last name建造一个trie然后按照last name, first name建造一个trie。那如果用户名又有middle name怎么办？面试官想按照id autocomplete怎么办？面试官想personalize user autocomplete怎么办？\n\n**在你试图用最优解方法来解决一个问题的时候，这个方法渐渐变得不易扩展。**可以想象那时面试官心里的表情，而我也在担心自己是不是会被那个公司reject。当我开始工作，完成的project越来越多的时候，**我越来越意识到解决一个问题的有效方法更为重要，**这个方法来自于你对问题更深入的理解和估计，很多美国本科毕业生常常表现的更好。你需要知道从memory里读数据大概要100ns，读SSD大概要16us，Disk seek可能要3ms，这比一个data center里的round trip(500us)还要慢，但是比CA到NYC的round trip(200ms)要快得多。AWS提供的机型有8x800GB的SSD硬盘，足够你将上题中提到的trie换为其他更简单的key value store存在硬盘上并且承担足够大的QPS。当面试官想让你设计一个系统来realtime回答每个地区实时有多少空出租车，有多少在工作的出租车，以及有多少用户在叫车。关注最优解的人也许会想到直接通过用户实时数据反馈来更新数字，这时你就会被面试官challenge一些奇怪consistency问题。如果你维护一个key value store，用户只需不断的update这个key value store，而你实时扫描这个key value store，2012年美国才有200k taxi drivers，现在也不超过400k，一秒钟你可以扫描上百次这个key value store。\n\n**有了这个有效的可行解，还需要什么优化呢？**\n\n如果你想面试一个更高level的职位，你可能要对某一领域很精通，说到这就要区分吹牛逼的人和做实事的人了。也许你在外演讲CAP，并且能清楚区分Linearizable consistency，Sequential consistency，eventual consistency，可是搭建出来的系统原公司里的人都不想用。也许你每天对着实验结果说这个significant，这个不significant，可是却说不出chi-square distribution的基本性质。这里的种种故事今天就不讲了…\n\n吐槽到此结束，各位看官见笑了。\n\n**王 栋**\n\n来offer特约作者。清华大学姚班07级，信息学竞赛国际金牌。目前任职于硅谷电商网站Wish，专注搜索推荐算法及系统设计。曾任独角兽公司Pinterest搜索排名负责人，带领团队设计和实现了高度可扩展的搜索平台，以及机器学习搜索结果排名算法。\n\n![code-wang](//images.contentful.com/04k2xg9gplcj/4xFX5Y1dpeaeIWQQg8UQEa/0a284623ff014e3504fce29f5104a40b/code-wang.png)\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"我是艺术生, 但我拿到了Bloomberg的程序员offer","path":"/en/news/2017-05-02-got-offer-from-bloomberg/","node_locale":"en-US","id":"c5a47dd6-216d-5cac-a537-a26c9f464fc6","contentful_id":"9E9mFrvzTUCMcCKSM2AAG32","date":"2017-05-02T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career","Technical"],"description":{"description":"20号下午接到了Bloomberg的offer，到现在我都还觉得自己在做梦。怎么说呢，就是觉得，'啊，我竟然真的能达成这个目标啊!'，有种非常不可思议的感觉。但我知道，如果没有报名来offer，如果没有各位老师的教导和帮助，我应该是很难很难很难成功转行的。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":null,"body":{"id":"b48ce73f-7ef4-5b96-b3a1-6367c7b9284c","body":"20号下午接到了**Bloomberg**的offer，到现在我都还觉得自己在做梦。怎么说呢，就是觉得，**'啊，我竟然真的能达成这个目标啊!'**，有种非常不可思议的感觉。但我知道，**如果没有报名来offer，如果没有各位老师的教导和帮助，我应该是很难很难很难成功转行的。**\n\n先介绍一下我的背景 。对于老师们来说我绝对是学员里的hard mode。本科的时候读过一年computer science，后来转读Art History去了。研究生期间也继续选择了Art History。结果毕业前好几个博物馆出现财政危机，整个arts行业一片hiring freeze。尤其当时又决定不读博了，真的是不知道何去何从。\n\n和好多亲戚朋友商量过，大家都提议说要不就转行吧，转回CS说不定机会还多一点。可是我真的是什么都不记得了，不记得怎么写程序，不知道OOD是什么…**真.的.什.么.都.不.懂.**朋友当时建议我看一下Head First Java入个门，然后就报来offer的课程学回来吧。\n\n报名的时候是真心是抱着试一下的心态的，想着反正我的背景很可能老师一看到就放弃了，怎么也没想到孙老师当天下午就打了电话过来。老师那天和我聊了大概有一个小时吧。我到现在都记得老师和我说,（大意）**来offer不guarantee jobs，但是努力的话，就能达到目标。**我向来都是trigger pull得超级快的性格，一周内就报名了。现在想想，当初真是做了一个无比正确的决定。\n\n我是16年秋季班开始上课的。刚开始上课的时候，有两次都不小心miss了课。过后找孙老师要录像的时候被严肃教育了。现在回想起来还好还好我过后再也没miss过。**因为上课的时候同步带来的那种氛围和注意力和看录像完全是两回事。**在课上听孙老师讲题学的不只是怎么解决这些问题，还要学会怎么make reasonable assumptions，学会怎么接hint（面试的时候面试官大部分都是愿意交流的），学会怎么解释思路，学会怎么过例子。\n\n我另外还上了project课。对于我这种简历一片空白的人来说，真的是帮大忙了。Project课不止是复制代码然后做出一个product，更重要的是了解project里的各种衡量和选择。**老师们都讲得非常细，只要认真听课，面对面试的各种resume问题大多可以轻松过。**\n\n12月中考完期末考后（神奇地竟然考得还不错）休息了两周，我1月4号开始投简历。1月份的时候找好几个来offer的老师改过简历。因为我的背景很勉强很勉强能搭上前端，所以另外又找苏老师打电话问了一大堆前端面试的注意事项。**当时一直就想，所有老师都这么responsive和responsible真的是太好了:D**\n\n1月和2月期间虽然面了好几个小公司，但是因为各种各样的原因（具体略过），都被拒了。2月底的时候整个人都觉得非常茫然。 投出去的简历都是石沉大海，networking也不尽人意。意识到自己状态有点差以后我当天就约孙老师打电话商量。**当时老师就答应了帮我找之前的学姐们内推Amazon和Bloomberg。**第二天就全部安排妥当了（谢谢Zoie和Ying Li学姐帮忙！！！）。3月中接到了Bloomberg约电面。提前又找了孙老师帮我mock各种behavioral questions。一mock发现真是各种问题。对各种经典behavioral questions我的回答都非常粗糙，显得情商特别低。老师帮我改了好多问题的回答以后，算是心里有底了。不管电面和店面答起来都有了信心。电面问得非常简单，写完code问了一下time and space complexity。我把孙老师课上画的recursion tree在hackerrank里重现出来立刻过。\n\n19号Onsite，每轮面试（理论上）45分钟，5分钟自我介绍，问问简历，35分钟问各种technical questions，最后5分钟Q&A。讨论题目都是用铅笔和纸 。第一题是常见的类型。我却完全跑偏了。两个面试官听了一下我的大概想法面面相觑，明显地散发出一种'呃……'的气息。感觉到气氛不对，我又重新看了一下题目，描述了一下解决问题的过程，然后提议用Set+Recursion来解决这个问题。稍微年轻一点的面试官当时就低声说了一句'Right!'（学会接hint和读空气真的很重要）。题目写出来过后面试官还会问一下要怎么test，以及要我手动跑几个简单的test cases。我根据老师大课上讲题的过程，标出breaking point，一步一步跑例子，没有任何难度。\n\n第二轮是30分钟后。两道题都是非常简单的题目。我一听就内心偷笑，这么简单的题目！大概描述了一下想法，我就准备开始写了。Signature刚写完，面试官就问为什么这样写。为什么是String不是char[]，为什么是return boolean。写完后分析还问时间复杂度为什么是O(n)，为什么不写O(n/2)，怎么cause heap overflow without causing stack overflow。非常简单的题目，但是问得特别细。 写的过程中他还问要怎么fool过garbage collector不去清理旧的nodes。题都是很简单的，但是这个面试官就是做到把各种概念和联系都问得非常清楚。虽然面的过程我觉得很辛苦，但是面完真的非常服气。虽然我也有在某code上刷题，但是对于Java的理解都是从大课和Java课上得来的。面试要面得好，靠得不止是刷题（当然做题也还是要的），基础也要打好，课上的各种OOD和System Design虽然坊间传闻面entry level不常问，但是有所了解真的很有帮助。\n\n4点45和Manager聊完，recruiter送我出门。临走前还在电梯间碰到了第二轮的面试官。我当时还特别高兴地和他打了招呼，随意聊了几句。**走出Bloomberg大门已经5点，onsite总共七小时。**\n\n因为我周五就要给另外一家公司答复，周四下午2点多Bloomberg recruiter就打电话告诉我有offer了。下午5点前正式的documents就全部来齐了。这样还能给足我时间去研究terms。接到offer第一反应就是告诉孙老师。没有孙老师和来offer，我真的想像不到自己能走到这一步。\n\n这篇东西真的写得好长啊（文科生习惯）。\n\n**总结起来就是，谢谢来offer！**\n\n**大家加油，好好听课！**\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"留给码农的时间不多了, 这些题都不会, 怎么过海关?","path":"/en/news/2017-03-06-interview-questions-help-you-go-through-us-customs/","node_locale":"en-US","id":"40f251ea-2c42-5c48-9071-ed667e8da613","contentful_id":"9E9mFrvzTUCMcCKSM2AAG30","date":"2017-03-06T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Algorithm"],"description":{"description":"2月26日，28岁的尼日利亚软件工程师Celestine Omin持短期签证第一次来到美国。在JFK机场入境时，他被海关人员要求回答程序相关题目，证明他确为软件工程师之后才被允许入境。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":null}},{"node":{"title":"职场小白如何升职加薪，8个月华丽蜕变","path":"en/news/2017-02-10-how-to-get-promoted/","node_locale":"en-US","id":"3b7e1ece-7463-5e9e-94ca-e3de96d5e764","contentful_id":"7E9mFrvzTUCMcCKSM2AAGq","date":"2017-02-10T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"今天的故事来自来offer学员Z同学，Z同学仅用了8个月时间便在当红独角兽公司成功升职加薪。毕业后短短的一年中，她是如何从懵懵懂懂的new grads小白，赢得信赖并蜕变为上司的得力助手呢？ 上周，我收到了HR发来的正式通知，入职Snap不到八个月完成升级。而一年前的这个时候，已经毕业两个月的我连一家onsite还没拿到，正为没钱、没工作、没身份焦虑不已。如果没有来Offer，我难以想象自己要绕多少弯路才能走到今天。我拿到offer时已经写过一篇找工作心得，这一次主要想聊聊开始工作后的体会。我以前只是觉得来Offer讲算法鞭辟入里，给我打下了扎实的基础，提高了我的面试能力；现在却越来越感受到，从这里获得的眼界和思维方式，才是真正最有价值的部分。"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"1f84a7e8-c2e6-5e82-afde-d8a7df9a679b","body":"今天的故事来自来offer学员Z同学，Z同学仅用了8个月时间便在当红独角兽公司成功升职加薪。毕业后短短的一年中，她是如何从懵懵懂懂的new grads小白，赢得信赖并蜕变为上司的得力助手呢？\n\n上周，我收到了HR发来的正式通知，入职Snap不到八个月完成升级。而一年前的这个时候，已经毕业两个月的我连一家onsite还没拿到，正为没钱、没工作、没身份焦虑不已。如果没有来Offer，我难以想象自己要绕多少弯路才能走到今天。我拿到offer时已经写过一篇找工作心得，这一次主要想聊聊开始工作后的体会。我以前只是觉得**来Offer讲算法鞭辟入里，给我打下了扎实的基础，提高了我的面试能力；现在却越来越感受到，从这里获得的眼界和思维方式，才是真正最有价值的部分。**\n\n**1. 初入职场压力山大**\n\n对bug束手无策，优秀同事带来隐形压力，但是前进的路没有捷径，踏踏实实勤能补拙。\n\n去年五月底，我正式入职Snapchat（现已更名Snap）。这是我人生的第一份全职工作，也是我第一次进入美国公司。第一天去上班我紧张到爆炸，还处在'我是怎么混进这么好公司'的懵逼中。我司风格是入职当天就给派活，第一周熬到周四我真的好想哭。不用说升职加薪了，刚开始一两个月只是想着千万别被fire。**大面积的代码看不懂，测试平台搭不起来，对bug束手无策，甚至git都玩不转，真的是有几次想撂挑子不干的。**这时孙老师的金牌鸡汤上场了。'要到长大以后，我们都变成了星矢，才最终知道，我们不会有无敌的绝招，不会有死而复生的神力，真正能让我们获得人生这漫长战役的胜利的，只有我们绝对不放弃的耐力'。这段话曾经支撑我度过了只身在湾区小黑屋苦苦找工的漫长冬夜，现在也依然激励着我克服每一个工作上的困难。我的同事们各种名校phd、ACM金牌、百万用户项目经历；即使同样是new grad，随便一个都有Top10 CS科班或者FLAG实习加持。相比起来，普通学校刚转CS一年、只有中国小公司实习的我，真的是被秒成渣。**但孙老师总在鼓励我，要清楚自己不够强，但也要相信自己会变强。于是科比看过的凌晨四点的洛杉矶，我也在加班时看过了。程序员这条路没什么捷径，背景薄弱就踏踏实实多花时间来补。**从来没有'一个月拿到Google offer'，也从来没有'一年成为top coder'。\n\n**2. 主动思考，机遇无限**\n\n按部就班接受指令，只会止步不前。主动思考勇于承担，机会就在前方。\n\n慢慢地我适应了工作环境，维护手上的项目也能胜任了，这时manager交给我一个全新的项目。我完全没有从零开始做一个生产项目的经验，而且又是我从来没做过的web，所以刚开始基本上是manager搞定一切。他弄清楚需求，设计好系统，制定实施步骤，我只要完成他给我的任务就可以了。manager说理解我是新人，我自己也觉得这样就不错。正值此时，来Offer举办了第一届校友会。虽然是在湾区，但我还是订了当天往返的机票去参加，结果真是不虚此行。除了扩展人脉，还聆听了各位老师的经验分享。其中张老师有一句话：'**每个人在工作中都会经历三个阶段：manager告诉你该做XX，你问manager能不能做XX，你告诉manager我们应该做XX。每到一个阶段都是你提高了一个层次。**'我一下被点醒了，意识到如果满足于接受manager的指令，那我永远只能是个'新人'。**我马上重新思考了当前的项目，主动跟manager提出了自己的系统设计。之后的每一步，也都是我主动发现问题，寻找解决方案，找其他部门协调。**manager后来也放手让我去做，只在必要时提些建议。这个项目真正成了'我的'项目，它的上线也直接促成了我的升级。manager在报告里最重点写的就是这个项目，说我远远超出了他对一个new grad的预期。的确，职场新人大都懵懵懂懂，如果没有张老师高屋建瓴，光凭我自己还不知何时才能意识到要往下一个层次去。\n\n**3. 良好沟通促进协作**\n\n把握机遇和挑战，培养有效沟通能力，赢得信赖的同时，促进工作顺利完成。\n\n 来Offer还教会了我重要的一课——沟通和表达.\n\n很多位老师都说过，**虽然我们是程序员，但并不是只跟程序打交道，现实工作中与人交流和写代码同等重要。**这一点我非常赞同，也深有体会。上课期间训练出来的英语表达能力，不仅帮助我攻下了一个个面试，更在我工作之后发挥了巨大的作用。刚入职时，都是senior工程师或者manager带我去开会，一般轮不到我说话。直到在做前面提到的新项目时，有个跟几位有决定权大佬的meeting，将拍板那个项目能不能上线。正巧manager临时去不了，就让我自己去。其实我的内心是崩溃的，那是我第一次在众人面前完整地讲解一个项目，还要接受他们对各种细节的质疑。**虽然全程我腿都在抖，但最终还是成功搞定了几位大佬。从那以后，manager就经常让我自己去开大大小小的会了。**他在升级报告里说，我与技术和非技术人员都有很好的沟通，他可以完全信任我直接去跟各方交流。实际工作中从来没有能凭一己之力完成的任务，我们需要不断地跟其他工程师、PM、QA、各种specialist打交道，而他们都有着不同的背景，来自不同的种族和国家。良好的沟通能力一定是优秀工程师的必备素质。\n\n虽然现在不在来Offer上课了，但我还是一直和老师们保持着联系。**来Offer的每位老师都是业内翘楚，每个人身上都能列举出几段让我仰视的经历。我真心敬佩他们的能力，也由衷感谢一路上他们对我的帮助。**上课时我关注的重点都在算法上，但走出去再回头看，很多当时以为的闲聊其实和知识本身同等受用。作为senior工程师和manager，经常老师们随口说的一句话都够我们体会好几年。这样耳濡目染，我们就会比同龄人超前走很多。于我而言，来Offer早就不仅是找工作时的算法培训班，更是我今后职业发展甚至人生方向的导师。**来Offer不仅带给我offer，从这里获得的真知灼见、深度思考和坚定力量，都帮助我在拿到offer后走得更好。这里不仅'教书'，更'育人'。**希望每位同学都能好好珍惜这个平台，也为从'北美工程师的黄埔军校'走出而骄傲。\n\n图片来自网络，版权属于原作者"}}},{"node":{"title":"数据科学求职讲座总结: 认清两大误区, 牢记五大对策！","path":"/en/news/2017-07-15-how-to-be-a-great-engineer/","node_locale":"en-US","id":"7484aa6e-03ac-5b2c-956b-ba4dabe46cc9","contentful_id":"9E9mFrvzTUCMcCKSM2AAG19","date":"2017-07-15T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Career"],"description":{"description":"一位工程师，如何才能称得上优秀？除了写得一手好Code，什么样的工作态度和方法才是一个优秀工程师的必备？7月11日，陆奇出席百度内部Engineering Leadership Talk。我们一定要有一个坚定不移的深刻的理念，相信整个世界终究是为技术所驱动的。有没有其他人已经解决这个问题？然后你可以把你的时间放在更好的创新上。做什么事情一定要做最好，一定要是做业界最强的。我把自己想象是一个软件、一个代码，今天的版本一定要比昨天版本好，明天的版本肯定会比今天好。看到问题也不要去问别人，就把它Fix。"},"thumbnail":{"id":"501f2e2b-d465-5ce9-9665-b7d415d1a2bd","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1JEQSdzd16ukYwsMaWgkO6/140d0a07a9427c8d44e92336a2daf260/baidufamily.jpg?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"e66d4a73-b4bd-5230-8bb2-12eb5cf924c2","body":"一位工程师，如何才能称得上优秀？除了写得一手好Code，什么样的工作态度和方法才是一个优秀工程师的必备？\n\n7月11日，陆奇出席百度内部Engineering Leadership Talk。\n\n我们一定要有一个坚定不移的深刻的理念，相信整个世界终究是为技术所驱动的。有没有其他人已经解决这个问题？然后你可以把你的时间放在更好的创新上。做什么事情一定要做最好，一定要是做业界最强的。我把自己想象是一个软件、一个代码，今天的版本一定要比昨天版本好，明天的版本肯定会比今天好。看到问题也不要去问别人，就把它Fix。\n\n作为计算机科学博士及优秀的管理者，他提出的五点要求，对每一位百度工程师都适用。\n\n**1——Believe in 技术**\n\n首先要相信技术，我刚才已经讲了，整个我们工业界，特别是像百度这样的公司，对技术坚定的、不动摇的信念特别重要。我也分享一下，盖茨提到微软公司的宗旨就是：写软件代表的是世界的将来。\n\n为什么？\n\n**未来任何一个工业都会变成软件工业。**盖茨是对的，因为任何工业任何行业自动化的程度会越来越高，最后你所处理的就是信息和知识。但现在软件的做法又往前提了一次，因为在人工智能时代，不光是写代码，你必须懂算法，懂硬件，懂数据，整个人工智能的开发过程有一个很大程度的提高，但是，技术，特别是我们这个工业所代表的技术一定是将来任何工业的前沿。**所以我们一定要有一个坚定不移的深刻的理念，相信整个世界终究是为技术所驱动的。**\n\n**2——站在巨人的肩膀上做创新**\n\n我们观察一下，在美国硅谷、在中国，互联网创业公司也好，大型公司也好，大家的起点是越来越高的。为什么现在创新速度那么快？主要是起点高了。我们可以使用的代码模块，使用的服务的能力，都是大大的提升。在内部我想强调这一点，很多大公司包括微软在内，内部的Code都重做了无数遍。我现在的要求是，每一次你写一行新的代码，第一要做的，先想一想你这行代码值得不值得写，是不是有人已经做了同样的工作，可能做得比你还好一点。有没有其他人已经解决这个问题，然后你可以把你的时间放在更好的创新上。特别是大公司里面重复或者是几乎重复的Code实在太多，浪费太多的资源，对每个人的职业生涯都不是好事情。我再强调，在大公司内部，你写代码之前想一想，你这行代码要不要写，是不是别人已经有了，站在别人的肩膀上去做这件事情。\n\n**3——追求Engineering Excellence**\n\n我要另外强调的一点就是Engineering Excellence，工程的技术的卓越性和能力。任何市场上竞争就像打仗一样，就看你的部队体能、质量，每一个士兵他的训练的程度，和你给他使机关枪、坦克，还是什么样的武器。所以Engineering Excellence跟这个类比，我们要建的是一支世界上最强的部队，每一个士兵，每一个领军人，每个人的能力，他的训练都是超强的，然后我们给每个人提供的工具和武器都是一流的。\n\n所以Engineering Excellence是一个永无止境的、个人的、团队的，能力的追求和工具平台的创新，综合在一起可以给我们带来的长期的、核心的竞争力，为社会创造价值，最终的目的是给每个用户、每个企业、整个社会创造价值。我另外还要在这里强调的一点就是Relentless pursuit of excellence：永无止境的不断的持续的追求。我们要么不做，要做的事情一定做最好，这是我对大家的要求。数据库也好，做大平台也好，大数据也好，我们要做什么事情，我们一定要下决心，这是我对你们每个人的要求，做什么事情一定要做最好，一定要是做业界最强的。\n\n**4——每天学习**\n\n每天学习，可能是对每个人都是最最重要的。我今天分享一下，我自己怎么想我自己的。就很简单一个概念，**我把自己想象是一个软件、一个代码，今天的版本一定要比昨天版本好，明天的版本肯定会比今天好，**因为即使犯了错误，我里面有If statement，说如果见到这个错误，绝对不要再犯。\n\n英语，另外有一句说法就是Life is too short, don’t live the same day twice. 同样一天不要重活两次。每天都是不一样，每天为什么不一样，因为每天都变成最好，每天都变得更好。今天的版本一定要比昨天好，每个好的、杰出的工程师，杰出的技术领袖，一定要保持自己学习的能力，特别是学习的范围。\n\n在这上面我也稍微引申一下，做Computer science的，如果只学Computer science，不去学一些其他的行业，肯定不够。我举个例子，经济学必须要学。为什么这样讲？\n\nComputer science它有个很大的限制，他是假定你有输入以后有输出，这种解决问题的方式有它的好处，但有它的限制性。我给大家举个例子，地图导航，如果你纯粹用这个方式去做，你只是把一个拥挤的地方移到另外一个拥挤的地方。经济学，它对问题的建模是不一样的。它起点是假定是一个整体的一个生态，每个人的输入都是另外一个人的输出，你要用经济学的方式来描述地图导航的问题，你就会去算一个Equilibrium，市场也是这样。如果把深度学习真的要想彻底，必须把物理重学一遍，把生物学看一遍，再把进化论再看一遍。因为深度学习跟这些东西完全相关，自己肯定想不清楚，要彻底想清楚，必须学。另外，学产品，我以前跟所有的工程师都讲，如果不懂产品，你不可能成为一个最好的工程师。\n\n真正要做世界一流的工程师不光要懂产品，还要懂整个商业，懂生态。因为你的工作的责任，是能够看到将来，把技术展望到将来的需求，把平台、把开发流程、把你的团队为将来做准备。所以学习是非常非常重要的。\n\n**5——Ownership**\n\n最后是从我做起。我们公司有个非常大的使命，用科技让复杂的世界更简单。整个世界非常非常复杂，人其实所做的事情基本上都是Reduce entropy。因为从热力学第二定律来讲，世界是会变得越来越乱的，我们想做的事情就是把它变的更简单，让我们生活变得更美好。而且具体的，我们可以通过人工智能技术来做到唤醒万物，但是这一切是通过每一个人的一点一滴的行为累计起来，从我做起。还有**Ownership，看到机会不需要问别人，有机会就去做，**看到问题也不要去问别人，就把它Fix。把我们的使命、把我们的公司当成我们自己每个人的事业来做。\n\n我可以坦诚的给每个人讲，如果你把公司的使命，把公司的事业，当成你自己个人的事业，Own everything，你在职业生涯一定是走得最快。从我做起，从身边的每一件事情做起。\n\nBelieve in 技术、站在巨人的肩膀上做创新、追求Engineering Excellence、每天学习、Ownership，陆奇送给每一位工程师的建议，你get到了吗？\n"}}},{"node":{"title":"93%的简历被谷歌直接筛掉, 程序员该如何打造求职简历？","path":"/en/news/2017-09-26-how-programmer-build-resumes/","node_locale":"en-US","id":"0aca75c7-d660-5de9-85e3-34797928856e","contentful_id":"6E9mFrvzTUCMcCKSM2AAGq","date":"2017-09-26T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"Vincent：来Offer项目实战班主讲，Senior Full-Stack Engineer，在FLAG一线大公司拥有多年的面试经验，帮助上千名同学修改简历、辅导面试。 我与许多应届生、求职者交流过，发现他们中的很多人对于简历的认识，仍停留在比较初期的阶段。而从他们对简历的认识误区中，则能看到许多人关于CS求职较为“想当然”的理解。因此，我想说一下如何打造简历，一个面试官到底希望看到什么样的简历，希望招到什么样的人才。"},"thumbnail":{"id":"0b62af3b-11a6-503b-b2a2-940856c2c803","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/EAQy5FDtugKcGaUae8kY/7d6b347a7d174f4f5272805f1d440ffe/career-103-01.jpg?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"bf4d2025-1aa1-5396-be08-bf518e6ee727","body":"**Vincent：**来Offer项目实战班主讲，Senior Fullstack Engineer，在FLAG一线大公司拥有多年的面试经验，帮助上千名同学修改简历、辅导面试。\n\n我与许多应届生、求职者交流过，发现他们中的很多人对于简历的认识，仍停留在比较初期的阶段。而从他们对简历的认识误区中，则能看到许多人关于CS求职较为“想当然”的理解。因此，我想说一下**如何打造简历，一个面试官到底希望看到什么样的简历，希望招到什么样的人才。**\n\n我主要想讲这三大部分：**修改简历的重要性、怎么写好项目/工作经历、简历一无可写怎么办。**\n\n先举一个简历实例，一个物理PhD和一个Top30名校毕业的Computer Engineer的学生同时针对一个SDE的职位投出简历，你认为谁的胜算会大一些？下面就是这两个同学的简历，大家可以自行比较一下。\n\n![career-103-01](//images.contentful.com/04k2xg9gplcj/EAQy5FDtugKcGaUae8kY/7d6b347a7d174f4f5272805f1d440ffe/career-103-01.jpg)\n\n最终，是物理PhD拿到了Offer。这说明，这个求职市场并不是100%地“看出身”，更多时候，还是要看简历上的干货，而这些干货还要与职位要求相符。\n\n根据2016年的数据统计，**只有不到7%的人撑到了谷歌的onsite面试**，而每年被直接筛掉的简历，则在百万份左右。所以对于简历，如果你的认识还停留在名校和专业的层面上，很有可能，你就是那被筛掉的93%。\n\n**一、为什么简历这么重要**\n\n很多北美CS求职者可能想不到现在竞争是有多么激烈。一个职位往往有几十个甚至上百个candidate来竞争。那些提供H1B签证，将来会sponsor绿卡的岗位就更是炙手可热了。想在这样的激烈竞争下，拿到Offer，你的简历必须要能经得起多方面的检验。\n\n**HR：**不管什么职位，面试的第一步就是HR筛选简历，而你的简历只有10秒钟的机会，然后HR就会决定你这一关是Fail还是Pass。\n\n**内推：**有些求职者会觉得，我有内推，简历差一点不怕。这是错误的。即使你的推荐人愿意给你倾尽全力内推，他也需要根据你的简历论证你有哪些优点。如果你的简历写得空洞无物，再有心的推荐人也无能为力。这也是很多同学即使找了内推，依旧没有拿到面试的原因。\n\n**面试：**到了面试这关，简历仍然很重要。面试官会根据简历来快速判断你是否值得他仔细面试。如果你的简历没有引起他的感兴趣，那在他心中可能已经给你判了死刑了，等下出个LC Hard的问题刁难你，你的feedback自然不会好，最后的结果就是呵呵一笑：Thank you for your interest。\n\n当然，也不能为了充实简历就走向另一个极端：为了拿到面试，**把简历写得极尽fancy。**这样倒是让HR和面试官眼前一亮，但是针对你的简历来提问，你却答不上来，照样会挂掉。\n\n**二、如何写好你的项目和工作经历**\n\n既不能空洞无物，也不能过分夸张，那么在10秒钟之内，面试官到底想看到什么呢？\n\n**关键词**\n\n10s内能够让面试官看上的简历，肯定要有**热门的技术词汇**，最好还是和面试官（他们也是工程师）息息相关的技术。\n\n这一点大家经常有个误区，觉得我一定要高大上，简历上的技术越新越好。但是，这些技术往往还没来得及大规模推广，甚至面试官都不知道，很可能写上去是没有用的。反之有些技术，比如Test、Log、Git这些，看上去并不fancy，但是这是每一个工程师天天要做的工作，反而能把你和其他new grad区分开来。不要小瞧这一点，包括一些CS的master很多都不会Test、不会分析Log、不会Git。\n\n你的简历如果既有一些**较新的技术**（一般出来一两年左右的，类似Go、React），又有**经典的必备的技能**，那么就一定能够吸引他的眼球。\n\n**真实性**\n\n既然技术词汇这么重要，那我就把经典的、热门的技术全部写在简历上，堆成一个项目好不好？面试官不是傻瓜，他对简历的敏感度非常高，能够一眼看得出来哪些就是为了堆上某个技术而砌出来的项目。\n\n举个简单的例子来说，有同学在简历里边写了一行：**Designed and developed a web applicaiton with Java, Eclipse, Hadoop, AWS EC2, REST API。**技术本身都是极好的技术，但是这样写是非常错误的。\n\n**首先，这个描述极其缺少context，面试官无从判断这个项目的价值。**你的web application，是一个简单的一页的个人主页呢？还是一个有多个page的推荐系统呢？没有这个context，面试官无从了解你的这个项目的完成时间和完成深度。所以这个真实的context必须得有。有些同学可能上过一些求职课，知道应该用数字证明成果，这个其实也是context的一种。\n\n**另外，单纯的技术堆砌往往缺乏联系和逻辑，无法说服面试官。**比如说，Deployed the system on AWS，这个AWS本身没有错，但是你的这个项目为什么要部署到云上面去呢？之前遇到什么问题？你是带着目的性去部署这个系统，还是说仅仅为了学习AWS而去做的呢？如果是我来写，我最起码会写上Deployed the system on AWS to improve scaling。这样才能证明我是明白AWS的用途的，而不是为了堆砌。\n\n**深度**\n\n还有一些同学，尤其是CS Master和转专业的同学，有这样的疑问，如何让我的简历显得更有深度？我认为你的简历需要体现设计和实现上的复杂性。我总结了一个描述的技巧：**起承转合。**\n\n**第一行，起。写清楚项目的背景。**写一下研究过什么同类的产品，我的产品的优势是什么。这能告诉面试官我不是随意设计一个项目的，是有目的、有规划的。\n\n**第二行，承。一般我会写基本的实现。**用了什么框架、什么技术。记得要把context交代清楚。\n\n**第三行，转。描述遇到的挑战，是如何解决的。**通过这条，说明我这个项目不是应付交差，而是做了一段时间，遇到了问题，并且解决了问题。\n\n**第四行，合。描述最终的结果。**我是如何delivere、present、test这个项目的。告诉面试官我有ownership，能保证产品的最终完成。最好可以用一些数字来体现结果，而不是空洞的描述。\n\n用这样一个四段论，比全部都在说做了A功能、B功能、C功能，在深度上好太多。\n\n**三、简历一无可写怎么办？**\n\n对于零基础、转专业的同学，简历上没什么可写的是个普遍问题。要解决这个问题，就需要发掘自己的优势。\n\n很多时候大家觉得自己无从下笔有几方面的原因。**第一，做的项目和想投的工作不吻合**，比如想投CS专业，手中却只有EE相关的技术经验，或者想投工业界的职位，却只有Research方面的经验；**第二，做的项目觉得不够重要**，比如就是修修bug，改改button之类的简单任务；**第三，确实是什么经历都没有。**\n\n针对第一类问题，可以想办法和目标职位靠拢。比如说CS和EE有很多**通用的经验和技术**，诸如前期查资料research、分析数据和debugging的能力，这些都是可以写到简历里边。另外有一些**通用的soft skills**，比如communication的能力、oral presentation的能力。尤其是一些PhD的同学，经常写paper和做presentation，都可以为简历增色。\n\n针对第二类问题，就需要自己去**深入思考自己项目的重要性**。很多时候大家觉得我可能就是某个公司的某个小组做一些边角的事情，但是大家要想，为什么这么大的公司不找别人去做这个工作而找你？说明还是有你的价值在其中的。对于这样的项目，一般我会先介绍这个公司的价值，然后是我们组对于公司的贡献，最后就是我做的工作的重要性。层层递进，自然写出了你的价值。\n\n至于第三类问题，就需要大家去发挥积极性，多参与一些技术开发活动了。现在**开源社区**非常活跃，你完全可以参与其中。一开始哪怕就是修改标点符号也好，然后不断的升级积攒更多的经验。如果直接参加开源社区对你的技术要求太高，也可以去参加**线上培训的项目**，一般这些项目会有老师来亲自带着做项目，会更有指导性。\n\n以上我简单探讨了三个让简历脱颖的关键点，以及如何挖掘自己的工作、充实简历。当然小窍门还有很多，就不一一赘述了。最关键是要明白，认真修改简历和良好的项目选择，对你拿到Offer至关重要。\n\n![blog-0130-06](//images.contentful.com/04k2xg9gplcj/uOaalnuPDwCiQOsAIsq0O/e6c7fe0c32e0ce8d59584c14e1879449/blog-0130-06.jpg)\n\n更多求职干货请关注来Offer微信公众号查看\n"}}},{"node":{"title":"从华为裁员, 看程序员30岁前的职业规划","path":"/en/news/2017-03-10-engineers-career-planning-before-30/","node_locale":"en-US","id":"3e1ef720-abaa-5bc8-8b58-547fa04b9bfd","contentful_id":"9E9mFrvzTUCMcCKSM2AAG2","date":"2017-03-10T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Interview","Career"],"description":{"description":"同学们的找工作中的第一个误区就是过分依赖刷题。有的同学总想着在面试前找一些机经面经的题目刷一刷。但是，很多情况是找不到合适的机经面经，或者，即使找到了相关的题目，却没有非常好的答案或者答案不全面，这反而增加了同学们找工作上的困扰。第二个误区则是和基础知识有关。很多同学在面试前想要巩固一下基础知识来提升自己的能力。但是打开资料一看，发现要记忆的公式很多，难以记忆。对于面试的时候会考察什么公式，提问什么内容，对知识的深度角度和广度都不了解。在这样没有复习方向的方向下复习会做很多无用功。"},"thumbnail":{"id":"131ecf2e-8694-5ae5-868b-38ab50024ee9","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/1oTvE1pIzi4GCwY2Qm28so/8dbcc15c21fa9296a93cb7f0f74273db/career-004-1.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"d4337d58-6a6f-5f1a-accf-2301605d2052","body":"虽然我还是一个不到30岁的程序员，但是最早接触算法和数据结构时候才11岁，如果把这算为接触到大学相关的程序设计，到现在也应该奔四了呢。\n\n#### 为什么突然想到中年危机？\n\n一个处在大好年纪的人来谈中年危机，可能有点为赋新词强说愁的既视感。但有个很重要的原因，让人不得不正视这个问题：**我 是 程 序 员**\n\n最近**华为大面积裁掉40岁以上码农**的新闻议论纷纷，人心惶惶。\n\n2017年华为准备的变革措施包括：\n\n1、为保持公司年轻化：**退休政策即将微调，从45岁可以退休，变成45岁须退休**，想继续工作的，需人力资源部重新审批。\n\n2、45岁如果是管理岗，或者对公司有杰出贡献的人才，公司也希望保留，混的不好没有潜力挖掘的老员工，人力资源审批肯定通不过，要**强制退休**。\n\n3、大调整：业软绝大多数部门划到GTS，仅留研发强相关部门在研发体系。业软产品线因为这几年做的不成功，**部分组织人员要划到GTS（即交付工程，属于售后）服务部门去。**\n\n4、CBG逐步独立化，大中华区独立只是一个开始，明年全球开始与片联剥离，逐步**独立经营**。\n\n\n先不评价**华为把40岁以上码农调去做售后这种间接'裁员'**的做法。单就程序员的职业性质来说，中年危机随时可能出现，且不以年龄为标准。你可以理解为，这是一种**职业型的'大龄恐惧症'**。\n\n#### 我的症状\n\n我也曾经搞过计算机竞赛，这些日子又开始做一些比赛，**突然发现一线coding的能力下降了不少**。有的时候遇到的题目需要一个平衡树，跳跃表之类的数据结构，却没有办法在二十分钟，半小时内写出正确的程序。硅谷有很多优秀的人才，但也有一种浮躁的氛围。一天刷刷LinkedIn，看看认识的朋友都在做什么。突然发现有些和自己差不多时间开始工作，或者早工作一年的同学突然成了manager，head。也有更优秀的人去当了CEO，Cofounder，突然开始着急起来。\n\n**但急有什么用？**\n\nPython的设计者Guido van Rossum从前说：'对于我来说，它和创作性联系十分紧密，而这对于我的工作非常重要。**如果（计算机编程）其中没有艺术，它将没有任何乐趣，而我也不会再30年之后仍然从事它。**'\n\n为了实现同一个目的，不同的人可能会写出不一样的代码，有的优雅，有的笨拙，有的可能会故意弄得让人无法理解，目的是要参加出名的**混乱代码大赛(IOCCC)**。看网上有一句说的很好的评语：'同样是工作了10年，有些人积累了10年的工作经验，有些人则积累了1年的工作经验然后重复了10年。'知乎上有人说，你可以把这两类人分别叫为Engineer和Coder，我觉得，你也可以将这两类人区分成**搬砖的码农**和**盖房子的编程艺术家**。\n\n#### Engineer vs Coder 码农与编程艺术家\n\n其实，写程序是一门艺术，也是一种越沉淀越香的工作。程序员也是一种匠人，好的程序员在写程序的时候会抱有一种匠心。**说回程序员的中年危机。**在工作中我遇到过不少码农和艺术家，他们都在自己的工作岗位上发光发热着。我曾有幸和Daniel Tunkelang工作过一段时间，他大概是在98年开始工作的，虽然我并没有问过他的年龄，但是估算一下应该过了中年危机好多年了。\n\n![career-004-1](//images.contentful.com/04k2xg9gplcj/1oTvE1pIzi4GCwY2Qm28so/8dbcc15c21fa9296a93cb7f0f74273db/career-004-1.png)\n\n幸运并且聪明的他找到了除了在办公室写程序外适合自己的一条路，做**高端咨询服务**。和他聊天的时候听说，他年轻的时候其实并不是一个擅长演讲的人，他没有选择避开做自己不擅长的事情，而是**学着努力去在各种情况下表达自己**。从最开始写自己的blog做起，那时候刚毕业的他没有什么知名度，所以blog主要做一些会议记录以及评论一些名人的发言。因为那时候各项会议刚刚开始，很少有人做会议记录并且发布在网上；另外有的业内名人喜欢Google自己的名字，看到这里有评论有时还会来说一两句。**这两点帮助他得到了一定的流量。**后来他发现了一些给talk和meetup的活动，通过在普遍内容比较差的talk和meetup中给一些精彩的演讲，给人们留下深刻的印象。最后他通过SEO来优化自己，占据了一些当时冷门但是现在满热门的关键字，比如**Query Understanding，从此红的一发不可收拾。**\n\n另一个突然想提到的就是我的前mentor，Charles Gordon。比起之前这个网红，Charles相对低调不少。在Amazon股价只有$12的时候加入，现在的股价则是一股$800，真是不用加入startup也能够获得6666%的投资回报。他在Amazon从普通的Engineer一路爬到Principal Engineer，然后到Pinterest带领我们做很多Infrastructure上面的项目。给我留下深刻印象的，不是他为一家创业公司新作了多少feature，带来了多少用户，**而是他对每一个项目代码上的严谨，架构上的可扩展性保持，以及不断学习的生活态度。**在每一次代码审查上，Charles都给我留下很多意见，**因为他解释的很仔细，所以这样的审查带来的不是工作上的障碍，而是学习到新知识的收获。**另外他还组织对分布式系统(Distributed System)的研讨，在公司开讲座一起讨论Google发布的重要论文，以及出一些公司代码和小测验提高我们。这些小的活动不仅让我们学到了如何应用高级知识，也帮助他不管巩固经典理论，举一反三。其实除了这些'老'外，中国同事中也有很多我觉得非常优秀的同事，平时我都称他们老师，他们的故事我都可以另起一个开头，讲好多页纸，但是怕他们读到不好意思。\n\n讲了这么久艺术家，有那么一丝丝跑题的感觉，我其实并没有和他们深入探讨过他们是否有中年危机。但是在我看来，他们都有着深厚的积累来帮助他们抵挡生活中的危机。\n\n再过两周我就迈入工作四年了，也许是时候回顾一下自己积累了什么，或者重头开始把某些知识积累一遍。有三件事今年会去细致做一下：\n\n**第一，回顾一下从前的假积累。**工作以来书签栏也经过几次整理，到目前收藏了488个链接。之所以说他们是假积累，是因为很多内容我都还没有深入理解，转化为自己可以表述出来的知识，所以是时候仔细学习收藏夹里的干货。\n\n**第二，在这一年读两本经典图书，回顾两门重要课程。**这也是工作之后意外的发现，大学学到很多认为可能用不到的知识其实在工作中应用非常重要。比如如何在AWS上搭建一个适合自己应用的分布式系统，Lucene和Redis中最常使用的跳跃表，支持深度学习的最基本的神经网络及其算法。\n\n**第三，乃是生活阅历上的积累。**很多人向上爬的顺利并不是因为技术水平如何，而是在与人交流上更胜一筹。\n\n今年我想先从咖啡和红酒做起，看看自己什么时候可以熟练地'背'出不同产地咖啡的口感和特色，并且在送人红酒作为礼物时能够说出不同的酒厂的位置，那一年的那种酒好，以及口感。从这些小的兴趣爱好开始积累。\n\n**据说，每天都有10个在职码农选择到来offer进修**\n"}}},{"node":{"title":"白板面试和程序优化这么火，到底为什么？","path":"/en/news/2017-04-20-blackboard-interview/","node_locale":"en-US","id":"f7f61549-68f7-5d91-a608-29f27b21a8b5","contentful_id":"9E9mFrvzTUCMcCKSM2AAGq","date":"2017-04-20T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"一周前，我面试了一个来自W Labs的Lead Big Data Engineer，问了他一个问题：在一维数组里找满足条件的最长子数组，很不幸，这个Lead Engineer在45分钟内连暴力解法都没有写出来，于是在结束面试前五分钟，我打住了他。他和我说：现在大家都在处理大数据，在Hadoop，Spark上跑程序，我们在这做算法题，优化程序的目的是什么？我当时着急结束面试，草草回答他说：我只是测试你的编程基础。的确，从我13年开始工作到17年这四年，从内存里读1MB数据时间从15us降到6us；机器学习算法从跑在64核CPU变成了$8000的NVIDIA Tesla P100；Amazon服务器带宽从50MB提升到了1GB。硬件提升如此迅猛，而我们还要在面试的时候进行白板测试，优化算法，提升程序性能做什么？"},"thumbnail":{"id":"1fe75570-216e-53ee-bfe0-d3e983cedd38","resolutions":{"width":800,"height":550,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=800&h=550&q=50&fit=fill","srcSet":""}},"thumbnailAlt":null,"authorProfile":null,"body":{"id":"574b79d4-e925-59a9-a373-c4c0e50d8805","body":"一周前，我面试了一个来自W Labs的Lead Big Data Engineer，问了他一个问题：**在一维数组里找满足条件的最长子数组，**很不幸，这个Lead Engineer在45分钟内连暴力解法都没有写出来，于是在结束面试前五分钟，我打住了他。他和我说：现在大家都在处理大数据，在Hadoop，Spark上跑程序，我们在这做算法题，优化程序的目的是什么？我当时着急结束面试，草草回答他说：**我只是测试你的编程基础。**的确，从我13年开始工作到17年这四年，从内存里读1MB数据时间从15us降到6us；机器学习算法从跑在64核CPU变成了$8000的NVIDIA Tesla P100；Amazon服务器带宽从50MB提升到了1GB。硬件提升如此迅猛，而我们还要在面试的时候进行白板测试，优化算法，提升程序性能做什么？\n\n**程序的价值是什么？**\n\n有一天我和Uber的工程师王聊代码，他开篇就说，'我加入Uber前没见过那么屎的代码。'但就是这个代码撑起了60B的共享经济帝国。由此可见，**程序的优美性只是写代码要考虑的一个小问题，最重要的是代码自身的价值。**很多时候优化程序性能并不重要。如果你是一个Uber工程师，负责结账功能的系统设计，因为每秒需要处理的请求并不多，所以要解决的问题的难度比微信红包，支付宝要简单不止一个数量级，在这种时候，考虑程序的性能可能是多此一举。著名的Pareto's Law，应用到程序里面就是**'20%的代码占用了80%的运行时间'**。这个现象在互联网公司可能会更加极端——**1%的代码占据了99%的运行时间。**说到这，我们可以得出这样一个结论：**大部分的代码都是不需要考虑性能优化或者存储优化的。**但是！对于剩下的那么一小部分代码来说，优化是非常重要的，**好的工程师能看到优化带去的经济价值，而不是仅仅停留在优化代码的层面上。**\n\n**好的优化是可以量化的**\n\n人们认识问题最直接的方式就是列数据，分析经济价值。从正面来看性能优化是很值钱的，Apple网站上15寸的MacBook Pro有两种型号，2.6G CPU要$2399，2.7G CPU要$2799。除去不到$150的硬盘差价，你需要花10%更多的价格来得到字面上不到4%的性能提升，而且这4%的性能还不一定能从日常使用中体现出来。从反证的角度来看，如果程序性能不重要，我们用更快的电脑更短时间运行完程序并没有额外价值。那么一个拥有16核的服务器应该和一个拥有8核的服务器一样贵，但实际上Amazon的c4.4x价格刚好是c4.2x价格的两倍。现在大家都在使用云服务，每个月的收费是根据你的存储空间使用和CPU消耗使用计算的，**你的每一个优化都可以被转化成美金计算出来。**Buffer就发表过一篇工程师文章《How We Saved $132k a Year With an IT Infrastructure Audit》谈优化节约了多少经费。**另一种衡量方法就是去看用户多喜欢你的产品。**长久以来Microsoft的IE浏览器一直是市场霸主，但最近已经被Google的Chrome浏览器后来居上了。在众多人们喜欢用Chrome的原因里，排名第一的就是Chrome的启动速度，网页加载速度远胜于其他浏览器。著名的独角兽公司Pinterest也发过一篇Blog，谈一系列hack的方法是如何将手机网页加载效率提升了60%，与此同时带来了40%手机网页端用户转化率增长。所以说，**天下武功唯快不破。**\n\n**加机器并不是优化性能的良药**\n\n有的不懂技术的人有这样的认识误区，我们可以用加机器，加内存，加CPU这样的方法加速程序，加大吞吐量。但哪怕Amadhl定律不约束并行程序效率，让程序正确的运行在多核，多台机器上也还是一个困难的问题。**投入更多的机器是一种提升性能的方法，但是既不便宜，也不简单。**考虑这么两种实际情况，一种是在单机上运行并行程序，最初我们可以从1 core变成3 core，将程序的性能提升一倍，但是如果你还想再提升一倍，那可能要16 core，因为程序不得不面对多核带来的额外开销，兼容性和调试的困难性。另一种情况是常见的搜索引擎，当我们使用5台计算机来进行搜索时，整个集群的P95耗时由单机的P99耗时决定，当我们采用10台计算机来搜索时，虽然每台计算机处理的文档减半了，但整个集群的P95耗时变成了单机的P99.5耗时，说不定latency就从100ms变成了200ms。这样看来，将单线程的代码性能提高一倍在某些情况下意味着更大的经济价值，**增加更多的硬件并不是提升性能的魔法，好的工程才是。**\n\n**那高级语言的性能怎么样？**\n\n有人说，今天最流行的编程语言就是Python和JavaScript了，但是他们的运行效率都比老牌语言C/C++差，这难道不是一个程序效率不重要的表现么？我想说的是，在你用着高级语言快速开发的时候，无数的程序员都在想着帮你优化他们的运行效率。对于Python，有人研究Cython，有人研究Pypy，从底层优化Python的程序效率；对于JavaScript，越来越多的公司都在通过优化它来优化网页速度，优化用户转化率，很多新的框架都在强调效率提升。在你使用高级语言，写着更简单，更安全的代码时，你可能没有看到，在最近的十五年来，JavaScript在浏览器里的运行速度提升了两个数量级，在Benchmarks Game的网站上，Node.js处理正则表达式之比C++慢3倍而已。我们是不是也可以认为这些年来JavaScript变得越来越流行，一部分也是因为他的运行效率在不断地提升。**如果JavaScript还和以前一样慢，那估计现在没有什么人会继续使用了。**说到这里，我想向所有奋战在internal tools的同事致敬，他们虽然很少实现面向用户的功能，但是他们实现的功能帮助其他工程节约了很多时间。\n\n**贪婪的程序员要求越来越高**\n\n还有一个让人们忽视程序运行效率的因素就是著名的Moore定律，处理器和存储读写会越来越快，谁还在意现在的程序效率呢？我们只需要用对的算法写干净的代码就可以了。在1990年的时候，人们想让程序下国际象棋，那时候这是一个很困难的问题。你可能要在C++的代码里加入一些汇编代码进行优化，才能帮助计算机在短时间内做出决策。但是今天，你可以直接用Python写一个搜索程序来下国际象棋，并且战胜大部分人。电脑一天一天的在变快，人们的需求也在一天天的变大，十几年前我们想让计算机下国际象棋，下中国象棋，并且说下围棋是很难解决的问题，因为围棋的搜索空间太大。但是如今我们已经可以用复杂的神经网络配上庞大的集群，打败每一个围棋大师。同样的道理也可以用在手机上，手机性能每一年都在提高，我们对手机的使用需求也随着性能增加。读初中，高中的时候我只在手机上玩黑白的贪吃蛇游戏，如今我们则玩着3d的战略游戏，发送着语音命令...可以想象，在不远的将来我们可能还会在手表上运行一些机器学习程序，帮助你做出一些决策，如果我们不优化我们代码的耗能，手机还能坚持12小时么？\n\n**优化是让处理器闲下来**\n\n最后一种说法：**我们的处理器大部分时间处于空闲状态，即使程序慢，我们也可以让CPU运行更长时间来弥补。**回击这种想法只要打一个不恰当的比方，你会觉得买一个高级跑车但是长时间只放在车库里很傻么？在计划你的网站需要多么大的集群支持时，都会为他准备很多备用的计算资源，要是不这样设计，运行程序就变成了去拥挤的超市里买菜，大家都在排着队，从停车场到收银台，排一整天。我们也都经历过电脑CPU占用率达到100%的状态，机器变热而且任何程序都不响应，你只能无奈的等着。如果搜索引擎的处理器在100%的状态下运行着，那么新来的请求就会被放在队列里，导致更多处理器切换造成了额外的消耗，最终服务器会彻底奔溃。所以从设计的角度来看，我们需要我们的处理器处于空闲状态，有足够多余的计算能力。**对程序的优化就是让处理器闲下来，更好的代码帮助用户更快的得到结果，并且消耗更少的资源。**\n\n**结语**\n\n开了这么久脑洞，回到最初的面试。我们有很多方法去衡量一个人，他是否对产品有准确的理解，他是否有创造力，他是否理解用户最需要的是什么。但如果单纯衡量程序员，我们可以由简单的两点看起，他的程序是否运行正确，他的程序是否高效。好的程序员能够生产正确并且高效的代码，这个定义看起来很简单，但其实也是最难的。因为一旦你可以牺牲程序的正确性或者程序的效率，那很多问题都会变得更简单，就好像CAP理论里一旦放弃一个要求，就有很好的实现方案。**所以，在下次面试的时候不要放弃优化你的代码。**在这里着重推荐一个我喜欢的blog，Daniel Lemire教授的《Does Software Performance Still Matter》，这是这篇文章整个骨干和灵感来源，我只是在里面加入了更多个人感受。\n\n课外资料：\n\nhttp://lemire.me/blog/2017/03/20/does-software-performance-still-matter/\n\nhttps://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp\n\nhttps://overflow.buffer.com/2016/03/31/how-we-saved-132k-a-year-by-spring-cleaning-our-back-end/\n\nhttps://medium.com/@Pinterest_Engineering/driving-user-growth-with-performance-improvements-cfc50dafadd7\n\n**王 栋**\n\n来offer特约作者。清华大学姚班07级，信息学竞赛国际金牌。目前任职于硅谷电商网站Wish，专注搜索推荐算法及系统设计。曾任独角兽公司Pinterest搜索排名负责人，带领团队设计和实现了高度可扩展的搜索平台，以及机器学习搜索结果排名算法。\n\n![code-wang](//images.contentful.com/04k2xg9gplcj/4xFX5Y1dpeaeIWQQg8UQEa/0a284623ff014e3504fce29f5104a40b/code-wang.png)\n\n图片来自网络，版权属于原作者\n"}}},{"node":{"title":"面试解题时, 有效方法与最优解, 到底应该选哪个？","path":"/en/news/2017-03-10-linkedin-top-campus-recruiter-shares-with-you-the-hiring-secrets/","node_locale":"en-US","id":"94b7e036-f91b-58a9-bfeb-5dea4b771b30","contentful_id":"9E9mFrvzTUCMcCKSM2AAG3","date":"2017-03-10T00:00+00:00","type":"news","subtype":"blog","featured":false,"categories":["Technical","Interview","Career"],"description":{"description":"发现一个有趣的题目的最优解看似有趣，但有的时候会让你在面对复杂问题时把程序弄得更复杂。**比方说，如何搭建一个user autocomplete service？从算法和数据结构的角度考虑，第一反应就是建立一个trie。当面试官让你对user按照follower多少排序的时候，**你可以让trie每个节点多存一些数据。**当面试官说她既想autocomplete user first name，又想autocomplete user last name的时候，你可能想按照first name, last name建造一个trie然后按照last name, first name建造一个trie。那如果用户名又有middle name怎么办？面试官想按照id autocomplete怎么办？面试官想personalize user autocomplete怎么办？"},"thumbnail":null,"thumbnailAlt":null,"authorProfile":{"resolutions":{"width":400,"height":400,"src":"//images.ctfassets.net/04k2xg9gplcj/3dbnlMgj7WQgC4YqUMSIoQ/bf8e90962701acda5f785ee00663cefd/logo-square-white.png?w=400&q=50","srcSet":""}},"body":{"id":"dcdb130b-b929-5125-991f-7edf39570ea5","body":"3**Linkedin全球校招负责人指引你从校园成功走向工业界，四大攻略助你脱颖而出！**\n\n来offer校长孙老师作为开场用流利地英语介绍了本次LaiTalk的重量级嘉宾：**Linkedin全球校招Director——Emily Campana女士。**\n\nEmily Campana于2011年进入LinkedIn人力资源部，历任北美地区Talent Solutions招聘主管，国际人才招聘项目领头人。现任LinkedIn国际校园招聘总经理，具备丰富的招聘经验，对LinkedIn和其他科技界大公司的招聘计划、招聘风格有全面和深刻的认识。\n\n来offer校长孙老师进行开场讲话\n\n值得一提的是，本场LaiTalk为全英文交流。Emily Campana女士就求职这一主题进行了经验分享，并与现场100多名学生互动。以下四个方面，是Emily在演讲中提出并需要求职者注意的：\n\n**简历**\n\n简历是打开职业大门的第一步。好的简历一定要注重：**简洁+重点突出。**篇幅最好为1页，如果亮点比较多可以打印2页。编排简历内容的时候，要注意，**前三分之一是最重要的。**HR每天阅人无数，求职者一定要把最重要的最吸引人的放前面。相应地，关于自身Education的信息可以放在最后，并不用按照所谓的'模板'那样，去死板地去编排内容。当然，细节也很重要，如果用了Bullet Point Round，就要用到底。不要出现语法错误。 完成一份简历撰写之后，可以让你已经工作的朋友帮助检查。**写简历的时候不要去写流水账，要懂得如何将自己的成果展现出来。**简历的内容并不是单纯的what you did, 而是what you got done 。Highlight accomplishment: what you achieved：用数字说话，越详细越好。\n\n除了简历之外，LinkedIn也是非常强大工具。Emily透露，现在10个recruiter中，有9个都在用linkedin。**一定要好好用Linkedin，因为它代表着你的Online Brand，可以帮助你Build your online brand。**关于LinkedIn profile building有以下几点需要注意：\n\n**a.完善Education**\n\nThe Foundation of Your Early Career. （列出学校的人，比没有得人平均拥有10倍views）\n\n**b. 上传头像**\n\n相片是你的门面，用照片展示自己的个性。有传头像的人比没传头像的LinkedIn profile阅读率高21倍。如果没有照片，也可以用自拍，但注意，only yourseilf，no party slefies。\n\n**c.填写志愿者经历**\n\n41% hiring managers会看有没有志愿者活动经历。参加志愿活动时，尽量参加与你未来工作相关的活动，但也可以是别的活动，只要是能够凸显自己其他的方面的技能的皆可。\n\n**d.填写Skills**\n\n在自己LinkedIn页面写keyword of the job，这样能方便Recruiter Search到你。Skills至少要写5个，如果超过5个，你又会有比别人高17倍的概率被看到。\n\n完成了前两步以后，你就离Interview不远了！而当有了interview，就一定做好万全准备！\n\n**Interview**\n\n**A. 了解Job Description.**\n\n**B. 知己知彼：**问问你的Recruiter 你会面临什么样的面试 (有几轮interview？谁要面试我？)\n\n**C. Do Your Research：**一定要上公司网站，查看CEO、Manager的Linkedin，并且去Glassdoor上查看该公司的评价以及一些面试经验。Quora上也会有些非常详尽的资料，都可以用来为自己的面试做一个准备。\n\nInterview一般有这几种类型的问题：\n\n**a. Background question:**\n\n面试人会Go Over Your Resume。回答的时候往应聘的工作职位上靠，讲相关的点。除了你了解我们公司吗，你为啥想来我们公司等必问问题，很多同学还很害怕被问到缺点。Emily说对你的缺点，你要坦白，但一定要说你在想办法提高 （Emily自己举例说她是完美主义者，没效率）\n\n**b. Technical question**\n\n如果你没听懂问题，一定要问。有时他们故意模糊提问，不要怕，问仔细。不知道正确答案也没关系，他们就想看的思考过程。\n\n**c.Behavioral**\n\n公司会通过问你过去的行为，推测你未来的行为。比如遇到压力怎么办、挑战怎么办呀、遇到紧急事件你会不会崩溃等...一般他们会这样开头：'Tell me about a time when you….'Emily Campana透露了回答这类问题的 Secret——**一定要specific！**有一个回答这种问题的超级结构Star:situation；task；action；results.\n\n**d. 最后的问题。**\n\n在面试临近尾声的时候，Recruiter会问你对他们有什么问题。 这时你一定要问，并表现出你对他们公司的兴趣，给大家留下好印象。这对你自己了解未来公司也有好处。可以问的问题有：\n\nvision or culture?\n\nWhat is your favorite thing of this company?\n\nWhere do you see this company in 5 years?\n\nIf one thing in this company you want to change, what is it?\n\nHave I answered all the questions you need? What are the next steps?\n\nHow can I know more\n\n(坚信自己有下一轮，随时准备)\n\n过了面试以后，可不算大功告成，还有一步叫做 Following Up！\n\n**Following Up**\n\n人人都知道这个秘密，但真的不是所有人都这么做。写Thank You Note的时候不要笼统地写，一定要简述你们的见面过程。比如你们今天谈了什么话题很愉快开心，提任何代表你特点的东西，让他们想起你，记住你。再强调一下你对这个职位的兴趣。\n\n最后，JOB SEARCHING IS HARD! 别灰心，找工作真的很花时间和精力！有时会找半年都是正常的。\n\n在领英全球校招负责人Emily Campana女士的宣讲后，我们邀请硅谷资深人力资源专家Ed Campana，来Offer校长孙老师、赵老师，和Emily一起开启了精彩的Panel Discussion讨论会。\n\n![career-014-03](//images.contentful.com/04k2xg9gplcj/jPDGQhKKWs002oqAg2YiK/b2d9928264175a250b93114ef2cfe2ad/career-014-03.png)\n\n孙老师精心整理了在与同学们交流时最常遇到的问题和大部分人共同的误区，与嘉宾展开讨论，为同学们提供指导和宝贵意见。\n\n如何最有效率地准备技术面试？Ed建议大家查看Glassdoor和Quora上的帖子，按照过来人写的interview process提前做好功课，了解公司需求，并做充分的心理准备。\n\n要掌握多少编程语言才算合格呢？Ed说，这个问题并没有标准答案。许多编程语言有很强的互通性，只要基础扎实，就可在一定程度上做到一通百通。而且，不同公司、不同职位对求职者提出的要求也不尽相同，适用才是最好的。针对这一点，孙老师也认为'知道'不等于'了解'，会的虽多，却无精专，对求职就业的帮助就会大打折扣。\n\n如何提高沟通技巧？领英全球校招负责人Emily在宣讲环节展示了优雅的风度和过人的口才；对提高沟通技巧，她风趣地说即使是自己这样的Native English Speaker，在日常交流中仍不免出错。所以想要在面试时谈笑风生，首先就要克服害羞和紧张情绪，多说多练。\n\n如何向Recruiter解释复杂的技术问题？帮助许多同学准备过大公司面试的孙老师分享了他的练习方法：用手机录下自己说过的话，过几分钟再回听，看自己能否听明白，逻辑和语法是否无误。通过这样的练习不断总结，进步的速度可能超乎你的想象。\n\n大公司和小公司在招聘中有何不同？Emily坦言自己已经很久没在小公司工作过了，不过以领英这样的大型科技公司为例，招聘过程会比较复杂繁琐，节奏较慢、步骤很多，而且招聘者往往是在有针对性地为某个具体项目寻找Candidate。相比之下，小型公司、创业公司的招聘流程更短，很多时候CEO会直接参与招聘，比起某一方面的专才，他们更喜欢工作中的多面手和全能型人才。\n\n该从何时开始准备暑期实习申请？<以领英为例，Emily介绍说他们在前一年的8月就会启动次年的暑期实习生的招聘工作，提前的近一年之久！而一般意义上的秋季是大公司们招聘的热门时间（8-11月），到12月至下一年的1月，会有一大批offer尘埃落定。孙老师则举例说，曾有留学生朋友在尚未来到美国时就着手准备二三年后的实习申请了，最后顺利拿到了Google和Facebook两家巨头的实习Offer。 所以对于找工作来说，没有'笨鸟先飞'，而是任何人都必须提前规划并不懈努力。\n\n没有实习经历，能找到好工作吗？Emily给大家吃了一颗定心丸：实习经历对Entry Level的职位来说无疑是加分项，但并不是必须的！大公司都有完善的实习与内部培养计划，对善于学习的职场新人来说，没有实习经历也不该停止向大公司进军的步伐。\n\n提问环节\n\n1\\. 转专业的求职者怎么让简历更Attractive？\n\nEmily：'这并不容易。' 转专业的同学，需要在简历上强调你为转专业做出的努力和改变，你做过什么，以及你所达到的成果，这样可以让你的简历看起来更加贴近这个工作。在这种情况下，写简历的时候，关于Education等可以先放在后面，那些跟职位最相关的——也就是你所获得的成果，可以放在前面。 当然，也可以在简历开头写一段Objective，简述你为啥想转专业，是什么契机激发了你。\n\n2\\. Follow up email没回音代表着什么？\n\nEmily：'Hiring managers can be real jerks!'\n\n![career-014-05](//images.contentful.com/04k2xg9gplcj/4Vo3IXpfheoQ4mEw2u6cGm/cd0d4874f5ed380bd1052c3aa1e4b109/career-014-05.png) \n\n他可能太忙，或不想回复。有时这只是他们个人style，但并不能代表你不好。别让这种事打击你。\n\n3\\. 如果很多人Interview你，你要回复几人？\n\n如果知道名字，一定要每个人单独回复；如果不知道，你就要跟你对接的人说'make sure you let others know and thank them also. Make them remember you!'\n\n**Q&A**\n\n接下来的自由提问时间，在场同学也积极提出了他们关于求职的困惑，嘉宾们现场拆解，认真为同学们答疑解惑。\n\n问题一. 如何挖掘和利用内推资源？如何有效地利用内推？\n\n嘉宾们肯定了内推在找工作中的重要性，而在Linkedin上寻找校友和同学，与之建立良好关系，都是非常必要的。 需要记住的是，不熟悉或者了解有限的人并不能真正为你的求职显著加分，真正了解你、诚意推荐你的人，才是最有帮助的。\n\n问题二. 如何处理同一公司两次申请之间的Freezing Period？\n\n很多公司都有Freezing Period政策，及一次求职失败后申请人必须隔一段时间才可进行新的申请。Ed首先表示，每个公司的Freezing Time不尽相同，求职者必须明确要求并遵守规则。孙老师也强调，因为Freezing Time政策的存在，让每一次失败的时间成本大大增加，因此必须保证自己每次都是有备而来，不可草率应付。 你知道面试时间也是可以根据你的需要进行适当调整的吗？嘉宾建议，如果你知道此次面试涉及一些技术问题，而你还没有准备充分，可以询问Recruiter面试的Deadline是何时，能否推迟面试。 晚一点面，比没准备好就面试，要好得多！\n\n问题三. 在面试中有什么绝对不可以做的事儿吗？\n\n站在招聘者的角度，Emily说招聘周期一般会花相当长的时间，在每一阶段的截止日期前，不要催促Recruiter给予答复，不过如果Recruiter逾期未复，也可以适当提醒。 而关于这个话题，孙老师有太多想要分享。首先，和上一题的中心思想类似，找工作永远不嫌早，一定要提前准备。否则即便拿到一大堆的面试邀约，也会把一手好牌白白浪费掉。 在此前的教学生涯中，孙老师接触过许多来自美国一流大学的毕业生，乍看之下光鲜亮丽，但如果没有掌握公司要求的Skill Set，同样会被这些公司拒之门外。因此找工作切忌盲目，一定要清楚地知道公司在寻找怎样的人才和技能。 同时孙老师指出，中国学生爱走捷径，以为在毕业前刷刷论坛、背背面经就可以斩获offer，这种方法也是不可取的。孙老师举例说，在全美Top 10的宾州大学，每年也只有不到20%的学生在毕业前找到工作。面对如此激烈的竞争环境，不在求学期间扎扎实实做一番努力，必将与一流公司无缘。 孙老师的经验和干货足够再分享一个小时，难怪赵老师打趣说最不该做的是还没听过孙老师讲课就去参加面试！\n\n问题四. 如果我对每个Programming Language的掌握程度不同，该如何写在简历上？会否对我的求职产生影响？\n\nEd强调，简历必须如实反映你的能力和经历，这就意味着你应当将你涉猎的所有编程语言都写出来。当然，没有一个公司会期待你十八般武艺样样精通，你仍需要突出自己最擅长的东西。\n\n问题五. 许多大学都会举办Career Fair，现场招聘公司很多，但申请人往往大排场龙，在这样的情况下，该如何提高自己的胜出概率呢？\n\n面对同学们的犹豫和不自信，Emily首先鼓励大家积极参与类似的校园招聘；对于那些不在校园举办活动的公司，你可以搜索并关注他们的校招站门网站以把握招聘动态。对于在校生来说，有必要了解更多求职网站，熟练使用例如LinkedIn这样的职场社交神器。 孙老师也补充，以扎实、完备的Skill Set为基础，充实自己的简历，才能保证你能在众多竞争对手中间脱颖而出。\n\n![career-014-06](//images.contentful.com/04k2xg9gplcj/114thy7p0MUuwKQY4si0K2/9fcee625263d50882facdaf65c24d05b/career-014-06.png) \n\n活动结束后，同学们久久不愿散去，与来Offer老师和职场专家们热烈讨论。参与者之间也相谈甚欢，大家交流找工作的经验，更拓展了自己的交际圈，让来Talk首次活动得以圆满收官。\n"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true,"slug":"/en/blogs/","langKey":"en"}}}