一、写给年轻程序员的10点启示
最近,陆续在51CTO和CSDN上看到好几篇写程序员如何成长,如何拿到高薪的文章。文章都很不错,一些观点也很实用,但整篇文章读下来,我总觉得意犹未尽,感觉还应该再给年轻的程序员们说些什么似的。
其实我离开正式的程序员岗位(当时我是一名架构师)已经快3年了,现在我仍然在业余时间做一些感兴趣的开源或个人项目。但我发现恰恰是最近几年,让我能够从不同的角度和视野,对程序员这个职业有了更深入的理解和认识。当我成为一名IT管理者时,我从更多的程序员身上看到了他们身上的一些特质对其职业生涯所产生的影响;当我开始自学设计,我又从设计大师们那里得到很多极具启发性的观点,而它们对程序员们同样具有很大的价值;而当我开始写作,每一篇文章完成后与年轻的程序员读者们进行交流的过程中,我的想法和观点又能得到进一步的完善和提升。
因此,我迫不及待地将这些记录下来,希望从一些不同的角度给予年轻程序员朋友们一些启发。
1.正确地认识自己
我听到过很多用来形容程序员的网络词汇,例如,码农、程序猿、软件工程师、张江男、屌丝程序员,等等。其中大部分都略带贬义,有些甚至是程序员们自己发明出来用于自嘲的。其实这些称呼对你来说并不重要,关键是你自己内心中用了哪一个词汇来形容自己。当你仅仅将自己定位成一个码农,那你可能就是那个整天用着相同的工具,写着相似代码的码农;当你把自己看作是一个屌丝程序员的话,那你也可能就是那个衣食不愁,但整天浑浑噩噩、无所追求的屌丝。
我更愿意用技匠这个词来形容程序员,就像我给自己起的花名一样。程序员应该是那些不断追求更高技术,并有着自己产品梦的工匠。当你通过对自己技术不断打磨,一次又一次做出那些优秀产品的时候,你会发现自己不再是他人口中的码农或是屌丝,而更多被称为了大师、大神,而受到大家的尊重。
我相信没有一个真正的程序员内心里会将自己当作码农或屌丝,那么不妨也像我一样找到一个能真正反映你内心的词汇来定位你自己,通过努力,你会慢慢变成你希望的样子。
2.比一般人更加努力
我曾看到一个关于天才与普通人的有趣漫画(很遗憾我没能找到原图,只能用文字进行描述)。
漫画描述1:一个普通人每天都很努力,他头顶上显示的能力槽也在慢慢地增长。而图中的另一个天才,则整天不务正业,当然他头上的能力槽也几乎没有增长。
漫画描述2:经过了长时间的努力,普通人头顶上的能力槽慢慢接近了满格,此时那个天才醒悟并开始了努力。
漫画描述3:又过了一段时间,普通人头顶上的能力槽终于满格了,但此时天才头顶上的能力槽却早已爆表,高出了那个普通人很大一截,那个努力的普通人只好无奈地抬头仰望着那位天才。
漫画描述4:但当普通人默默回过头来,却惊讶地发现有更多的人正同样充满敬意地仰望着他,因为此时的他也早已成为了大多数人眼中的那个佼佼者。
这组漫画非常发人深省,优秀的程序员往往会被同天才或高智商的人联系在一起,但我想告诉你,你周围所看到的那些天才(身边的优秀程序员)只是在你没看到的时候花了更多时间工作或者学习而已,当你也坚持这么做时,你也会变得和他们一样优秀。
3.适时建立个人权威
我以前有一个美国同事,是个东欧人,在公司里负责一个非常老旧系统的开发和维护工作,用的技术也是几乎快被淘汰的Power Builder,因此他在公司里是个不怎么被重视的人。然而有一天,他突然拿着笔记本电脑敲开了老板办公室的门,并且给老板展示了一个非常漂亮而且易用的Web系统。原来他利用业余时间自学.NET技术,将他所负责的那个系统整个重写了一遍。这个焕然一新的系统一下子让老板和整个公司惊呆了,大家由衷地对他报以敬佩之情。不久,他便被提拔为了开发团队的负责人,而他的那套系统也很快作为公司的拳头产品推出了。
我经常听到一些程序员抱怨自己的职业生涯毫无起色,或者在工作了几年之后就担忧自己遇到了瓶颈。其实,造成这些的原因往往是他们已经习惯了听命于人,而缺少自己的观点和主张,久而久之便成了那个在他人眼中可有可无的平庸之人。你不妨也...
4.遵循最佳实践
技术总是在不断发展,我们每年都能看到很多新的开发语言、工具和框架的出现,而每隔几年又会产生一些大的技术变革。那么作为程序员,如何才能适应这种变化呢?其实,就像每年都会有新的流行设计趋势,然而设计的本质和原则却始终不变一样。作为一名程序员,你也需要尝试去理解那些软件领域最本质的东西,而我的建议就是学习那些最佳实践。
当你理解了GOF的那些经典设计模式,你就会知道如何使用一个单例来最有效地实现一个Logger组件;当你理解了SOA或是最新的微服务架构,你就能够通过架构使你的企业IT治理更加有效;当你理解了DEVOPS这种新的运维文化和理念,你就能使企业IT运维效率得到显著提升。此外,你还需要理解在网络安全、性能调优、代码优化等各个方面的最佳实践,以使你写出更高质量的代码、做出更优秀的产品。
这些最佳实践或由此衍生出来的框架、工具都是那些富有经验的程序员通过大量实践,总结出来的最优秀的软件开发思想。通过理解和对它们的有效实践,能够让你站到前人的肩膀之上,对软件开发本身获得更深入的理解和认识。
5.保持好奇心并乐于探索新的事物
好奇心可能是那些优秀程序员与普通程序员之间最显著的区别之一。优秀程序员们往往不会满足于对手头工作的认识和理解,他们有很强的意愿去了解那些更深入的东西。比如,他们会通过研究公司的框架(甚至是更底层的框架)源代码,去了解它们具体的实现原理和设计思想。这对提升程序员的技术深度是非常有帮助的。
另外,优秀的程序员们也往往非常乐于探索那些看似与工作无关的技术。比如,做后端的程序员去学习前端的技能,前端工程师则去学习UI设计,等等,这些虽不会让他们成为那一个领域的专家,但技术往往是相通的,当你在探索这些新鲜事物的同时,你会发现你原有的技能也得到了提升。(最近,我在自学一些简单的机器语言,从中就受到了一些很有价值的启发,我也希望能通过几篇文章来分享给大家)
6.抛开代码与人沟通
“紧盯着电脑屏幕,不断敲击键盘,目光有些呆滞。”这可能是程序员给人的印象。而我所看到的那些优秀的程序员却都不是这样的,他们往往兴趣广泛,并且都非常乐于与人沟通交流。
程序员们很容易会忽视与人的沟通,这其实对他们的职业生涯发展是不利的。我很支持那些年轻的程序员们坚持去走技术路线,但这不应该成为你排斥与人沟通的理由。你需要与人沟通来获得他人的帮助;你需要与人沟通来建立良好的工作关系;当你的能力不断提升,被赋予更多职责时,你更需要与人沟通来管理好自己的团队,以及与老板或客户进行有效的沟通等。
尝试离开你的电脑桌去与人沟通,相信我,这会给你的工作和生活带来积极的变化。
7.要为优秀的人工作
我曾面试过一位优秀的UI设计师(“技匠”公众号中《给年轻程序员的职涯建议》一文中提到的),当问到他的离职原因时,他告诉我,当他每天听到他的老板和同事们聊天内容的大多是股票、育儿、游戏时,他就下定决心要离职了。
环境对一个人的影响是巨大的,而最可怕的是当你身处其中时,很难意识到你正在变得越来越糟。我之前带过一些不错的程序员,他们中的一些人去了一些整体氛围或环境不是太好的公司。过了一段时间后,再次与他们碰面聊天时,我发现他们的思维、观点相较之前并没有提升,有些甚至反而退步了。
其实,我并不鼓励程序员盲目跳槽,但当你发现所在的环境和周围的人已经无法让你获得提升时,不妨学一下我提到的那位设计师,选择一个更好的环境,尽可能与那些优秀的人一起工作。
8.生活、睡眠、旅行
我们时常听到关于程序员因疲劳过度而猝死的新闻,我非常为他们感到惋惜。但这里所反映的一个问题却值得深思,那便是程序员不懂得生活。我希望每个程序员都能明白工作、技术、写代码这些并不是你存在的意义,而生活才是,你需要懂得生活,并且学会生活。
- 生活:尝试有节制和有规律的生活,程序员生涯绝不是一次冲刺跑,而更像是一场马拉松。你需要合理规划自己的时间分配(学习、阅读、写代码)并持之以恒地去做。另外,不要忽视你的家庭,扮演好你在家庭中的角色,无论你是与父母还是与妻儿住在一起,不要将自己隔离起来,尝试融入其中,做一个快乐有爱的程序员。
- 睡眠:有很多人觉得睡眠是弱者的表现,他们往往会长时间熬夜,其实我觉得这是一种恶性循环,反而会使你的工作效率变得更低。充足的睡眠往往能使你更有效率地投入到新一天的工作中,你也会变得更有创造力。请记住,保证充足的睡眠将使你变得更加强大。
- 旅行:去任何一个新的地方都可以称之为旅行,旅行不是为了放松,因为你需要坐飞机、开车、走路,这些都会使你产生压力,但你仍需要去旅行,因为这能让你发现和感受新的东西,而这些是从电脑屏幕上无法获得。
9.相信自己的天赋和创造力
做到以上这些,你已经是一名优秀的程序员了,但你离杰出还差了一点。你需要依靠你的天赋和创造力,让你更进一步。天赋和创造力绝不是那些天才的专利,每个人的身上都有属于他自己的天赋和创造力,但它们也绝不是与生俱来的,你需要在生活中不断地培养和发掘它们。下面是我觉得一些行之有效的方法。
- 阅读优秀的书籍:好的想法绝不是凭空产生的,尝试从书中寻找那些能激发你创意和灵感的优秀内容。
- 记录和收集:尝试用一个小本子,将你转瞬即逝的好想法记录下来,它们可能并不直接有效,但下一个更好的想法可能就是从这些你记录下来的想法中产生的。
- 尝试动手:光有好的想法是不够的,你需要成为一个有工匠精神的人,通过亲自动手去尝试和实践,你会不断从中得到新的创造力。
如果上面提到的其他建议都对你无效的话,那么就请坚持第2点建议吧“比一般人更加努力”,因为它将成为你最大的竞争优势。
二、那些程序员们后知后觉的职涯经验
在那些流行的博客平台上,你每天都能看到很多关于职场的文章,而这些文章的作者大多是各个行业的所谓职场达人。但我却发现,程序员作为一个很大的职业群体,却极少有人写这类文章。回想自己的职业生涯,在担任程序员或架构师的十年时间里,很少会去思考或总结那些职场经验,或许大多数年轻程序员也和当年的我一样一门心思只关注于技术,而对这些所谓的职场法则后知后觉吧!
这几年,当我开始从事IT管理工作后,反而有了更多时间,回顾自己,以及从身边更多年轻程序员的身上看到并体会到一些东西。我觉得让更多程序员能够尽早明白这些,或许对他们未来的职业生涯发展会有所帮助。
1.你的薪酬与工作量无关
这第一条或许就会让你感觉有些沮丧,但仔细想想这是不是一个普遍的事实呢?当你大学毕业后进入一家公司,每天非常努力地工作,还时常加班,而同一个团队中的一些老员工看上去却一点也不忙,更可气的是,他们的工资可能还比你高出几倍。此时,你的内心是否会有些许不平衡,甚至心生不满呢?
你的薪酬其实取决于很多因素,技术能力、经验资历、工作量等,但最本质的却是,你对公司是否重要,换句话说你是否容易被取代。公司很容易找到一个和你差不多的应届毕业生,而那些对公司产品非常熟悉,并且起到关键作用的老员工,要想替代他们,公司所需要付出的代价及需要承担的风险就会高得多。
所以,不妨摆正心态,正确认识到自己在公司中的位置,努力修炼内功,让自己变得越来越重要,相信你的薪资也会随之提升的。
2.尽可能持续做一件事
既然你对于公司的价值来自于你的不可替代性,那又该如何有效提升它呢?我的建议是尽可能持续做一件事。这既是指技术上的积累,也是指你能完整或较长时间参与同一个项目或开发一个产品。虽然,有时候你所做的工作并非你个人所能决定,但你仍需要有意识地去主动把握那些能让你持续积累技术或项目经验的机会。
经常有年轻程序员朋友向我诉说他们所遇到的一些困惑,比如,觉得自己在工作中用到的技术太旧了,询问是否应该转向其他技术甚至转行;或是对公司里做的项目不感兴趣,觉得没有前途,是否应该跳槽,等等。我当然会鼓励他们去学习更多不同的东西,但同时我也会提醒他们,技术深度及完整项目经验的重要性,如果你总是在跟随那些新出现的技术和框架,那你很难在某一项技术上达到理想的深度;同样,在一个公司里,如果你总是在更换项目,那你也很难提升自己的价值。参与10个项目,不如完整参与一个项目。持续做一件事是要你把每一件事做透、做好,而不是蜻蜓点水,浅尝辄止。
3.唯一不变的就是变化本身
在这十几年的工作时间里,我唯一看到不变的恰恰是变化本身。我们使用的技术在变,软件领域的实践方法在变,我们所做的项目在变,公司的组织架构在变,我们自己的职位和角色在变,当然还有我们的老板也如走马灯般换来换去。
作为程序员,我们又应该如何应对这些变化呢?我想说,你很难去改变所处的环境,或是阻挡那些变化的大趋势。你所能做的恰恰是培养自己持续学习的能力。在我之前的文章里,曾多次提到过10000小时定律——要成为一个领域的专家一定要花费10000小时以上的时间,而对于程序员来说,所谓的100小时定律同样重要——花100小时学习或修炼一门新的技术,往往就能超过一般人很多。你需要提升自己快速学习的能力,当你学得越多,往往就能够学得越快,因为知识之间总是存在关联性。慢慢地,你会发现自己能够非常从容地面对那些不断出现的变化,甚至可以提前预判趋势,当机会来临时,总能成为那个有准备的人。
4.你的声誉非常重要
声誉对于一名程序员来说非常重要。我看到的那些优秀的程序员都有一个共同点,那就是他们在团队和公司内部都有着良好的声誉,而这反过来帮助他们在职业生涯取得一个又一个迭代式的发展。反观那些缺乏声誉的程序员,他们往往会进入到一系列的恶性循环之中,很难在公司中获得发展,最终往往只能选择离开。
声誉本身与很多方面有关,但对于年轻程序员或是刚刚毕业的菜鸟来说,除了那些经常挂在嘴边的诚实守信、踏实肯干等之外,有一点特别重要,那便是严谨。因为它往往是判断一名程序员是否具备优秀潜质的重要因素。严谨的程序员对于分配给自己的任务会认真理解,对于自己的产出会仔细检查,这些都能大大减少工作中的出错概率,给团队或公司中的其他人留下良好的印象。你可能需要很长的时间来建立自己的声誉,而一次因不够严谨所导致的错误,就可能让你彻底失去它。养成严谨的习惯,将使你终身受益。
5.理解沟通的意义
刚成为一名程序员时,我认为技术就是一切,只要能够快速开发出高质量的程序,我就会有一种满足感。因此,我很排斥与用户沟通,对那些需求的讨论也很是敷衍,一心想着尽快进入开发阶段。而这样做的结果往往适得其反,用户并不认可我对系统的设计,我也时常被要求返工,这使得我的工作效率变得很低,心情也因此一度非常低落。
改变源于我对沟通意义的重新认识。其实,我们所开发的所有功能都是为了解决某些问题,或为用户提供特定的工具。当我们没有对问题有深入理解的时候,我们很难写出正确的程序来,因此我们需要向用户虚心求教,去真正理解他们所希望解决的问题。同样,如果我们已经是某一方面的专家,我们也有责任去引导最终用户接受我们提出的专业方案或设计。我想这才是我们需要更好地与用户或其他关联方沟通的目的吧。
6.你的右脑将是你成功的关键
谈到那些我们眼中非常成功的技术大牛、IT高管,都会出人意料地将一些非技术能力作为自己获得成功的关键。比如,编写文档或做PPT的能力、演讲的能力、说服他人的能力,等等。我虽然并不完全赞同最优秀的程序员不写代码这种观点,但我确信你的右脑将会是决定你能否成功的关键。
我所能感受到的最近一次较大的提升,恰恰来自于自学设计。并不是说我的设计能力达到了很高的程度,而是当我学会以一个设计者的视角去分析和解决问题时,我的思路就得到了很好的扩展,这使得我既可以用左脑来想出那些技术方案,也可以用右脑来为用户提供更人性化和具备良好用户体验的设计方案。
你可能会问,作为一名程序员,我该如何锻炼我的右脑呢?是不是一定要学习设计或者一门乐器之类呢?完全不需要,在工作中你就可以找到很多途径来提升你运用右脑的能力。比如,在你编写一个文档或PPT时,除了内容之外,能否再多考虑一下字体和排版,让人读起来更加舒服呢?在你与用户讨论需求时,能否尝试着从程序员思维转换到用户的角度来看待问题呢?在团队内部开会时,是否能提前做些准备,多争取在大家面前进行讲演的机会呢?当你持续这么去做以后,你会发现自己在各个方面都会变得越来越好,这其中也包括了你的编程能力。因为,这些技能总是在你看不见的地方互相作用和促进的。
7.不要轻易说简单或不可能
初入职场的年轻程序员往往不注意自己的表达,这当然是一种率真的表现,但有时候却可能会给你减分。记得那还是2008年,公司通过校招吸收了一批应届毕业生,其中有10个被分配到了我所在的部门。其中有一个男孩学东西很快,性格也很开朗,因此显得特别突出,我们也都认为他是这一批应届生中天资最好的。在一次部门会议上,部门领导有意识地询问每一个人,对于一些系统改造的建议和看法,而这个男孩在回答时多次用到了“××××很简单”,“××××不可能实现”,这样的表达。虽然我们都知道他没有任何恶意,但很明显他的这些看上去有些草率的回答是不恰当的,这也使他在部门领导那里的印象分打了一个大大的折扣,导致了后面的一些不必要的麻烦。
我举上面这个例子并不是希望大家变得非常世故,而是提醒年轻程序员们不应该轻易做出那些过于绝对的判断,应尽可能去使用科学的方法进行分析和论证,然后用不易被人误解的方式进行有效的表达,这样你提出的观点才能让大家感到信服。
8.你不应该总是单打独斗
很多程序员会诉苦说他们遇到的产品经理、PM、设计师、用户甚至是其他程序员有多么地烂,与他们一起工作简直像是与一群蚊子在一个房间里搏斗一般,让人感到抓狂,他们更希望能够一个人安安心心地编程。当你是一名初级程序员时,你的工作可能会比较单纯——编程。然而,随着你能力和职位的提升,你会被赋予团队中更加重要的角色,比如,架构师、团队负责人、项目经理,等等。
如果你真的希望做出一些具有影响力的东西,那么光靠个人是很难实现的。你需要和团队中不同角色的人进行合作,有时候你需要说服别人,有时候你则会被别人说服。在这期间,你可能会因为被否定,而受到挫折,这种感受容易让程序员们产生挫败感,但这却是你成长的机会。不要总是单打独斗,要学会在团队中协作,并尽可能让优秀的人围绕在你身边,这将扩展你的能力范围,让你变得更加强大。
9.你的能力显而易见
我在前一家公司担任架构师时,经常参与公司的人员招聘和年底的人员技能考核。关于如何招到一名优秀的程序员,在后面的文章中会谈到,而对于个人能力的评判,我想说你的能力是显而易见的,而这完全来源于你自身的努力。
那些优秀的程序员无时无刻不在体现他们的能力,从轻松地解决技术难题,到会议上提出被一致认可的解决方案,以及他们写出的那些优雅且完善的代码,这些都让他们显得与众不同,仿佛是天生的优秀程序员。但我想说,他们其实都是那些努力并使用了正确方法的人。程序员的能力来自于大量的编码实践,以及持续学习的能力和勤于思考的习惯。任何自作聪明,不懂装懂,以及投机取巧在明眼人看来都只会是东施效颦,显得如此微不足道。
以上这些是我今天感受到并记录下来的东西,你可能觉得有些内容让你有所启发,而对另一些内容则不以为然。但我相信在阅读的过程中,你一定经过了思考并得到了自己的答案,坚信那些你所坚信的东西,你会变得越来越好。
三、如何招到一名靠谱的程序员
我的上一份工作是在一家世界500强金融集团担任架构师,当时,公司的IT团队规模将近2000人。与其他IT公司一样,程序员的流动性也比较高,而作为架构师,我需要为所在的部门招聘各个层级的开发人员,当然也包括外包。在这长达5年的时间里,我面试了大约400名程序员。我并没有参加过任何关于招聘的人力资源培训,也没有正式研究过如何面试程序员,但是我通过对大量程序员的面试,以及录用后效果的观察,得出了一套自己的面试策略,如何去找到那些真正靠谱的程序员。
1.简历看人
阅读简历永远是面试的第一步。好的简历一定是正确、清晰并且能够体现候选人最有价值一面的。我首先会过滤掉那些包含错别字,文句不通或没有逻辑性的简历,因为如果一名程序员连自己的简历都不愿意去仔细检查并完善的话,很难想象他写出来的代码质量会如何。接着,我会重点阅读简历中的项目经验部分,在这里我能够看到面试者的开发经验,技能栈,并且判断他们熟悉的技术框架、工具是否与目前公司的要求相匹配。
这里,我还会特别关注面试者是如何来写这部分项目经验的,你需要用尽可能简练的文字来描述项目的背景,你在项目中承担的角色、参与项目的时长,你用到的技术,以及你在项目中的亮点等信息。优秀的程序员们往往善于归纳,并能够一针见血地发现问题或把一个问题说清楚。我经常看到面试者在简历中像写故事一般地描述他们的项目经历,光这一个章节就有好几页,虽然这看上去很详细,但其实这样反而会给你减分,因为这会让面试官判定你缺乏必要的归纳能力。
最后,我还会关注你的一些与编程有关的社会化活动,比如,你在GitHub上的开源项目,在知乎、V2EX中给他人的解答,以及你的个人技术博客等都会给你加分,因为这说明你对所从事的工作有着极大的热情,并愿意在业余时间去学习和提高自己。如果你要成为一个领域的专家,那你必须花费超过10000小时,而这光靠工作时间是远远不够的。
2.给面试者10分钟介绍自己最擅长的
当面试者通过了笔试和HR面试之后,你就需要面对面地对候选人进行面试了。我远不是什么面试专家,但我有一些自己的独特方法。我讨厌问一些很个人的问题,比如,你的职业规划是什么,你为什么想换工作,等等。我更愿意给面试者10分钟时间,让他介绍自己最擅长和最感兴趣的领域。这往往能帮助我很快做出下面的判断:
- 这个人对他所做的事情是否充满激情。
- 他是否能在自己的团队中有效地进行沟通。
- 他是否在自己的专业领域足够擅长。
- 你的团队是否会乐于和这个人一起工作。
这一招我在面试中用得很多,而实践证明也确实非常有效。
3.基础打牢了吗?
一般情况下,有一定规模的公司都会为面试者安排机考或笔试,从而能首先筛掉一批未能通过的面试者。另一些规模较小的或初创公司则会让面试官直接进行技术面试。其实,我觉得这两者的差别不大,有经验的面试官往往能够通过几个最简单的技术问题,判断出面试者的技术基础是否牢固,这不是为了证明他有多优秀,而是用来判断他是否是一名合格的程序员。对于我来说,我并不看重机考的成绩,因为机试的考题很多能够在网上得到,特别对于一些外包公司,他们总是能够通过各种途径得到考题,从而使得他们推送的外包能够顺利通过笔试。
下面是我经常会问的几个问题(Java):
- HashTable与HashMap有什么区别?
- Servlet是线程安全的吗?
- JSP中@include跟jsp:include的区别。
- HTTP的response code 403和500分别代表什么?
这些问题都很简单,但一些基础不牢的程序员往往会在这个时候露馅。当然,根据面试岗位的不同,你还可以有针对性地问一些问题。比如,你需要找一个能写核心算法的程序员(比如,银行的总账计算,或者保险公司的保费计算),那么你可以问一些算法相关的问题。
4.技术深度够吗?
具备牢固的技术基础,一般就可以满足项目中普通程序员的要求了,但如果你需要找的是一名资深程序员,那么你还需要对面试者的技术深度进行考察。我们现在做项目时都会大量使用框架,这能使我们的开发效率和质量都得到提升和保障,但同时也降低了对于程序员开发技能的要求。因此我一般会询问面试者下面的问题,来考察他对所使用的框架的掌握程度:
请你描述一下,在这个项目中,从一个HTTP请求发起,到最终的Response返回,它在你的系统和框架内部是如何流转的?
这个问题往往能够判断出面试者对于相关技术的掌握深度。较初级的开发人员描述的层级往往比较浅。比如,使用Spring MVC框架的,只能说到实现一个Controller继承BaseCommandController(甚至很多开发人员只知道继承了一个公司内部框架的基类),至于再往下Spring框架是如何进行内部流转的,就再也说不清楚了;而更资深的开发人员,往往能说出框架内部的实现机制,以及如何调用和处理的。在面试者描述的过程中,你还可以穿插询问一些比较有深度的问题,比如,框架中某个类这样设计是哪一种设计模式的体现,采用这样的设计有什么好处,等等。这比让面试者默写一个设计模式代码要有效,也自然得多。
除了技术层面上的考察之外,对于资深开发人员,还需要考察他们的设计能力。说到软件设计,大部分面试者都能熟练地背出面向对象的3个基本特性:继承、封装、多态,也能把它们的概念描述清楚。但我一般会问下面的这个问题来考察他们的面向对象设计能力:
请用一段程序代码描述我们所在的这间房间。
我惊讶地发现至少有一半的面试者都很难准确使用Interface和Class来给房间建模,也有一些人会将最基本的代码语法或关键字写错。
5.选择适合所在企业文化的人
这一点也曾是我经历的一个误区,我总是希望能为团队招到技术能力最强的人,而忽略了他是否与整个公司和团队的文化相匹配。这往往会造成,虽然招到了人,但没过多久就因为理念不同不欢而散的结果,反而给公司带来了损失。让我们看看GitHub的负责人是怎么说的:
我们很严肃地看待我们自己关于招聘流程的哲学。我们希望每一个GitHub员工都了解他们所要面对的环境,并保证他们是能够很好适应的。这包括我们所创造的文化、哲学、计划、错误甚至是晚餐。比起他们的技能是否满足要求,我们更看重他们的潜力,以及是否能够适应我们的企业文化。
我曾在具有鲜明文化差异的不同公司或团队工作,看到许多崇尚开放、开源的程序员在一个相对封闭,具有很多流程及规范限制的公司中很难发挥,最终选择离开。因此,在招聘程序员时,选择合适的往往比选择最优秀的更重要。
6.行为面试法
行为面试法可能是我在整个面试过程中唯一用到的教科书面试方法。一名程序员是否能够很好地工作,不仅取决于他能否顺利地完成开发任务,更重要的是在遇到一些特殊场景或问题时,他能否合理有效地处理和解决。行为面试法能够帮助我们从面试者描述的过去某一具体事件中,预测未来他在工作中可能的表现。下面便是一个我经常用到的问题:
请谈谈你在这个项目中遇到的最大困难或挑战是什么,你是如何解决的。
从面试者对上面这个问题的回答中,我能够很好地判断他是否有较强的独立解决问题的能力,而我认为这是除技术能力之外,程序员最应具备的能力。
7.给他们一个虚拟任务
经过上面的这些环节,你可能对面试者的整体情况已经比较满意了,但先别急着下结论。我曾见过能够顺利通过上面所有面试步骤,并且被雇佣的程序员,但是当他们进入实际工作后却没能把事情做好。
在你确定是否录用他们之前,可以给他们一个虚拟任务。我不是说一个抽象的程序问题,而是指一个真实的,可能就存在于你当前项目中,并且需要在一两个小时之内完成的一个开发任务。我曾经出过这样的考题:
写一个小程序:将一个以特定格式(如CSV)存储的文本文件转换为XML格式,并存储为另一个文件。
你可以给他一台已经配置好开发环境及IDE的电脑,让他当场编写代码。当然,如果时间有限,你也可以直接询问面试者的实现思路,并简单用伪代码来描述处理过程。通过这个测试,你能够看到很多细节,比如,面试者是否有良好的编码习惯,异常处理是否规范,代码逻辑是否缜密高效,以及他的开发效率是否足够高。如果面试者给出了非常优秀的解答,那么你就应该能够判断出他确实是一个优秀的候选人了,因为我从没碰到过能够通过上面的测试,却在实际工作中无法做好的程序员。
你可以在面试程序员时参考上面的这些步骤,对于我来说,大多数情况下它们都是有效的,但偶尔也会出错。你需要结合你所在公司和团队的实际情况,提炼出你觉得有用的面试步骤,并忽略其他的,最终形成属于你自己的面试策略。另外,你还需要根据面试时的实际情况,随机应变,因为人是最复杂的动物,而面试过程却是需要双方互动的。
想象一下,在你退休之前的未来几十年时间里,你都需要每周40小时的工作,因此无论是公司还是应聘者都应该互相尊重,建立充分的信任,并充分判断是否适合对方后,再决定是否雇用某人或接受一个公司的职位。你的目标不应该是简单地获得一份工作或者雇佣某个人,而应该以获得更多的工作乐趣和建立更良好的工作关系为目的去看待招聘这件事,切忌不要急于求成,就像谈恋爱一样,当双方都有感觉时,一切就水到渠成了。
四、每个程序员都应该了解的一件事
我曾经接触过一些IT高管及行业的技术大牛,当私下聊起他们是如何变得如此出类拔萃时,他们大多会以自嘲但又略带得意的语气来讲述他们的那些独门秘籍。
我的文档写得特别好。
我的口才很好,总是能成功说服别人。
我的PPT做得非常棒,是公司里数一数二的。
我写过几篇很受欢迎的技术文章。
我热爱开源文化,并在社区里很有名气。
……
我发现,这些普通人眼中的大神们很少会提及自己的技术有多牛,反而更多地把功劳归于那些看似与技术毫无关系的能力。大家千万别误以为他们只是一群华而不实,靠着一些小伎俩往上爬的小人。完全不是,而且我敢向你保证,他们中的每一个人在担任程序员或负责其他技术工作时,同样都有着非常出色的技术能力和优秀的工作表现。但为什么在他们眼中这些还不足以使他们达到现在的高度,反而是那些不起眼的写文档、做PPT、演讲等这些技能使他们能够在一次次竞争中胜出,并成为了我们中的佼佼者呢?
其实在我看来,他们所谓的这些秘籍,都可以归纳为一种能力,那就是自我营销。只有具备了这个能力,你才能脱颖而出获得成功,这一点对程序员同样适用。
我的这个观点可能会令很多程序员感到有些沮丧,因为和曾经的我一样,他们热爱写代码,并愿意以此作为终生的事业。甚至有些人是由于自己内向的性格才选择当程序员的,但你需要明白,你写的代码可能毫无用处,直到:
- 人们理解你在做什么。
- 人们对你所做的事情感兴趣。
- 人们为你所做的感到兴奋和激动。
大多数刚走出校门的年轻程序员们绝不会把“自我营销”作为一项自己需要具备的技能来关注和学习。他们往往一头扎进自己所热爱的某一个技术领域里,不断追求着更高的技术水平。我个人其实非常推崇具有这种精神的年轻程序员,正如我经常提到的10000小时定律,那些能够在某一领域获得成功的人都需要花费至少10000小时的努力,而对于普通人来说,你的努力也的确与你所能获得的成就是成正比的。既然这样,那为什么我们还需要学会自我营销呢?答案是:自我营销往往能够有效地放大你所做的努力,并且在你成功的道路上起到催化剂的作用。尽早地获得成功对于我们这一代程序员来说异常关键,因为这个世界上有许多与你一样努力的人,但有些人在最佳的时间点获得了成功,而另一些人虽然也通过努力达到了相同的能力,但错过了那个正确的时间点,从而走上了一条完全不同的道路。
我看过很多这样的例子。刚进公司时,一群年轻的程序员能力水平都差不多,他们也都非常努力,但他们中的一些人能够通过出色的自我展示,获得老板、同事及客户的信任,他们也自然获得了更好的升职机会,做上了团队领导等角色,从此走上了事业的坦途。而与他一起进来的那些程序员可能还在那里敲着代码,日复一日地做着比较基础的工作,并时不时地抱怨着:他的技术还不如我呢,他凭什么就能升职呢?
可见,一名程序员如果能够尽早意识到自我营销的重要性,并有意识地锻炼和运用这种能力,那将对你的事业产生有益的帮助。
那么对于程序员们来说,又有哪些能够提升自我营销能力的方法呢?下面便是我的一些建议。
1.读与技术无关的书
我刚毕业后的两年时间里买过很多技术类书籍,这帮我打下了良好的技术基础,后来我就不再买技术书了,因为我发现学习技术的最好方式是在互联网上,那里有最新的教程、文档和资源。因此,我建议只买一些经典的技术书籍来帮你打基础,然后从网上去学习一切新的东西。
我尤其鼓励大家去读那些与技术无关的书籍。程序员不善于自我营销,其中一个重要原因是他们自身所掌握的知识体系太过于单一,很难跳出技术范畴与人交流,并引起别人的兴趣和认同。你可以读任何历史、经济、人文、艺术类的书籍,它们都能够帮助你丰富自己的知识和思想,使你变得更加全面和完善,而这反过来,又能帮助你建立信心。
当然,你还可以读一些优秀的人物传记,从他们身上你可以获得成功或失败的经验,并且完善你自己的人格。我是在自学设计的那段时间里读了《史蒂夫·乔布斯传》的,我从没见过哪个人像乔布斯那样,对自己所从事的事业和创造的产品达到几近疯狂的地步。他的这种追求完美,对产品的设计和质量的苛求态度,都让我印象深刻,并对我日后的工作行事产生了积极的影响。
2.会写文档
我见过很多程序员,他们对自己写的代码非常认真负责,经常反复进行检查和测试。但每当让他们写文档或作一些PPT介绍时,他们却显得很为难甚至反感,并且写出来的文档也往往质量很差。
我也当过程序员,因此很能理解他们的想法。当一名程序员写完整段代码,完成一项工作后,他们对于代码所实现的逻辑是最清楚的。对于他们来说,写文档完全就是为别人而写,对自己没有一点好处,纯粹是在浪费时间。而且,对大多数程序员来说,给机器写代码要比给人写文档容易得多。
而我想说的是,恰恰相反,文档可能是你完成代码编写后一个最佳的展示机会。当代码实现了它的功能之后,就很少有人会再去看它,除非它出错了。但文档被阅读的概率却大得多。从一个文档中,我们可以看到关于作者的很多东西,思路是否缜密,逻辑性是否强,设计方案是否优秀,等等。可以说,文档质量的高低是衡量一名程序员是否优秀的重要标准之一。即使你离开了公司,你所写的文档很可能还会保留很长时间,被很多后来者阅读,而你的声誉也是在这一次次的阅读中构建的。优秀的文档能够让人们对你产生信任和好感,相反,质量差的文档则会使你的声誉受损。
3.学会包装
说到包装,人们往往会产生一种不好的感觉,把它与虚伪、假的东西联系在一起。其实,我所说的包装应该包含两层意思:
- 知道什么是美的(优秀的)。
- 精心制作。
这个想法来自于最近参加的一次保监会关于偿付能力改革的会议,整个方案是由普华永道提供咨询和实施的。会上他们的高级经理通过一个长达114页的PPT介绍了项目的背景、技术细节、实施方案等信息,整个PPT制作得非常精良,内容组织也很有条理,让人一目了然,顿时使大家对整个项目团队产生了很好的印象。可以说普华永道通过一个精心制作的PPT完成了一次非常有效的自我营销。
在日常工作中,我经常发现身边的程序员很难写出美观整洁的文档或PPT来。这一方面与我们从小缺乏美学教育有关,而更重要的往往是他们并没有真正用心去制作它。其实,我们可以通过寻找一些优秀的文档示例来学习如何制作优秀的文档,这其实并不困难。知道什么是优秀的,然后像写你的代码一样用心去制作就行了。
4.尝试多讲
讲话一直是很多程序员的硬伤,当然这也曾是我的硬伤。根据我的经验,你需要跨过以下两个障碍:
- 敢说。
- 让说的和你想的一致。
我经常看到一些程序员,他们平时跟熟悉的人都能很好地交流,而一旦到了会议上,特别是有老板或客户在场的情况下,就变得难于开口。程序员的性格特点大多是内敛含蓄的,在一些正式的场合他们会显得对自己缺乏信心。这需要通过平时多锻炼来克服,你应该在还处于职业生涯的初级阶段的时候,就开始有意识地锻炼讲话的能力,特别是在一些不那么重要的会议上,一方面你说出一些不那么准确地意见时,不会产生太严重的后果,另一方面你又可以很好地锻炼自己的表达能力。程序员遇到的另一个问题是,他们所讲的常常不能真实反映自己所想表达的意思。通过创造机会多讲,你才能更好地掌握使用语言的能力,通过不断的总结,你很快就可以非常流畅地表达自己的想法了。
5.建立社会化联系
一个完全封闭的程序员一定不是一个优秀的程序员。优秀的程序员往往愿意并善于与他人交流,分享自己的经验和想法,并在交流中获得有益的东西。这样做有很多好处:
- 通过这些社会化的活动能够使你的想法和技能更加完善。
- 能够使你建立权威,你的技术博客,在一些社区上的技术问题解答,以及你的开源项目等都会使人认为你是这方面的专家。
- 同样,你也可以获得他人的帮助,来解决棘手的难题。
- 你可以找到与你有相同兴趣的人,一起做有趣的事情。
- 你的社交网络将因此扩大,这意味着你所获得的机会将会更多。
……
我本人就是这方面的受益者,我刚毕业时在一家建筑软件公司工作,做的是Delphi开发,但我很快意识到互联网才是未来的方向,因此我自学了Java,并开始以Java软件工程师为目标,去寻找工作。但由于没有任何项目经验,我经常碰壁。一次偶然的机会,我看到BEA Dev2Dev(BEA被Oracle收购后,这个网站已经关闭了)有接受技术类文章投稿的信息,我马上连续写了两篇技术自学类的文章,并很顺利地通过了审稿,不久便在Dev2Dev发布了。我将我的这两篇文章链接写入了我的简历中,之后,我很明显地感觉到让我参加面试的电话明显比之前多了起来了,我也很快通过了一家外资软件公司的面试,成了一名Java工程师,从此走上了事后看来更理想的职业道路。
最后,我想告诉你的是,在这样一个时代,程序员是一个充满可能性的职业,你可能成为下一个马云,甚至可能是乔布斯(马云和乔布斯都有一个共同点,那就是他们很早就掌握了自我营销的能力)。如果,你并不想仅仅是一名程序员,那么你只需要在潜意识中埋下一颗“自我营销”的种子,让它跟随着你慢慢成长,相信我,你的未来将会因此产生很大的不同。
五、程序员的烦恼
自从写了博客,便时常能收到一些年轻程序员或编程爱好者们的来信,讲述的也大多是他们在各自职业发展中遇到的困惑,以及诸如如何学习编程之类的问题。我虽极不愿被当作人生导师(自知没有资格),却也不希望草草回复而辜负了读者们对于自己的那份信任。因此,我便会尽可能站在一个过来人、一个匠人及一个朋友的角度尝试为他们提供一些愚见。而对于下面这些常见的问题,我倒希望更多的读者一起来修正我的回答,并给那些有着同样问题的年轻朋友们以更全面的意见和解答。
1.是否还应该留在一线城市
很多人问过我类似问题,他们往往都有着共同的特点,年轻,多为20世纪90年代或80年代末出生,非常勤勉——无论是在工作中还是对自己的要求上,曾经满怀信心,认为靠自己的努力能够在这些一线城市站稳脚跟,打出一片天地来。此外,还有一个共同点是,都没有房,与男女朋友同住或和朋友合租。
我曾非常肯定地告诉他们,应该坚持留在一线城市,因为这里有最好的资源,无论是硬件还是软件方面,一线城市都汇聚了最优秀的基础设施和人才。这里有最适合程序员成长的环境和氛围,无论是软件园还是创业园,这里总是充满着挑战和机会,在这里你更容易获得优秀的视野和与你同样出色的伙伴。当然你未来的家庭、子女也都将能够享受到这些优秀的资源。还有一点不得不提的是,一旦离开,你将很难再回来,因为在很多HR看来,这种没有延续性的工作状态,代表了不稳定,以及潜在的能力风险。
但今天我的这一想法发生了改变,这源于我的一位同事也问了我同样的问题。他1988年出生,是公司通过校招录用的,到现在也已经工作了六七个年头了。我从没想到过他会有离开的想法,因为他确实非常优秀,他是同时进入公司的那批校招员工中的佼佼者,每次加薪也总是能够排在最高的一档。但就是在我看来如此优秀的年轻人,却也无法抵挡房价高涨这一事实所带来的冲击,而考虑离开上海去一个二线城市发展。
这件事让我颇为感慨,也让我对自己原来的想法产生了动摇。相信凭借我这位同事的能力,以及目前的发展趋势,应该还是能在这座大城市中买房的,他可能需要贷一大笔款在城市的郊县买一间小房,然后再一步一步由小换大,由远换近,而当他完成这些时,他可能发现自己的孩子又会挣扎在无房的困境中,而此时的他可能已经无力奋斗了。就像他反问我的,如果结果是这样,他的一生为了房子而做的努力是否真的值得呢?
他的问题让我感到有些惭愧,过去我所给出的建议更多只是从程序员个人发展的角度给出的,但程序员归根结底还是社会中的人,他们同样必须面对这些社会问题。而在我看来房地产这几年的发展就像是一场游戏,中央政府、地方政府、开发商、炒房客、普通百姓都参与其中,房价的上涨使很多人从中得到了好处,国家的GDP得到了保障,地方政府的债务得到了缓解,投机客成了首批实现财务自由的群体,但更多人却成了房奴,甚至我们还看到了社会上出现的隐性阶级:有房阶级与无房阶级。然而,随着游戏的深入,买房的风险正在变得越来越大,当那些既得利益者试图通过卖房将这些风险转嫁到你身上时,或许真的应该好好考虑一下了。
对于这个问题,我是无法给出正确答案的。买房本身并不会给你带来持久的快乐,因为当你买完房后,你会欠一大笔债,需要用几十年才能还清;当你终于把欠款还清时,你又会觉得这套房子太小,已经不够一家人住,需要换一套更大的房子。你不会得到快乐,因为这些客观条件(钱财、房子)总是无法与你的主观期望相符。相反地,如果买房能够给你的家庭带来更稳定的生活,为孩子提供更好的成长环境,而这一切都能为你的生活赋予意义,并让你感到更加快乐的话,那你还是应该更坚定地留下,而非选择离开。
2.小公司做的事情太繁杂了
现在很多创业公司如雨后春笋般不断冒出来,而越来越多年轻的程序员也走入了这些公司工作。他们中的很多人都有这样的烦恼:工作内容过于繁杂,要处理各种各样与开发无关的事情,还要与包括客户在内的各种各样的人打交道,这让他们无法专心钻研技术,对未来也很迷茫。
虽然大部分程序员都会向往BAT这样的大型软件公司,但我想说,公司就像是围城,外面的人拼了命想进去,而在里面的人却都想逃出来。几乎所有公司的员工都会抱怨自己的工作是多么无聊(可能Google除外),而只有正确的心态才是解决之道。
我时常会说“杂事不杂”,虽然看着被很多与技术无关的事务缠身,但它们对你来说同样具有意义。你从中可能获得沟通能力、管理能力、建立更广的人脉,在企业内部建立影响力,等等,之所以今天你能成为公司的骨干不也正是因为你干了这些杂事吗?如果你能认同这一点,那就不应该总是把时间花在抱怨这些杂事上,而是考虑如何更有效地处理它们。比如,你需要负担很多培训工作,那何不建立一个更好的内部学习平台,让培训对象能够进行自学呢?你需要反复向用户解释系统的使用方法,那何不完善系统的使用说明,让用户更愿意先自己去解决问题呢?你不应该总是陷入在那些处理杂事的循环往复之中,跳出来,创造更好的方式去解决它们才是应对之策。
3.创业公司中的危机感
在过去的这个互联网寒冬中,很多创业公司纷纷倒下,而还在那些创业公司中工作的程序员们也会不自觉地增添一份紧张和焦虑,特别是在公司长时间没有起色的情况下,很多人在考虑是否应该换一份工作。当然,如果公司真的看不到一点希望,而你又不是创始成员的话,那么选择离开无可厚非。但参与创业的过程对你来说仍会是一份宝贵的经历,是你应该加倍珍惜的。无论成功与否,经历一次完整的创业都将让你受益匪浅。你将学到很多在大公司仅仅做一颗螺丝钉所学不到的东西。虽然在此过程中,你一定会有挫败感、焦虑,但或许坚持一下就会看到曙光。
另外一点我想说的是,创业的过程将让你获得不同的眼光。创业大多是在一个新的领域中进行的,你不应仅仅专注于公司所使用的那些技术,而更需要通过深入理解这个新的领域,去获得不同的视角和眼光,因为它们也会在未来成为你的核心竞争力。
4.技术单一,想学习更多
很多程序员在工作中使用的技术都非常单一,比如,只用一种语言来写代码,只写前端或后端的功能。他们很希望能够学习诸如游戏开发、VR开发等新的技术。
我总是很鼓励身边的程序员们去涉猎不同的技术甚至领域,但前提是你必须首先对某一门技术做到精通。技术是需要深耕的,深入学习一门主流的开发技术,并不断提升编程思维,比对很多技术栈都浅尝辄止要好很多。因此,如果精力有限不妨先学好一门技术,你会发现之后再去学习其他技术会变得容易许多,因为它们之间往往都是相通的。
5.我想自学编程,应该学习哪一门语言
“编程语言的种类太多了,如果我没有任何基础,应该学习哪一门编程语言呢?”我很高兴看到越来越多的人,甚至那些与软件行业毫无关系的人都开始学习编程。虽然我认为他们中的大部分人,不会成为编程方面的专家,但通过编程,他们仍然能够有很大的收获,因为这将给他们带来一种新的思维方式,从而在各自的行业和领域中获得成功。
但如果要问我应该学习哪一门语言,我却很难给出唯一的准确答案,或许你可以看看我写的文章“自学编程之前,你需要知道这些”,里面提到了基于不同目标和应用场景下,如何选择你的第一门编程语言。但如果你真的没有任何思路,只是希望你学的这门编程语言能够有用,我的建议是JavaScript,因为它看起来是唯一可能在未来所有领域内得到应用的编程语言,从我们的移动设备,到传统的Web应用,再到服务器端开发甚至是硬件编程,它几乎无处不在。
6.大专学历,能进大公司吗?
我在几个不同类型的世界500强企业工作过,因此我知道,几乎所有大公司都有学历要求,全日制本科几乎成了所有内部职位的最低要求,所以学历上的缺失确实会成为你进入大公司的障碍。但并不能把这看似不合理的要求全都怪在HR头上,因为他们对编程知之甚少,所以需要明确的筛选机制来为IT部门提供合适的人选,而学历就成了那必不可少的门槛之一。
当然也有一些我所知道的例外情况:
- 通过内部员工的推荐。
- 通过外包公司进入后,再转为内部员工。
- 努力成为某一领域的专家,或者建立个人影响力。
如果你还是一名大专在读学生,那么我希望你不要过早焦虑,尝试问问自己除了学历之外还有什么让你能够脱颖而出的东西?是否有自己的个人项目?是否为知名的开源项目贡献过代码,甚至只是参与编写文档?是否通过写博客阐述过自己的独到观点,并得到大家的认可?在哪家公司实习过?这些都可能抓住雇主的眼球,从而弥补你在学历上的不足。
7.非计算机专业学生,未来想从事软件开发
近几年随着互联网的发展,程序员似乎成为了一个热门职业,它常常与高薪联系在一起。而有一些非计算机专业的学生也希望通过自学编程,未来从事软件开发的工作。
首先,如果你只是为了所谓的高薪,而改变专业的话,你可能需要更加慎重,因为相较科班出身的应届生来说,非计算机相关专业的学生去竞争同样的程序员岗位,会更困难一些,而进入那些知名公司的难度也就更高。而更重要的是,如果不是出于兴趣的话,你也很难学好编程。
当然,如果你已认清了自己的方向,那我的建议是,把某一门编程语言的基础打牢,然后尽可能地做出一些实际的项目。比如,选择应用比较广的Java语言,然后结合Android的开发做一些小的APP应用,并将它们放到自己的GitHub里。有机会的话去初创公司实习,即使一开始没有工资,但能学到很多实践经验。相信那样在毕业时,你就能具备不错的竞争力,因为我们在挑选应届生时,往往更喜欢那些基础牢固、具备优秀思维能力,并且乐于动手的年轻人。
8.总是熬夜,睡眠不足
我知道很多程序员都会熬夜,睡得很晚,凌晨一二点几乎是家常便饭。有些是因为加班,有些是因为钻研和学习技术,还有些则是因为游戏、追剧或其他兴趣爱好。程序员应该有自己的兴趣爱好,可以是不断学习,也可以是游戏娱乐,我并不认为每个人都应该非常严苛地对待自己,去规定自己该做什么不该做什么,你需要学会的是如何处理好兴趣爱好与休息之间的关系。对于每个人来说睡眠都非常重要,通过牺牲睡眠来获得一两个小时的时间,到头来只会是恶性循环,得不偿失。合理安排时间,提升效率,11点前睡觉,是我的建议。我没有设什么闹钟,因为它已经成为了我的生物钟,到了这个点就会犯困想去睡觉。而这能保证我有充足的睡眠,并更有效率地投入到第二天的工作中。
程序员和普通人一样也会在工作和生活中遇到各种不同的问题,有一些是因为他们尚未成熟,没有达到宏远的眼界和豁达的胸襟,而另一些则多是闲愁,因不够充实而平添烦恼。没有人能够代替他们,就像我们编程一样,最终需要用自己的智慧去解决这些问题。
六、提给年轻程序员的职涯建议
一转眼从学校毕业已经超过10年了,从一名普通的程序员成长为500强企业的架构师,如今也开始从事IT管理工作,可以算是一个过来人。这一路走来,自己有一些感悟,也看到其他人的一些经验教训,对于如何掌控自己的职业生涯,我总结了10点建议,希望对那些尚处在迷茫中的年轻程序员朋友们能有所帮助。
1.尽早确定你想做的事情
一个人的职业生涯总是包含很多阶段,而每个阶段又是环环相扣,互为因果的。因此,我们总是能够看到一群同时毕业的人,经过10年后,各自的发展却迥然不同。有些人总能快人一步,提前到达职涯的新高,而有些人却慢人半拍,逐渐掉队。这其中,一定存在运气等其他客观因素的影响,但仔细观察,我们会发现那些成功的人,往往是那些有着坚定目标,并持续努力的人。
因此,尽早确定自己想做的事情——你的职业目标,意味着你可以获得比其他人更多的时间去努力。我们中的绝大多数都不是天才,因此所能达到的成就,也就往往与你为达成这一目标所付出的时间成正比了。
作为一名技术人员,在我工作过的每家公司,都会有同事因为待遇或其他原因,放弃技术路线,转而成为一名业务人员。而我由于对技术的热爱,始终坚持从事技术相关的工作,随着经验与能力的累积,我成了公司的技术专家,反而获得了更好的升职机会。现在再回过头来看,正是由于我比较早地确定了自己的职业方向,并坚持下来,才在某些领域获得了比较优势,并取得了现在的成绩。
2.10000小时定律
我曾看过一本书,名为《异类不一样的成功启示录》,作者对社会中那些成功人士进行了分析,书中那些被称为异类的计算机天才、杰出的棒球手、演奏家,无一例外都是经过了超过10000小时的练习才达到了超乎常人的技能。
另一个我最喜欢的故事,是关于一位做寿司的日本老人的,他便是被誉为寿司之神的小野二郎,他的寿司店数寄屋桥次郎(Sukiyabashi Jiro)被《米其林美食指南》评为三颗星的美食店,并被公认为拥有世界上最优质的寿司服务。而他作为全球最年长的米其林三星寿司大厨在88岁高龄仍然在不断探索寿司的制作之道。当然,他花在寿司制作上的时间,也远远超过了10000小时。
我使用上面两个例子是希望告诉你,无论你在哪个领域,只要能坚持为同一目标持续不断地努力,花费超过10000小时进行练习和钻研,那么你也一定能够成为该领域的杰出人才,并成为他人眼中的异类。
3.提高工作效率
在工作中,我们经常会看到这样的场景,甲、乙两个员工,领导布置了类似的工作,甲员工非常努力,加班加点按时交付了领导布置的工作,而乙员工做得很快,在很短时间内便完成了,一到下班就回家去了。那么作为老板,会如何评价这两位员工呢?我想他一定会认为甲是一个好员工,但乙员工的潜力更大,值得花更大的力气去培养。
我们做得更快,也就意味着我们可以做得更多,为公司或团体创造更大的利益。这同样能给我们自己带来更多的机会。因此,你应该尽可能地提高自己的工作效率。
对于提高工作效率,我有以下两点建议:
- 加快工作节奏。
- 借助工具完成工作。
加快工作节奏:我常喜欢使用中国男足与巴西男足来做比较,他们之间的最大差距,在我看来并非技术,而是完全不同的节奏。巴西男足从单个球员到整个球队的节奏都比中国男足要快,因此中国男足始终处于被动。在工作中也是一样,我们往往会以自己觉得舒服的节奏来工作,但如果我们能够不断尝试加快我们的工作节奏,便能极大地激发自己的潜能,有效提升自己的工作效率。
借助工具完成工作:像Google、Facebook这样的大型互联网公司的员工之所以有那么高的工作效率,其中一个重要原因,便是他们善于运用和创造工具,大部分重复的劳动都是通过工具来完成的。同样,我们也需要时常审视自己的工作,哪些是让你头疼的重复劳动,怎样才能使用工具来帮你完成。当我们有了这样的意识,我们自然会去尝试寻找或创造一些工具来使自己从繁复的工作中解脱出来,变得更加高效。
4.简明的沟通方式
我认为现在的公司大致可以分为两大类,第一类是以谷歌、百度为代表的以技术为中心(或技术驱动型)的企业,这样的企业往往已经采用扁平化的管理方式,更推崇个人的创造能力及小团队的贡献;另一类则是传统的以业务为中心的企业,比如我所在的传统金融行业,它们大部分还是以业务驱动,或正处在互联网的改造之中。这样的企业往往有着比较明确的层级关系,并且以邮件作为主要的沟通方式。
无论你是在哪一类公司,你都很难去改变公司文化,但作为个体,我建议尝试更简明的沟通方式,这不仅能使自己的工作更清晰,也能显著提高你与他人的沟通效率。就拿邮件为例,我每天大致需要处理50~100封邮件,而对于更高层级的管理人员,他们可能每天需要处理超过200封邮件。为了让别人更清晰地理解你的意图,我往往会在标题最开始处直接加上“请审核”“需关注”这样的标识;对于邮件的内容,我也会将结论放在邮件的最开头部分,让其他人能在最短的时间内掌握邮件所要传达的主要信息和意图,如果需要进一步的信息,才阅读邮件的剩余部分。
另外,可以尝试减少邮件的沟通,很多情况下一些次要的沟通,完全可以去到对方的办公桌当面沟通,或采用电话沟通,在双方达成一致或得到结论后,再追加邮件进行确认。我认为这比邮件来来回回要简单高效得多。
5.PKSS与持续学习
大多数公司,在年终对员工进行考评时,都是以结果为导向,并加以横向比对的。那么,我们怎样才能在与同事的竞争中脱颖而出呢?
国外有一个词,叫作PKSS(PK Saturday and Sunday),也就是说在周六和周日进行比拼。爱因斯坦也曾说过:人的差别在于业余时间。特别是在当今这个竞争社会,持续学习对每一个职场人都显得尤为重要。每晚抽出两个小时,周六周日抽出4~6个小时来阅读、学习、思考或参加有意义的演讲、讨论,你会发现,坚持数月之后,你便会超过周围的人。
有些人可能觉得工作时用到的技能就这些,我们需要学些什么呢?我的建议是既要“专”,又要“博”。现代社会要求的是T型人才,也就是有一技之长,又能有其他相关技能。如果说你在某一个领域花10000小时,能使你在这个领域成为一位杰出人物的话,那么不妨尝试在你感兴趣的其他领域花100小时学习。比如,花100小时学习素描,完成后你的绘画水平能够远远超过那些从来没有学习过的人。因此,除了在你专注的领域投入时间学习之外,尝试学习任何你感兴趣的其他东西,比如,烹饪、写作、摄影,等等。知识往往是相通的,你学得越多便学得越快,对我而言,摄影、写作等技能也都能够对我所从事的软件开发有很好的促进作用。
6.学会控制情绪
大多职场新人都能比较理性地完成工作,但有时情绪控制能力还有所欠缺,具体表现包括主观、随性、情绪变化大,这往往会对个人的职业发展造成损害甚至灾难。我身边就曾出现过这样的例子:她是一个女孩子,非常要强,工作也总能完成得很出色,她从另一个组调来没多久,就因为一件小事与领导的意见不合,而情绪失控大吵一架,从此之后便进入了恶性循环,她总是认为领导处处故意刁难,而领导也会觉得她很难协作,久而久之便严重影响了她的工作积极性,工作质量也直线下滑,最后不得不再次转岗。可见职场中的很多事情并不完全取决于你的个人能力,而更需要你有一个比较好的情商,善于控制情绪与人相处。
那么如何才能提高自己的情绪控制能力呢?一个简单的方法就是做到对事不对人。当你对某一件事非常气愤时,首先,你需要问问自己发火有没有用,如果答案是否定的,那么为什么不静下心来想想怎样去解决问题呢,其次,你需要有同理心,多站在对方的角度和立场考虑问题,即我们常说的换位思考,你会发现很多时候对方不是故意为难你和与你作对,而是也有他的考量和存在的现实问题;最后,你也应该有一些自己的情绪宣泄方式,比如,与朋友聊天、练习书法、看电影等,都是不错的释放方式。
7.让最优秀的人围绕在你身边
苹果、谷歌、百度这些科技巨头,之所以能够不断地进行创新,一个重要的原因是,它们汇聚了世界上最优秀的人才,他们有着共同的兴趣和目标,聚集在一起形成了很多优秀的团队,从而创造出一个个令世界惊叹的产品和技术。
我曾面试过一位优秀的UI设计师,当问到离职原因的时候,他告诉我,当他每天中午与他的同事们一起吃饭时,所聊的话题都是炒股、育儿、旅游,因此他决定离开那个公司。可见周围的人是否足够优秀,成了他选择企业的一个重要因素。
当你还是一个职场新人的时候,你需要和优秀的人一起打拼,去完成一个又一个的目标。当你的职位不断上升时,你的身边会出现一些阿谀奉承的人,而此时,你更需要那些优秀的伙伴,能够指正你的错误,帮助你朝着正确的方向前进。
8.善于归纳与表达
随着自身技能和经验的提升,你在公司中很可能会被赋予更多的管理职责,或者独立承担一些重要的项目。这时归纳与表达能力将显得非常重要,你经常会被要求做项目进度报告,或者,在电梯或走廊里巧遇老板时,你可能也需要用最短的时间来描述当前项目的进展,遇到的问题、风险等。
因为工作的关系,我曾与埃森哲的一位咨询师有过很多接触,他的归纳与表达能力都非常出色,往往能够一针见血地描述一个问题本质,并进行透彻的分析。而他告诉我,他的这种能力并非与生俱来的,他以前曾经是一名Cobol程序员,转行做咨询后,由于个性羞涩,不善与人交往,一开始也是很怕做公开演讲,但他的老板发现他的问题后,特意安排他每天下班前,在公司内部公开做一次演讲来讲述他当天的工作内容,没过一个月,他发现自己竟然也能非常自信且自如地在众人面前进行演讲了。
如果你也是一个性格内向,不善与人交往的职场新人,那么不妨也学学那位咨询师,自己创造机会进行训练,比如每天模拟进行一次讲演,经过一段时间,你会惊讶于自己所取得的突破。
9.掌握英语
如果你在外企,那么英语作为一项必备技能是非常重要的。但即使你是在一家国内的企业,你仍然应该掌握英语,因为它能够帮助你获得更宽广的视野,带来更多的工作机会。
我第一次真正使用英语,还是在我的第一份工作期间,一次偶然的机会,领导让我带一名来自英国剑桥大学的计算机专业暑期实习生。在实习期间,他给我讲述了他是如何通过互联网自学游戏编程,并与来自法国、美国等地的在校学生组成团队,研发出一款3D游戏,并在各个学校进行讲演的经历。而这一切都是通过英语进行交流沟通的。他的故事深深触动了我,从此以后,我在工作和生活中,都尽可能地去使用英语,比如,我在Stackoverflow上查找开发问题,我用GitHub管理代码库并和来自世界其他国家的程序员一起维护开源项目。我也在Dribbble上浏览优秀的UI设计作品以获得设计灵感,我还在Freelancer上,做一些感兴趣的兼职项目。英语使我开阔了视野,从一个国家的人,成为了一个世界的人。
10.睡眠使你更加强大
这条准则对于我非常有用。有很多人认为睡眠是弱者的表现,他们总是尽可能地晚睡。我认为这是非常危险的,睡眠能够帮助我很好地平衡生活,在一个良好的睡眠之后,我总是能够非常有活力地投入到新一天的工作中,我也会变得更有效率和更赋创造力。没有优秀睡眠的人,看似获得了更多的时间,但其实他们往往会处在更大的压力之下,从而丧失效率。这是一种恶性循环,他们不得不通过其他方式重新激活自己,比如,按摩、消遣、休假,等等。
在我看来,休假的作用往往被高估了,而旅行更不是休息。事实上,我认为旅行带给人的压力比待在家里什么事都不干要大得多。我个人觉得每天完成必要的工作是一件令人愉悦和满足的事情,即使我在旅行过程中,也会抽出一点时间,来做一些简单的工作。当然,你应该出去旅行,因为你需要去发现新的东西,而不是因为你需要放松。
很多人对我说,他们早上很难醒过来。而我想说的是早醒其实不难,但早睡很难,你需要调整自己的作息时间,来保证充足的睡眠,这将使你受益终生。