最近在看《程序员的自我修养》,作者陈逸鹤,这是一本值得深读的书。前半册较详细的介绍了一个程序员成长所需要经历和学习的内容,从工作、沟通、生活协调等方面给出了不同建议,其中也介绍了一些有用的网站和工具。

前言

最近在看《程序员的自我修养》,作者陈逸鹤,这是一本值得深读的书。前半册较详细的介绍了一个程序员成长所需要经历和学习的内容,从工作、沟通、生活协调等方面给出了不同建议,其中也介绍了一些有用的网站和工具,

而后半册则是关于作者自学设计的经历以及如何教导孩子学习编程,对于我这样的年轻程序员可能暂时没多大兴趣,最后只能匆匆看完,或许以后会有机会再来翻阅一下。

然而即便是前半册,给我的感触也是很大的,同时也该庆幸在我步入社会前能读到一本这么好的书,在此对作者表示由衷的感谢。

如果你是一个职场新人、或像我一样准备步入社会工作的话,那么我推荐你去读一下这本书,这会给你带来很大的帮助。

下面我将总结一下书中对我影响较大的部分内容以及我个人的感想。

正文

第一章 谈职业生涯

一、写给年轻程序员的启示

  1. 正确认识自己

    在网上形容程序员的词汇有很多,其中大部分都略带贬义,然而不管别人如何称呼你,最重要的是你内心如何形容自己,如果连自己都将自己当成一个码农,那你可能就真的是一个码农。这里作者说到他更喜欢用技匠来形容自己,因为程序员应该是那些不断追求更高技术,并有着自己的产品梦想的工匠。一个程序员,应该有自己的目标,自己的期待,并通过不断地努力去实现那些梦想。

  2. 比一般人努力

    这里作者讲述了一个故事:一个普通人每天都很努力,而另一个天才却整天不务正业,过了一段时间,天才终于醒悟并开始努力,不久便超越了普通人,普通人很羡慕他,但他回过头才发现,他也已经成为了大部分人眼中的佼佼者。

    程序员往往会被称为天才,那只是因为在你看不到的时候人家花了更多时间工作或者学习而已,当你也坚持这么做时,你也会变得和他们一样优秀。

  3. 适时建立个人权威

    当你开始抱怨自己的职业生涯毫无起色时,不妨想想你是否已经习惯了听命于人,而缺少自己的观点和主观,久而久之便成为了别人眼中的平庸之人。你应该在适当的时机表现自己,让别人看到你的不同之处。

  4. 遵循最佳实践

    无论新兴技术如何发展,技术的本质是不变的,你应该去理解那些软件领域最本质的东西,比如最佳实践,那些最佳实践是无数优秀程序员通过大量实践总结出来的,通过理解它们,能够让你站在前人的肩膀之上,从而对软件开发本身有更深入的理解和认识。

  5. 保持好奇心并乐于探索新的事物

    优秀的程序员往往不会满足于对手头工作的认识和理解,他们会去理解更深入的东西,也乐于探索那些看似于工作无关的技术,通过对其他事物的学习,也能对你目前的工作有所帮助。

  6. 抛开代码与人沟通

    不要忽视与人的沟通,当你的能力不断提升,被赋予更多职责时,你更需要与人沟通来管理好自己的团队,所以尝试离开你的电脑桌去与人沟通,这会给你的工作和生活带来积极的变化。

  7. 要为优秀的人工作

    当你发现你所处的环境和周围的人已经无法让你获得提升时,那么你应该去选择一个更好的环境,尽可能与那些优秀的人一起工作。

  8. 生活、睡眠、旅行

    我们时常听到关于程序员因疲劳过度而猝死的新闻,这从侧面说明程序员不懂得生活。每个程序员都应该明白,工作、技术、写代码这些并不是你存在的意义,而生活才是,你需要懂得生活,并且学会生活。

    生活:你需要合理规划自己的时间分配(学习、阅读、写代码)并持之以恒地去做。

    睡眠:不要熬夜,充足的睡眠会使你更有效率地投入到新一天的工作,你也会变得更优创造力。

    旅行:旅行不是为了轻松,往往旅行比工作还累,但你还是应该出去走走,去感受新的东西,而这些是无法从电脑屏幕前获得的。

    人生不应该只有工作,还应该去感受更多更美好的东西,有一个爱好,有一项坚持的事情。

  9. 相信自己的天赋和创造力

    每个人都有属于自己的天赋和创造力,但它们绝不是与生俱来,你需要在生活中不断地培养和发掘它们,比如阅读优秀的书籍、记录和收集、尝试动手。

二、那些程序员后知后觉的职涯经验

  1. 你的薪酬与工作量无关

    你的薪酬其实取决于很多因素,技术能力、经验资历、工作量等,但最本质的却是,你对公司是否重要,简单说就是你是否具有不可替代性。所以努力让自己变得越来越重要,相信你的薪资也会随之提升的。

  2. 尽可能持续做一件事

    总是跟随新兴技术或框架,那你很难在某一项技术上达到理想的深度,同样,在一个公司里,如果你总是更换项目,那你也很难提升自己的价值,也不会具有不可替代性。所以你应该追求技术深度和具有完整项目经验。

  3. 唯一不变的就是变化本身

    总所周知,我们使用的技术更新迭代很快。那么我们该如何去应对这些变化呢?你需要培养自己持续学习的能力,当你学的越多,往往就能学的越快,因为知识之间总是存在关联性的。

  4. 你的声誉很重要

    优秀的程序员除了一些常见的良好特征之外,最重要的一点就是严谨。严谨的程序员会非常认真地对待分配自己的任务,这能大大减少工作中的出错率,从而给团队或公司中的其他人留下良好的印象。

  5. 理解沟通的意义

    接到任务时不要着急干活,而应该去尽可能多地与客户沟通,去理解他们真正希望解决的问题,如果我们是这方面的专家,应该有负责去引导他们接受我们更专业的方案或设计

  6. 你的右脑将是你成功的关键

    一个成功的技术人员,除了写代码外,往往还会伴随着其他方面的能力,如编写文档、演讲、说服他人等等,这将成为你与其他水平相当的竞争对手脱颖而出的关键。

  7. 不要轻易说简单或不可能

    不要轻易做出过于绝对的判断,应尽可能去使用科学方法进行有效的表达,这样你提出的观点才能让大家感到信服。

  8. 你不应该总是单打独斗

    不要总是单打独斗,要学会在团队中协作,并尽可能让优秀的人围绕在你身边,这将扩展你的能力范围,让你变得更加强大。

  9. 你的能力显而易见

    程序员的能力来自大量的编码实践,以及持续学习的能力和勤于思考的习惯。任何自作聪明,不懂装懂,以及投机取巧在明眼人看来都只会是东施效颦,显得如此微不足道。

三、如何招到一个靠谱的程序员

  1. 简历看人

    阅读简历永远是面试的第一步,你的简历中不应该包含错别字、文字不通或没有逻辑性,因为如果一个程序员连自己的简历都不愿意去仔细检查并完善的话,很难想象他写出来的代码质量会如何。然后你需要用简练的文字去描述自己,优秀的程序员往往善于归纳,并能够一针见血地发现问题或把一个问题说清楚。

  2. 给面试者10分钟介绍自己最擅长的

    这样做的好处在于,可以很快地发现面试者的亮点,他能否有效地进行沟通,是否适合这个团队。

  3. 基础打牢了吗

    有经验的面试官往往能够通过几个最简单的技术问题,判断出面试者的技术基础是否牢固,这不是为了证明他有多优秀,而是是用来判断他是否是一个合格的程序员。

  4. 技术的深度够了吗

    具备牢固的技术技术,一般可以满足项目中普通程序员的要求了,但如果你需要找的是一个资深的程序员,那么你还需要对面试者的技术深度进行考察。

  5. 选择适合所在企业文化的人

    一个常见的误区是,总是希望能为团队招到技术能力最强的人,而忽略了他是否与整个公司和团队的文化相匹配。这往往会造成不久后因为理念不同而不欢而散的结果。因此,在招聘程序员时,选择合适的往往比选择最优秀的更重要。

  6. 行为面试法

    一个程序员是否能够很好地工作,不仅取决于他能否顺利完成开发任务,更重要的是在遇到一些特殊场景或问题时,他能否合理有效地处理和解决。因为程序员除了技术能力外,最应该具备的就是较强的独立解决问题的能力。

  7. 给他们一个虚拟任务

    给面试者一个虚拟的任务,你能够看到很多细节,比如,面试者是否有良好的编码习惯,异常处理是否规范,代码逻辑是否缜密高效,以及他的开发效率是否足够高。

四、每个程序员都应该了解的一件事

  1. 读与技术无关的书

    例如读一些,历史、经济、人文、艺术类的书籍,它们都能够帮助你丰富自己的知识和思想,使你变得更加全面和完善。

  2. 会写文档

    当代码实现了它的功能之后,就很少有人会再去看它。但文档被阅读的概率就会大很多,优秀的文档能够让人们对你产生信任和好感,相反,质量差的文档则会使你的声誉受损。

  3. 学会包装

    包装并不是一件坏事,通过包装自己可以非常有效的自我营销,包装之前我们需要知道什么是优秀的,然后精心制作。

  4. 尝试多讲

    程序员的性格特点大多是内敛含蓄的,在一些正式的场合他们会显得对自己缺乏信心,这需要通过平时多锻炼来克服,比如可以在一些不那么重要的会议上去有意识地锻炼讲话,另外你还需要注意你讲的意思一定与你内心所想表达的是一致的。

  5. 建立社会化联系

    一个完全封闭的程序员一定不是一个优秀的程序员。优秀的程序员往往愿意并善于与他人交流,分享自己的经验和想法,并在交流中获得有益的东西。

五、程序员的烦恼

  1. 是否还应该留在一线城市

    对于这个问题,我是无法给出正确答案的。买房本身并不会给你带来持久的快乐,因为当你买完房后,你会欠一大笔债,需要用几十年才能还清;当你终于把欠款还清时,你又会觉得这套房子太小,已经不够一家人住,需要换一套更大的房子。你不会得到快乐,因为这些客观条件(钱财、房子)总是无法与你的主观期望相符。相反地,如果买房能够给你的家庭带来更稳定的生活,为孩子提供更好的成长环境,而这一切都能为你的生活赋予意义,并让你感到更加快乐的话,那你还是应该更坚定地留下,而非选择离开。

  2. 小公司做的事情太繁杂

    在小型公司工作经常需要处理各种各样与开发无关的事情,这让他们无法专心专研技术。然而你却可以从中获得沟通能力、管理能力、建立更广的人脉、建立影响力,况且小事杂事更能体现你的能力,想站得越高,越需要具备解决各种繁杂问题的能力。

  3. 创业公司中的危机感

    如果你所在的创业公司长时间没有起色的时候,你可能会想着换一份工作,但参与创业的过程对你来说仍会是一份宝贵的经历,是你应该加倍珍惜的,无论成功与否,经历一次完整的创业都会让你受益匪浅,你将学到很多在大公司仅仅做一颗螺丝钉所学不到的东西。

  4. 技术单一,想学习更多

    程序员很应该去涉猎不通的技术甚至领域,但前提是你必须首先在某一门技术中扎得很深,技术是需要深耕的,深入学习一门主流的开发技术,并不断提升编程思维,比对很多技术栈都浅尝辄止要好很多,甚至当你学好一门技术后再去学习其他技术后你会发现会变得容易许多,因为它们之间往往都是相通的。

  5. 我想自学编程,应该学习哪一门语言

    每一种编程语言都有它特定的目标和应用场景,你应该要有一个方向并选择适合的编程语言,但如果你真的没有任何思路,只是希望你学的这门编程语言能够有用,那么我推荐你学习JavaScript,因为它看起来是唯一可能在未来所有领域内得到应用的编程语言,从我们的移动设备,到传统的Web应用,再到服务端开发甚至硬件编程,它几乎无处不在。

  6. 大专学历,能进大公司吗?

    目前所有大公司都以全日制本科学历作为最低要求,所以学历上的缺失缺失会成为你进入大公司的障碍。但也有一些例外情况:

    • 通过内部员工的推荐。
    • 通过外包公司进入后,再转为内部员工。
    • 努力成为某一领域的专家,或者建立个人影响力。
  7. 非计算机专业学生,未来想从事软件开发

    事实上,非计算机相关专业的学生很难与科班出生的应届生竞争,你应该慎重考虑自己是否真的有兴趣从事这一行业,而不是只是单纯为了高薪,因为没有足够的兴趣你将很难学好编程,而如果你已认清自己的方向,那么你应该努力学好一门编程语言,然后尽可能地做出一些实际的项目。

  8. 总是熬夜,睡眠不足

    不要熬夜,通过牺牲睡眠来获得一两个小时的时间,到头来只会是恶性循环,得不偿失。合理安排时间,提升效率,保证有充足的睡眠,这将更有效率地投入到第二天的工作中。

六、提给年轻程序员的职涯建议

  1. 尽早确定你想做的事情

    那些成功的人,往往是有着坚定目标,并持续努力的人。

  2. 10000小时定律

    无论你在哪个领域,只要能坚持为同一目标持续不断地努力,花费超过10000小时进行练习和钻研,那么你也一定能够成为该领域的杰出人才,并成为他人眼中的异类。

  3. 提高工作效率

    对于提高工作效率,有两个建议:尝试不断加快自己的工作节奏,善于寻找或创造可以提高你工作效率(也可以是减少重复工作)的工具。

  4. 简明的沟通方式

    尝试使用更简明的沟通方式,这不仅能使自己的工作更清晰,也能显著提高你与他人的沟通效率。

  5. PKSS与持续学习

    PKSS也就是说在业余的时间进行比拼,如果你把每天的碎片时间拿来进行学习,持续一段时间,你将比大多数人优秀。

  6. 学会情绪控制

    如果提高自己的情绪控制能力,一个简单的方法就是对事不对人。当你对某一件事非常气愤时,首先,你需要问问自己发火有没有用,如果答案是否定的,那么为什么不静下心来想想怎样去解决问题呢?其次,你需要换位思考,你会发现很多时候对方不是故意为难你,而是也有他的考量和存在的现实问题。

  7. 让最优秀的人围绕在你身边

    世界上大多优秀的作品,都是由很多非常优秀的人共同创造的,所以你需要和优秀的人结伴,他们能够指出你的错误,帮助你朝着正确的方向前进。

  8. 善于归纳和表达

    很多情况需要你去汇报或发表,这时归纳与表达能力将显得非常重要,如果你不善言辞,你可以创造机会来进行训练,比如每天模拟进行一次讲演,经过一段时间,你会惊讶于自己所取得的突破。

  9. 掌握英语

    英语能力对于程序员来说非常重要,所以你非常应该学习英语(这也是本人的痛点)。

第二章 谈实践与认知

一、突破程序员思维

  1. 什么是程序员思维

    程序员思维是一种常人的思维+编程思维,在长期相互作用下产生的一种思维模式。它能够帮助程序员快速找到以程序方式解决现实问题的最优解。

    对于有助于提升程序员思维的几点建议:

    • 长期不间断地编程实践。
    • 持续学习与借鉴(参考)。
    • 学会反思,并像专家一样思考。
  2. 为什么要突破程序员思维

    既然程序员思维对我们如此重要,那么我们为什么要突破它呢?有以下一些原因:

    • 新一代程序员不仅需要具备很强的编程能力,还需具备从设计、运营、测试等各种不同角度去进行分析和判断的能力。
    • 当你从程序员转变为高级程序员、架构师等更高的职位时,需要你突破程序员思维,从更加人性化的角度去识别和解决问题。
    • 突破程序员思维对你的生活也有帮助,多数程序员随着编程时间的增加,他们会变得不善与人沟通、甚至排斥与人交流,这使他们无法扮演好自己在生活中的角色。

    程序员思维是一把双刃剑,它既能帮助程序员写出优秀的代码,也能会阻碍程序员们的发展,成为进阶路上过不去的一道坎。

  3. 如何突破程序员思维

    突破程序员的几种方法:

    • 透过技术发现问题的本质:

      思考问题出现的原因,采用真正能解决问题的手段,而不是一味使用技术解决。

    • 像专家一样给出意见:

      沟通需求时,去理解用户所提出需求背后的真正原因,并像专家一样给出最优方案。

    • 杂学并从中获得不同的视角:

      要做到以上两点其实并不简单,这不仅需要你具备极强的技术功底,更需要你对问题所涉及的相关领域有足够的认识。你必须通过大量地学习编程之外的各种知识来完善自己的知识体系,并从中获得不同的视角。

    • 找回创造力:

      不可否认的是,目前的开发工作需要我们的创造力的情况并不多了,但我们仍需要创造力。关于如果找回创造力,有很多方法,关键在于你是否愿意坚持那样去做,比如:每天阅读、记录下那些转瞬即逝的想法。

十、我似乎理解了编程的意义

  1. 编程是一项技能

    在初学时,我们热爱编程技术,我们需要不断编程去提升技术,此时,编程的意义在于技术本身。

  2. 编程是去解决问题

    在工作时,需要利用编程去解决一些问题,此时,编程的意义就不再局限于技术本身,而成了解决问题的理想工具。

  3. 编程是在表达,也是在创作

    在进阶时,仿佛感受不到那些技术上的牵绊,开始自如地运用编程来实现那些你认为优秀的东西,此时,你是在通过编程进行着自我表达与创作。

  4. 编程是为了留下痕迹

    在退休时,可能你以前写的优秀代码现在还运行在世界上的某个系统,支撑着一些人日常生活使用的工具。这些优秀代码是你留下的痕迹。

第三章 谈个人发展

一、那些优秀程序员身上的共同特质

  1. 至少深入理解一门编程语言

    优秀的程序员不仅熟练的掌握一门编程语言的语法和语义,他们还会:

    • 掌握这门语言的使用哲学:包括最佳实践、设计模式以及它们背后所蕴含的原则。
    • 深入理解语言的特性:充分了解这些特性,能够帮助程序员更准确、高效地使用它们。
    • 了解语言的局限:了解这些局限,并知道如何使用一些方法或技巧去绕过这些限制并解决问题。
    • 理解语言的缺陷:了解这些缺陷,并尽可能在编程中避免涉及这些缺陷,会让你的程序在日后更易于维护。
    • 了解语言的未来:了解语言的发展未来,才能让你更有信心地去应对未来。
  2. 看上去有点傻

    这因为程序员有点“傻”——知道自己不够强大,反而能使他们变得更加强大,他们一般:

    • 不会停止学习的脚步
    • 使得他们在工作中变得更加严谨
    • 帮助他们获得更好的想法
  3. 他们都是现实主义者

    那些成熟的程序员更加现实,他们关注于如何高效地解决问题,并在此基础上给用户带来好的感受。

    • 懂得平衡:他们理解时间、人力资源有限,所以他们会选择最简明有效的方法去实现需求或解决问题。
    • 完成即是价值:与其进行飘无虚渺的设想,倒不如尝试用较小的代价先实现出某一个功能或产品,然后通过实际使用去证明它,继而在反复的迭代中不断完善。
    • 尊重流程:他们尊重这些流程,但在某些时候他们也会对流程中阻碍自己效率的部分做适当的裁剪。
    • 都很现实:这使得他们在不同的环境、团队、项目中都能快速获得成功。
  4. 从自己的失败中学习

    如果你希望变得更加优秀,那你必须具备直面失败的勇气,并学会从每一次失败中获得进步。

  5. 很懒却很高效

    优秀的程序员非常珍视自己的时间,他们会利用一切手段提高效率,主要体现在:

    • 熟练操作键盘
    • 熟练使用各种开发工具
    • 善于使用或发明工具
  6. 善于发现并改造轮子

    • 善于搜索
    • 善于提问
  7. 并行工作,有效利用时间

    优秀的程序员能将所有的可支配的时间碎片化,利用这些时间片段,他们阅读、学习、开发、做个人项目。他们并不比任何人有更多的时间,他们只是更会利用时间。

  8. 具备不错的软技能

    优秀的程序员往往具备:

    • 一定的语言表达能力
    • 学会聆听
    • 有足够的信心成为一个领导者
    • 指导他人的能力
    • 持续学习的能力
    • 谦逊的态度
    • 尊重每一个人
    • 敢于承担责任

六、建立自己的个人品牌

  1. 如何建立个人品牌
    • 起一个好名字:提高你的标示性。
    • 打造一个个人网站:能方便的找到你。
    • 写技术博客:能让更多人认识你。
    • 开源自己的业余项目:获得追随者。
    • 参与知名的开源项目:在将关领域成为专家,提升个人品牌。
    • 参与更多线下活动:可以认识更多技术大牛、行业专家。

后记

读一本好书,能让你激起很多共鸣。读一个知识阅历比你丰富的人写的书,能让你少走很多弯路。