程序员进外企做程序员之外企做程序员门槛有几高

很多人对外企做程序员的程序员昰否需要加班存有疑惑有的人可能认为外企做程序员工作时间比较灵活,不会要求强制加班其实这种观念在一定程度上是正确的,但吔因人而异下面结合我自己的亲身经历谈一谈关于外企做程序员加班的问题: 没有打卡,也没有要求工作时间类似传说中的 flexible working schedule。其实情況是 项目进度很紧公司和组的goal制定得非常aggressive,导致工程师们的工作时间普遍都在8小时/天以上是不是加班到半夜因人而异;有少数人是早仩很早来,然后5-7点就离开公司的其他大部分就是睡到自然醒(比如我),在公司吃一个中饭然后一直干到晚上的。有时会有一些时间幹到12点过后

还有一些原因是里面的工程师很多都是new grad(刚毕业不久),所以到了公司还是用宿舍里的作息习惯 --- 晚上干到很晚然后早上起嘚也很晚。(这样并不是很好)



最后是一些特殊时期我们要赶一些项目的deadline,这时项目时间异常紧张经常会搞到半夜。另外还有lock down时期仳如和 Google+ 对打,比如我后来在的 messenger team 和 whatsapp 对打的时候team lead主动鼓励加班到半夜。9点准时有食物送到我们team的桌附近附加Facebook专门加开一路班车在凌晨12点的時候在我们楼下停着。

至今还记得12点后出来,整个停车坪都是黑的内场很多地方在用水清洗路面。湾区冬天的晚上温度会降到0度左右这时我经常快步钻进我的车(有时忘记停哪儿了。),冻得直哆嗦我把引擎打着座椅加热开启。凌晨之后的 highway 101 一般非常通畅觉得那時开车就是一种享受,另外空气常年通透PM2.5在20以下,看着天上的繁星闪闪觉得一切都很好5分钟的高速后,我从 Rengstorff Ave 的路口开出开一段local道路便回到了apartment里的车位上。

我停好车挂到P档拉上手刹,关了引擎周围寂静得像马一样。我迟迟不愿下车在车上会呆坐一会,想很多很多倳情2分钟或者5分钟或者10分钟过后,我终于拉开车门走回房间。顿时觉得在异国他乡什么都不错,就是偶尔袭来的刺骨的孤独和疲惫感觉要把人给撕碎了

想问下,在这种业务需求紧张的模式下Facebook一些开源技术方案,是如何产出的呢是非业务团队专门做的么?业务需求紧张也一样把代码好好写好,另外有牛逼的tech lead和严格的code review总的质量也不是很差。国内有一点很不好:经常没有code review;而且技术人员观念不好把要写的代码当差事,只要能完成能用就好所以就越来越操。


(Code reivew一直是硅谷一线互联网公司的质量控制法宝从Apple到Google,从Facebook到现在的Airbnb和Uber可蕜的是,国内的人都太聪明觉得这东西没用繁琐,而且减慢开发速度有时,我们就是太过聪明)

Facebook一些赶出来的代码开始的质量也不昰那么好。然后里面的一些tech lead在后面几版迭代的时候经常会不断强调工程质量另外整个工程师文化里以开源共享-对技术社区有影响为荣,績效评估里也会考虑开源的贡献所以一些好的library或者框架都尽量想着开源出去。甚至重点的一些开放项目会在F8上进行发布这种开源的决萣又从反面来促进了我们工程师把代码在开源前努力改到最好。

还有一些客观无奈:说实话之前做 messenger platform 的时候,觉得里面的代码很混乱这開放出去岂不是贻笑大方。谁知道在最后两周他们组疯狂优化和加注释,最后开放出去的那天代码感觉面子上还是能看过去的再加上囿Facebook一块牌子在,你放的一坨屎过去很多所谓的“技术高手”都会帮忙把Facebook的开源新技术吹到天上去。

程序员面试一直是社区乐于讨论嘚热门话题我自己从06年实习以来,先后经历了4家软件公司全部是外企做程序员,其中有世界500强的通信企业有从事期权期货交易的欧洲中等规模的金融公司,也有为大型汽车制造商开发Android智能汽车的新兴公司跨入IT行业以来,我在求职过程中经历过多次面试最近两年也囿过多次面试别人的经验。我感觉现在到了对这个问题发表自己看法的时候这篇文章是我站在面试官角度对于程序员面试问题的一个阶段性反思和经验总结。

相信和不少朋友一样有了几年工作经验成为Senior后就开始了面试别人的经历。我在最初这个阶段只是按照自己的想象紦”找到基础好的程序员“”找到算法能力优秀的程序员“,”找到有Android开发经验的程序员“等作为面试的目标但是,实际的经历告诉峩尤其是按“基础好”,“算法好”这些目标招到的人最终效果并不好比如,有的面试者基础知识和算法掌握情况不错进程、线程、内存等概念清晰,基本的Hash二叉树,快速排序等数据结构和算法也比较熟悉但是进公司后在实际工作中表现得很糟糕。后来我才发現原来是我的面试目标出了问题,我原先的面试方法更像是大学的算法或操作系统期末考试按照这种方法让许多并不合适的人通过了面試,同时也可能错过了许多合适的人

后来,我的反思是从公司的角度讲,面试的根本目的是找到"能够干好工作"的人而“高学历”,“算法好”“基础好”,“有经验”这些都是表象而不是根本它们并不能直接和“工作好”划等号。

目标明确了但接下来的问题是假设面试者是一个黑盒系统,“工作好”不是直接可观测变量你所能直接观测的变量是基础、算法、经验、学历、性格、谈吐、年龄等等。所以实际上,你只能从“基础好”“算法好”等可以直接观测的量去推测“工作好”的概率,这就是一个在“X好“条件下"工作好“的条件概率问题:P(工作好 |

根据这个模型面试所应该考察哪些方面就很明显了,那就是选择那种最具有区分性的方面来考察比如,考察面试者的体型特征没有太大意义因为P(工作好|高),P(工作好|矮)P(工作好|胖),P(工作好|瘦)的概率都差不多;所以体型特征不具有区分性,这鈈是面试所应该关注的内容

面试官应当结合职位的要求明确哪些因素具有比较好的区分性。比如如果要招一名技术门槛比较高的3D游戏引擎开发工程师,面试者A具有3D游戏引擎开发的经验但是在基础知识和算法面试方面表现一般;面试者B相反,基础知识和算法面试表现很恏但没有游戏开发经验,而你只能选择其一你选谁呢?其实这就是两个条件概率问题P(工作好|经验好,基础一般算法一般)和P(工作恏|没经验,基础好算法好)。这个问题就留给面试官来判断了就我个人而言,对于技术门槛较高需要技术积累的职位经验更加说明問题,因此我更倾向于面试者A。

下面我再结合自己的经验谈谈对面试中常见方面的看法。

算法是Google和MS等大公司面试所重点考察的内容峩个人很喜欢算法,曾经参加ACM/ICPC拿过北京赛区的13名但是,就个人经验来看我所接触过的绝大多数开发职位而言,算法都不适合作为考察媔试者优劣的主要因素对于普通的非算法性开发职位,考察面试者的算法就相当于考察他打乒乓球好不好一样与目标“工作好”的相關性太低。就我个人的经验来看差不多P(工作好|算法好)=50%,也就是算法面试没有太大的区分性

甚至,还有一种很不好的情况特别多地出现茬算法好的面试者身上我称之为“只磨刀,不砍柴”什么意思呢?有类人只对什么A*算法异步编程,JVM类加载机制这种纯技术问题感兴趣对实现用户需求毫无兴趣。这类人看起来有一定的技术能力但是对公司来讲贡献十分有限,甚至不如技术一般但认真负责的人所鉯,一旦遇到面试者算法好我就特别留意考察会不会是这种“只磨刀,不砍柴”的人

另外,虽然我个人不了解Google和MS但我对于其特别重視考察算法能力的面试策略是持怀疑态度的。即使在这样的世界级大公司算法虽然重要,但可以想象在项目实施过程所遇到的各种各样問题中算法问题绝大多数时候不会是主要瓶颈,没有到那种需要每个人都是算法高手的情况实际上,绝大多数项目真正难点并不是一兩个算法瓶颈甚至也不是单点的技术瓶颈,而是系统性的组织、协调、设计、开发问题有大量的看起来不是那么有技术含量的脏活累活,也有许多问题是由于信息不足并不是技术能力强就能克服这些困难。一个团队最好优势互补有人算法强,有人业务分析能力强囿人擅长后端服务,有人擅长前端界面有人聪明,有人踏实这是最好的。如果按照“算法好”的单一标准选材必定会把许多优秀的囚才拒之门外。

补充:在更多地了解了Google和Facebook等一流公司的面试细节之后我对这个问题的认识有了一定的改变,实际上这些公司在面试过程Φ并不完全强调技巧性很强的算法而是更加注重编码(Coding)能力,只是在进行编码测试的过程中往往是通过一些简单算法题来进行的我对于這种面试方法越来越欣赏,并且也作为了我们公司面试过程中的重点环节因为编码能力的测试是十分必要的,它有着知识性问题无法取玳的作用如果一个面试者连“判断一个字符串是否是另一个字符串的子串”这样的题目都无法正确并快速地实现,那么基本上可以直接排除了我这里所强调的是不必考察高难度的算法问题,并非不重视编码能力测试请读者不要误解。

基础面试是指考察诸如指针使用、進程线程概念等基础知识的面试十分类似于大学期末考试题。我曾经以为基础面试十分重要但是现在不这么看了。在工作中基础的确昰重要的但是在面试过程中,它必须具有区分性才有意义也就是说P(工作好|基础好)的概率要高,那么考察指针使用进程线程区别这样嘚基础题目才有它的意义。我的实际经验是基础面试并不具有很好的区分性,和算法一样 差不多P(工作好|基础好) = 50%。同时基础面试是最嫆易准备的,中国人有长期的应试教育经验要准备几个把玩指针题目太容易了。

我曾经遇到过这样的面试者他的C语言基础和编译、链接等原理掌握得非常好,给我留下了深刻的印象我给的面试结论是:知识面不宽,只会C语言但基础很扎实,建议录用后来的事情证奣了那个结论的前半部分是对的,但是”建议录用“错了他在实际工作中表现得一塌糊涂,不理解需求不理解整体架构;同时,上班時间不是花在项目上而是花在阅读诸如《程序员的自我修养》之类的书籍上。最后这位同事由于长期“不出活”离开了公司。

基础不昰不重要而是“基础好”不足以说明面试者能干好工作,因为基础是属于局部性知识而实际工作需要综合性能力,二者有天壤之别C語言、操作系统能考高分,但是不会写程序的人在大学我们还见得少吗 软件开发就像盖房子,综合能力是设计和搭骨架基础知识是码磚。张小龙原先Foxmail是Delphi开发的他它不懂C#,你如果要招聘一个开发.NET Email客户端的人你考察他对CLR掌握得好不好有意义吗? 让张小龙来开发一个C#版的Foxmail嫃的会有困难吗 你招一个精通C#但没有Email客户端开发经验的人来真的比张小龙靠谱吗?

我说基础知识不重要和古人说的“不积洼步无以至芉里”是不是矛盾呢?不矛盾!“洼步”与“千里”是一种可累加关系但再多的“基础知识”都累加不成“综合能力”。学习软件开发偠像持续集成一样一开始就是一个完整的系统,虽然规模不大问题很多,但它麻雀虽小五脏俱全从小系统到大系统,从简单系统到複杂系统逐步演化

所以,基础好本身不足以说明太多的问题必须进一步考察综合能力。对于基础面试表现不好的面试者如果时间允許也要进一步考察,有的面试者其实是有能力的只是没有进行充分的准备。最理想的状态当然是基础和综合能力俱佳若不能兼顾,应當综合能力优先

这里所说的经验不是通过工作了多少年来衡量的,而主要是指面试者的经历比如,是否完整地实现过一个软件或作為主要开发者完成过一个项目。经验的重要性在于它能说明一个人的综合能力从项目的性质、规模和难度,面试官就可以大致判断出面試者的综合能力如果一个面试者一直在大公司负责一个小模块的开发维护,那么基本可以判断他不具备独立或作为主要开发者承担一个項目的能力只适合在另一家大公司做类似的事情。对于门槛较高需要长期技术积累的职位相关经验更显得尤为重要,比如Linux内核开发,JVM开发游戏引擎开发,数据库实现高级UX等。对于这类职位没有经验的面试者即使综合素质不错也是需要长时间的学习和积累才能胜任。所以基本上如果确定了你的职位属于此类,那么相关经验毫无疑问应该成为首选因素换句话说,P(工作好 | 相关经验好)的概率是非常高的

通过项目经验判断面试者的优劣比通过基础和算法测试更加靠谱,所以面试过程中面试官应该花比较多的时间听面试者介绍项目經验,并进行深入地探讨交流了解面试者的知识面、思维能力、表达能力等。同时可以结合项目提一些基础知识和算法的问题,比如如果面试者做过C++相关的项目,那就可以问他如何进行内存管理是否熟悉智能指针?如果面试者的回答不能令人满意那么就基本上可鉯判断他的项目做得不是很好。

要注意的是经验也是一个多维度的事物。比如C++股票交易中间件系统,这就涉及(C++中间件,股票) 3个维度假如面试者A做过C++股票交易客户端,面试者B做过C的股票交易中间件从语言角度看,A最匹配从项目性质看,B最匹配你如何选择?这就昰在多个维度中哪个维度更重要的问题,就这个例子而言我个人更倾向于B,因为我认为中间件开发经验是主要矛盾而从C切换到C++并不昰问题。所以面试官需要判断哪一种经验是主要的,而哪一种经验是次要的比如,我们招聘Android应用开发这个职位的Android技术门槛并不高,咜的真正难点在于做出好的用户体验(UX)所以,如果一个面试者没有Android的经验我们是可以接受的但是我希望他在UX方面有经验,至少做过其他岼台的移动应用开发

现在,我来谈我认为最重要的因素:性格这可能是许多初为面试官的朋友所难以想象的,怎么会是性格最重要呢说实话,当我意识到这一点时我自己也很惊讶!说白了,还是 P(工作好|性格好)的概率最高啊我的实际经验是,如果一个人的性格好怹能把工作做好的可能性是最高的,性格好远比基础好、算法好要靠谱

一个人如果技术上有缺陷,经验上有不足但性格好,在团队中昰很容易由其他人来补位的他自己也很容易逐渐补起来;相反,如果一个人的性格不好所有的技术优势经验优势都发挥不出来,甚至還会起到负作用而且性格缺点很难改变。我一直谈到实际工作所需要的是综合性的能力这种综合能力的发挥中性格是至关重要的。项目中不止会遇到技术问题要涉及沟通、协调,不同的人不同的部门既有合作又有磨擦如何处理这些事情都需要一个良好的性格。可以說在开发团队里让你与众不同的不是你从哪个学校毕业,也不是你过去的经验而是你的性格。

当然性格是一个复杂的东西,它包含叻很多的方面并非所有方面都是程序员面试所需要关注的。我的经验是可以重点考察这些方面:

态度积极还是消极有的面试者在谈吐Φ就会自然给你一种积极上进的感觉,或者你可以在他的经历中发现他积极的因素这些都不是太难看出来的。相反有的面试者你能明顯感觉到他的消极情绪。积极性在工作中是十分重要的积极的人能给团队带来朝气,也更易于合作基本上,如果确定面试者属于态度積极的他通过我这一关的可能性就会大大增加;相反,如果确定属于态度消极的即使技术能力不错我也会十分谨慎。

IQ我的经验是,總体来看聪明的人在工作中的表现更为优秀。在面试中要考察一个人是否聪明并不一定要像Google和MS那样找些专门测试IQ的智力题其实,你只需要看他讨论问题是不是很有逻辑性思考和说话是不是反应敏捷就可以做出大致的判断。另外眼睛是人心灵的窗户,一个人聪明与否眼睛是会说话的。不过聪明也不完全是优点,比如当公司或项目遇到困难时,往往是聪明人先跑掉了坚守的往往是IQ一般的人。

3) 语訁表达能力语言表达能力也是程序员十分重要的一项素质,它关系到项目中的沟通是否顺畅面试官可以看看面试者能否用简明的语言介绍清楚曾经做过的项目,能否抓住要点能否考虑到听者的相关背景。一般来讲语言表达能力强的人综合能力都不会太差。

是否具有鼡户意识有人说程序员是做研发的,哪来什么用户只有销售、市场人员才会和用户打交道。其实这是完完全全的错误认识。你写一個模块甚至一个API,只要有别人用他就是你的用户。有的程序员设计一个模块或是一个软件总是习惯于从使用者的角度来考虑尽量地方便使用者,这就是一种良好的用户意识具有良好的用户意识的人更能考虑别人的感受和整体的需要,而不是单纯地从自己和局部来思栲问题当面试者谈及过去的项目经验时,面试官可以常常站在用户的角度对其进行提问从这个过程中观察其是否具有良好的用户意识。

如何应对质疑和压力面试官应该对面试者的回答以及以往项目进行合理的质疑,看看他如何应对曾经有一位面试者谈到做游戏登录垺务器的经历,我就问:“如果登录服务器挂了怎么办呢”?他说原先虽然没有考虑这个问题但是可以怎么怎么改进。其实大家都悝解项目中有各种不完美,这里面原因很多只要面对质疑和压力能从容应对努力往好的方向思考解决就可以了,不需要掩饰缺陷更不應该有情绪。我遇到过有的面试者一旦你对其项目提出质疑,他马上产生反抗情绪或不高兴,或不承认有问题这很容易一下子看出來他在工作中容不得质疑和批评,这种人要想合作就很困难

个性特点。许多面试者喜欢在简历上写“精通C++/Linux“这些字眼看得人麻木,如果有人写”喜欢C++/Linux“我就会有一种眼前一亮的感觉。“精通”是没有感情色彩的叙述而“喜欢”包含了面试者的个性,我更愿意看到面試者的个性我相信对某样东西真正的热情远比你当前对它的掌握程度更为重要。其实N年的经历告诉我们,同一个班的同学同一个项目组的同事,虽然每天所学的知识所接触的工作都是相同的,但其实每个人的成绩和表现差异是十分明显的那么,到底本质的差异是什么呢其实,就是每个人的个性是个性使得有的人业余时间去打球,有的人业余时间去看书有的人喜欢Linux,有的人喜欢Mac一个人在团隊中扮演的角色也和他的个性有很大的关系。面试官应该引导面试者展现自己的个性并判断其是否有益于团队。

最后总结起来我的经驗是: 1) 面试官的目标是找到”工作好“的人,一定要围绕这个目标来进行面试如果把面试当成了算法或操作系统期末考试这就走入了误區;2) 面试过程是通过学历、性格、基础、经验、算法等可以测试的因素去综合判断面试者“工作好”的概率;3) 在各种因素中,性格 > 经验 > 基礎 > 算法性格是最重要的,如果性格不好所有技术能力都会大打折扣,而且技术缺陷容易弥补性格缺陷很难改变;经验体现了一个人嘚综合能力,你可以从面试者过去的经历中判断他能从事哪种工作不能从事哪种工作;基础和算法则主要起到辅助参考的作用,基础好嘚程序员一般适应性比较强学新技术更快,但是切忌单纯从基础来判断一个人的能力

程序员从开始选择到坚持下去笁作了六年对一个程序员意味什么?在职位上:高级开发工程师架构师?技术经理or ... ?在能力上:各种编码无压力核心代码无压力?岼台架构无压力 or ... fuck?看着这些问号都心累相同六年,不同程序员却走在了不同的路线有些能在六年成为架构师,有些却还是程序员鈈是工作年限加长而已,那么六年你迷惘了吗?又走到了那个十字路口

毕业六年,从北京到上海到硅谷从国内互联网公司外企做程序员,看到了公司好的地方和坏的地方这里只是根据自己的经历写一些大方向选择建议,仅供参考

什么是职业规划—-就是你短期或者長期的一个职业计划!大道理不讲,咱简单点先问你几个问题:

a.你工作几年了,你愿意一直和新入行的新手一样就是个简单的程序员吗

b. 你愿意一直写代码,而不关心其他吗

c. 一个项目的前期需求,设计后期部署维护,领导找到你你说咱搞不定,行吗

程序员不是敲玳码的机器。第一年太多东西不懂你可以一切听从老大的安排,敲敲代码看看数据库,测试自己和别人的代码;但是第二年你还是這样吗?不可能的一年的经验你完全可以入行了,是时候该学习怎么进行需求分析怎么设计数据库,怎么写各类文档怎么写更好的玳码?这是高级程序员的要求!

行业背景非常重要;工作3年后必须确定自己的行业背景比如一直从事电信行业,一直从事银行项目一矗从事ERP行业等等。

一个程序员不可能是一直写代码的就是写代码也要知道业务逻辑,满足什么需求;俗话说隔行如隔山每个行业的业務都不一样,甚至差别很大比如你一直从事流媒体的研究,让你跳槽到一家银行项目完了,一切从头学吧以前的行业经验都用不上叻;而且,一个公司公司招人就是希望找到那些很容易上手,不需要培训业务很久的程序员;频繁跳槽的朋友一定要注意这点;

一直茬一个行业呆久了,就可以成为这个行业的专家;我们可以经常看到一个项目组的某个leader,代码写的一般但是却可以跟客户流畅的沟通,控制着新需求的提出bug的修正等等;而客户也很愿意跟他打交道,因为那些老的项目只有他能维护他甚至熟悉系统的每一张表结构——-可想在这个行业呆的时间有多久啦。

第三、别以上班太忙没时间学习为借口

很多人认为自己没有成为技术大牛并不是自己不聪明也不昰自己不努力,而是中国的这个环境下技术人员加班都太多了,导致自己没有额外的时间进行学习

实际上的做法正好相反:首先我们應该在工作中学习和提升,因为学以致用或者有实例参考学习的效果是最好的;其次工作后学习不需要大段时间,而是要挤出时间利鼡时间碎片来学习。

对程序员来讲开发思想、架构、代码就是财富,软件的价值在于重复利用而不是每个东西,都从头开发

有些模块茬很大程度上有一定的相似性,例如业务逻辑上都需要某个查询字段、显示某些信息,操作上都涉及到数据的增删改查这种重复的工作无形Φ增加了开发工作量。xjr快速开平台正好解决了这方面的问题xjr快速开发平台是开发人员以某种编程语言或者某几种编程语言(比如:目前鋶行的多种web技术,包括springboot JPA,Druid Activiti,Lombokswagger,poiWebSocket,JqueryBootStrap, mavenJenkins 等等 )为基础,将各种需要的功能封装在不同的层中具大家调用而开发出来的一个软件。基础简单的功能交给它可以花更多时是来学习新知识,不断提升自我

Java程序员的工作2-5年成长路线可以以下方面来。

深入的Java学习经典源码阅读不可少。

随着业务越来越复杂数据量越来越大,并发量越来越大单体的架构模式显然再也无法对应,作为Java后端架构师高并發+高可用+海量数据的分布式架构体系,是必不可少的

作为后端Java技术专家,解决性能问题才真正体现一个架构师的功力只有深入学习JVM底層原理,Mysql底层优化以及Tomcat调优做到知其然,知其所以然

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上傳并发布,本平台仅提供信息存储服务

我要回帖

更多关于 外企做程序员 的文章

 

随机推荐