这是程序员的自我修养的最后一篇,主要内容是写一写代码之外的内容。陈逸鹤老之前写过一本书就叫《程序员的自我修养》,(网上有电子版),本文主要是结合书中的内容和我自己的看法,更像是一篇读书笔记,多数观点来自上面书中。 编者按
写给入行程序员的10点启示
1.正确地认识自己
相比码农、程序猿、软件工程师、张江男、屌丝程序员等等这些网络词汇,当你把自己看作是一个屌丝程序员的话,那你也可能就是那个衣食不愁,但整天浑浑噩噩、无所追求的屌丝。我更愿意用技匠这个词来形容程序员,就像我给自己起的花名一样。
程序员应该是那些不断追求更高技术,并有着自己产品梦的工匠。当你通过对自己技术不断打磨,一次又一次做出那些优秀产品的时候,你会发现自己不再是他人口中的码农或是屌丝,而更多被称为了大师、大神,而受到大家的尊重。
2. 比一般人更加努力
优秀的程序员往往会被同天才或高智商的人联系在一起,但我想告诉你,你周围所看到的那些天才(身边的优秀程序员)只是在你没看到的时候花了更多时间工作或者学习而已,当你也坚持这么做时,你也会变得和他们一样优秀。
3. 适时建立个人权威
建立个人权威,这能让其他人看到你的不同之处,并为你在公司或团队内部构建起良好的影响力。当然,这一切的前提是你通过不断努力积累了自己的实力,并在恰当的时候去展现它。
4. 遵循最佳实践
技术更新太快,作为程序员,如何才能适应这种变化呢?其实,就像每年都会有新的流行设计趋势,然而设计的本质和原则却始终不变一样。这些最佳实践或由此衍生出来的框架、工具都是那些富有经验的程序员通过大量实践,总结出来的最优秀的软件开发思想。通过理解和对它们的有效实践,能够让你站到前人的肩膀之上,对软件开发本身获得更深入的理解和认识。
5. 保持好奇心并乐于探索新的事物
优秀的程序员们也往往非常乐于探索那些看似与工作无关的技术。比如,做后端的程序员去学习前端的技能,前端工程师则去学习UI设计,等等,这些虽不会让他们成为那一个领域的专家,但技术往往是相通的,当你在探索这些新鲜事物的同时,你会发现你原有的技能也得到了提升。
6. 抛开代码与人沟通
“紧盯着电脑屏幕,不断敲击键盘,目光有些呆滞。”这可能是程序员给人的印象。而我所看到的那些优秀的程序员却都不是这样的,他们往往兴趣广泛,并且都乐于与人沟通交流。程序员们很容易会忽视与人的沟通,这其实对他们的职业生涯发展是不利的。
我很支持那些年轻的程序员们坚持去走技术路线,但这不应该成为你排斥与人沟通的理由。你需要与人沟通来获得他人的帮助;你需要与人沟通来建立良好的工作关系;当你的能力不断提升,被赋予更多职责时,你更需要与人沟通来管理好自己的团队,以及与老板或客户进行有效的沟通等。
7. 要为优秀的人工作
环境对一个人的影响是巨大的,而最可怕的是当你身处其中时,很难意识到你正在变得越来越糟。我之前带过一些不错的程序员,他们中的一些人去了一些整体氛围或环境不是太好的公司。
过了一段时间后,再次与他们碰面聊天时,我发现他们的思维、观点相较之前并没有提升,有些甚至反而退步了。
8. 生活、睡眠、旅行
我希望每个程序员都能明白工作、技术、写代码这些并不是你存在的意义,而生活才是,你需要懂得生活,并且学会生活。
生活:尝试有节制和有规律的生活,程序员生涯绝不是一次冲刺,而更像一场马拉松。
睡眠:很多人觉得睡眠是弱者的表现,他们往往会长时间熬夜,其实我觉得这是这一种恶性循环,反而会使你的工作效率变的更低。
旅行:去任何一个新的地方都可以称之为旅行,让你发现和感受新的东西,而这些是从电脑屏幕上无法获得的。
9. 相信自己的天赋和创造力
每个人的身上都有属于他自己的天赋和创造力,但它们也绝不是与生俱来的,你需要在生活中不断地培养和发掘它们。下面是我觉得一些行之有效的方法。
阅读优秀的书籍:好的想法绝不是凭空产生的,尝试从书中寻找那些能激发你创意和灵感的优秀内容。
记录和收集:尝试用一个小本子,将你转瞬即逝的好想法记录下来,它们可能并不直接有效,但下一个更好的想法可能就是从这些你记录下来的想法中产生的。
尝试动手:光有好的想法是不够的,你需要成为一个有工匠精神的人,通过亲自动手去尝试和实践,你会不断从中得到新的创造力。
10. 如果上面提到的其他建议都对你无效,那么就请坚持第2点吧,因为它将成为你最大的竞争优势。
那些程序员们后知后觉的职涯经验
1. 你的薪酬与工作量无关
换句话说你是否容易被取代。公司很容易找到一个和你差不多的应届毕业生,而那些对公司产品非常熟悉,并且起到关键作用的老员工,要想替代他们,公司所需要付出的代价及需要承担的风险就会高得多。所以,不妨摆正心态,正确认识到自己在公司中的位置,努力修炼内功,让自己变得越来越重要,相信你的薪资也会随之提升的。
2. 尽可能持续做一件事
既然你对于公司的价值来自于你的不可替代性,那又该如何有效提升它呢?我的建议是尽可能持续做一件事。这既是指技术上的积累,也是指你能完整或较长时间参与同一个项目或开发一个产品。
技术深度及完整项目经验的重要性,如果你总是在跟随那些新出现的技术和框架,那你很难在某一项技术上达到理想的深度;同样,在一个公司里,如果你总是在更换项目,那你也很难提升自己的价值。
参与10个项目,不如完整参与一个项目。持续做一件事是要你把每一件事做透、做好,而不是蜻蜓点水,浅尝辄止。
3. 唯一不变的就是变化本身
作为程序员,我们又应该如何应对这些变化呢?我想说,你很难去改变所处的环境,或是阻挡那些变化的大趋势。你所能做的恰恰是培养自己持续学习的能力。
4. 你的声誉非常重要
除了那些经常挂在嘴边的诚实守信、踏实肯干等之外,有一点特别重要,那便是严谨。因为它往往是判断一名程序员是否具备优秀潜质的重要因素。严谨的程序员对于分配给自己的任务会认真理解,对于自己的产出会仔细检查,这些都能大大减少工作中的出错概率,给团队或公司中的其他人留下良好的印象。
5. 理解沟通的意义
当我们没有对问题有深入理解的时候,我们很难写出正确的程序来,因此我们需要向用户虚心求教,去真正理解他们所希望解决的问题。
6. 你的右脑将是你成功的关键
谈到那些我们眼中非常成功的技术大牛、IT高管,都会出人意料地将一些非技术能力作为自己获得成功的关键。比如,编写文档或做PPT的能力、演讲的能力、说服他人的能力,等等。我虽然并不完全赞同最优秀的程序员不写代码这种观点,但我确信你的右脑将会是决定你能否成功的关键。
7. 不要轻易说简单和不可能
年轻程序员们不应该轻易做出那些过于绝对的判断,应尽可能去使用科学的方法进行分析和论证,然后用不易被人误解的方式进行有效的表达,这样你提出的观点才能让大家感到信服。
8. 你不应该总是单打独斗
如果你真的希望做出一些具有影响力的东西,那么光靠个人是很难实现的。你需要和团队中不同角色的人进行合作,有时候你需要说服别人,有时候你则会被别人说服。
9. 让你的能力显而易见
那些优秀的程序员无时无刻不在体现他们的能力,从轻松地解决技术难题,到会议上提出被一致认可的解决方案,以及他们写出的那些优雅且完善的代码,这些都让他们显得与众不同,仿佛是天生的优秀程序员。但我想说,他们其实都是那些努力并使用了正确方法的人。
程序员的能力来自于大量的编码实践,以及持续学习的能力和勤于思考的习惯。任何自作聪明,不懂装懂,以及投机取巧在明眼人看来都只会是东施效颦,显得如此微不足道。
如何找到一个靠谱的工作
原文是从面试官的角度:如何招到一名靠谱的程序员。面试考察的方向就是我们求职应该是要做的部分,所有看看面试官是怎么选择人的。
1.简历看人
阅读简历永远是面试的第一步。好的简历一定是正确、清晰并且能够体现候选人最有价值一面的。我首先会过滤掉那些包含错别字,文句不通或没有逻辑性的简历,因为如果一名程序员连自己的简历都不愿意去仔细检查并完善的话,很难想象他写出来的代码质量会如何。
接着,我会重点阅读简历中的项目经验部分,在这里我能够看到面试者的开发经验,技能栈,并且判断他们熟悉的技术框架、工具是否与目前公司的要求相匹配。
简历是赢得一张面试门票的重要一环,关于程序员写简历的要点,我在之前写在 《程序员写简历的5个点》
2.给面试者10分钟介绍自己最擅长的
我更愿意给面试者10分钟时间,让他介绍自己最擅长和最感兴趣的领域。这往往能帮助我很快做出下面的判断:
- 这个人对他所做的事情是否充满激情。
- 他是否能在自己的团队中有效地进行沟通。
- 他是否在自己的专业领域足够擅长。
- 你的团队是否会乐于和这个人一起工作。
这一招我在面试中用得很多,而实践证明也确实非常有效。
3. 基础打牢了吗
有经验的面试官往往能够通过几个最简单的技术问题,判断出面试者的技术基础是否牢固,这不是为了证明他有多优秀,而是用来判断他是否是一名合格的程序员。
下面是我经常会问的几个问题(Java):
- HashTable与HashMap有什么区别?
- Servlet是线程安全的吗?
- JSP中@include跟jsp:include的区别(现在不用了)
- HTTP的response code403和500分别代表什么?
这些问题都很简单,但一些基础不牢的程序员往往会在这个时候露馅。当然,根据面试岗位的不同,你还可以有针对性地问一些问题。比如,你需要找一个能写核心算法的程序员(比如,银行的总账计算,或者保险公司的保费计算),那么你可以问一些算法相关的问题。
4. 技术深度够吗
对于资深开发人员,还需要考察他们的设计能力。说到软件设计,大部分面试者都能熟练地背出面向对象的3个基本特性:继承、封装、多态,也能把它们的概念描述清楚。
5. 选择适合所在企业文化的人
我曾在具有鲜明文化差异的不同公司或团队工作,看到许多崇尚开放、开源的程序员在一个相对封闭,具有很多流程及规范限制的公司中很难发挥,最终选择离开。因此,在招聘程序员时,选择合适的往往比选择最优秀的更重要。
6. 行为面试法
一名程序员是否能够很好地工作,不仅取决于他能否顺利地完成开发任务,更重要的是在遇到一些特殊场景或问题时,他能否合理有效地处理和解决。
下面便是一个我经常用到的问题:
- 请谈谈你在这个项目中遇到的最大困难或挑战是什么,你是如何解决的。
从面试者对上面这个问题的回答中,我能够很好地判断他是否有较强的独立解决问题的能力,而我认为这是除技术能力之外,程序员最应具备的能力。
每个程序员都应该了解的一件事
1. 读与技术无关的书
我建议只买一些经典的技术书籍来帮你打基础,然后从网上去学习一切新的东西。我尤其鼓励大家去读那些与技术无关的书籍。程序员不善于自我营销,其中一个重要原因是他们自身所掌握的知识体系太过于单一,很难跳出技术范畴与人交流,并引起别人的兴趣和认同。
你可以读任何历史、经济、人文、艺术类的书籍,它们都能够帮助你丰富自己的知识和思想,使你变得更加全面和完善,而这反过来,又能帮助你建立信心。
2. 会写文档
文档可能是你完成代码编写后一个最佳的展示机会。当代码实现了它的功能之后,就很少有人会再去看它,除非它出错了。但文档被阅读的概率却大得多。
从一个文档中,我们可以看到关于作者的很多东西,思路是否缜密,逻辑性是否强,设计方案是否优秀,等等。可以说,文档质量的高低是衡量一名程序员是否优秀的重要标准之一。
3. 学会包装
说到包装,人们往往会产生一种不好的感觉,把它与虚伪、假的东西联系在一起。其实,我所说的包装应该包含两层意思:
- 知道什么是美的(优秀的)。
- 精心制作。
作者举例一个普华永道的高级经理通过一个长达114页的非常精美的PPT而赢得了保监会关于偿付能力改革的会议。
在日常工作中,我经常发现身边的程序员很难写出美观整洁的文档或PPT来。这一方面与我们从小缺乏美学教育有关,而更重要的往往是他们并没有真正用心去制作它。
其实,我们可以通过寻找一些优秀的文档示例来学习如何制作优秀的文档,这其实并不困难。知道什么是优秀的,然后像写你的代码一样用心去制作就行了。
4. 尝试多讲
讲话一直是很多程序员的硬伤,当然这也曾是我的硬伤。根据我的经验,你需要跨过以下两个障碍:
- 敢说。
- 让说的和你想的一致。
5.建立社会化联系
一个完全封闭的程序员一定不是一个优秀的程序员。优秀的程序员往往愿意并善于与他人交流,分享自己的经验和想法,并在交流中获得有益的东西。这样做有很多好处:
- 通过这些社会化的活动能够使你的想法和技能更加完善。
- 能够使你建立权威,你的技术博客,在一些社区上的技术问题解答,以及你的开源项目等都会使人认为你是这方面的专家。
- 同样,你也可以获得他人的帮助,来解决棘手的难题。
- 你可以找到与你有相同兴趣的人,一起做有趣的事情。
- 你的社交网络将因此扩大,这意味着你所获得的机会将会更多。
程序员的烦恼
1. 是否还应该留在一线城市
一切都能为你的生活赋予意义,并让你感到更加快乐的话,那你还是应该更坚定地留下,而非选择离开。
2. 小公司做的事情太繁杂了
时常会说“杂事不杂”,虽然看着被很多与技术无关的事务缠身,但它们对你来说同样具有意义。你从中可能获得沟通能力、管理能力、建立更广的人脉,在企业内部建立影响力,等等
3. 创业公司中的危机感
无论成功与否,经历一次完整的创业都将让你受益匪浅。你将学到很多在大公司仅仅做一颗螺丝钉所学不到的东西。虽然在此过程中,你一定会有挫败感、焦虑,但或许坚持一下就会看到曙光。
另外一点我想说的是,创业的过程将让你获得不同的眼光。创业大多是在一个新的领域中进行的,你不应仅仅专注于公司所使用的那些技术,而更需要通过深入理解这个新的领域,去获得不同的视角和眼光,因为它们也会在未来成为你的核心竞争力。
4. 技术单一,想学习更多
我总是很鼓励身边的程序员们去涉猎不同的技术甚至领域,但前提是你必须首先对某一门技术做到精通。技术是需要深耕的,深入学习一门主流的开发技术,并不断提升编程思维,比对很多技术栈都浅尝辄止要好很多。因此,如果精力有限不妨先学好一门技术,你会发现之后再去学习其他技术会变得容易许多,因为它们之间往往都是相通的。
5. 我想自学编程,应该学哪一门语言?
如果你真的没有任何思路,只是希望你学的这门编程语言能够有用,我的建议是JavaScript,因为它看起来是唯一可能在未来所有领域内得到应用的编程语言,从我们的移动设备,到传统的Web应用,再到服务器端开发甚至是硬件编程,它几乎无处不在。
6. 大专学历,能进大公司吗?
全日制本科几乎成了所有内部职位的最低要求,所以学历上的缺失确实会成为你进入大公司的障碍。当然还是有例外的情况:
- 通过内部员工的推荐。
- 通过外包公司进入后,再转为内部员工。
- 努力成为某一领域的专家,或者建立个人影响力。
如果你还是一名大专在读学生,那么我希望你不要过早焦虑,尝试问问自己除了学历之外还有什么让你能够脱颖而出的东西?是否有自己的个人项目?是否为知名的开源项目贡献过代码,甚至只是参与编写文档?是否通过写博客阐述过自己的独到观点,并得到大家的认可?在哪家公司实过?这些都可能抓住雇主的眼球,从而弥补你在学历上的不足。
给年轻程序员的职涯建议
1.尽早确定你想做的事情。
尽早确定自己想做的事情——你的职业目标,意味着你可以获得比其他人更多的时间去努力。
2.一万小时定律
3.提高工作效率。
有以下两点建议:
- 加快工作节奏
- 借助工具完成工作
4.简明的沟通方式
为了让别人更清晰地理解你的意图,我往往会在邮件标题最开始处直接加上“请审核”“需关注”这样的标识;对于邮件的内容,我也会将结论放在邮件的最开头部分,让其他人能在最短的时间内掌握邮件所要传达的主要信息和意图,如果需要进一步的信息,才阅读邮件的剩余部分。
5.PKSS(PK Saturday and Sunday)与持续学习
在周六和周日进行比拼,充分利用业余时间。
除了在你专注的领域投入时间学习之外,尝试学习任何你感兴趣的其他内容,比如,烹饪、写作、摄影,等等。知识往往是相通的,你学得越多便学得越快,对我而言,摄影、写作等技能也都能够对我所从事的软件开发有很好的促进作用。
6.学会控制情绪
如何才能提高自己的情绪控制能力呢?一个简单的方法就是做到对事不对人。当你对某一件事非常气愤时,首先,你需要问问自己发火有没有用,如果答案是否定的,那么为什么不静下心来想想怎样去解决问题呢?
其次,你需要有同理心,多站在对方的角度和立场考虑问题,即我们常说的换位思考,你会发现很多时候对方不是故意为难你和与你作对,而是也有他的考量和存在的现实问题;最后,你也应该有一些自己的情绪宣泄方式,比如,与朋友聊天、练习书法、看电影等,都是不错的释放方式。
7.让最优秀的人围绕在你身边
当你还是一个职场新人的时候,你需要和优秀的人一起打拼,去完成一个又一个的目标。当你的职位不断上升时,你的身边会出现一些阿谀奉承的人,而此时,你更需要那些优秀的伙伴,能够指正你的错误,帮助你朝着正确的方向前进。
8.善于归纳与表达
如果你也是一个性格内向,不善与人交往的职场新人,那么不妨也学学那位咨询师,自己创造机会进行训练,比如每天模拟进行一次讲演,经过一段时间,你会惊讶于自己所取得的突破。
9.掌握英语
10.睡眠是你更强大
没有优秀睡眠的人,看似获得了更多的时间,但其实他们往往会处在更大的压力之下,从而丧失效率。这是一种恶性循环,他们不得不通过其他方式重新激活自己。
后记
文中大部分内容来自《程序员的自我修养》,少数地方有所改动,我觉得作者的意见在当下还是有很大的借鉴意义。国庆节前临时决定做的一个关于程序员群体的成长经验分享,
文章末尾,我还是表达最初的观点,别人的成功帮不了你,有些路还是得自己走,有些坑还是得自己踩。
写代码的精髓无非就是勤动手,眼过千遍不如手过一遍。
我是马拉松程序员,可不止于代码。