第一章 谈职业生涯
一、写给年轻程序员的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点建议吧“比一般人更加努力”,因为它将成为你最大的竞争优势。