如何成为一名优秀的程序员?
谁不想成为一名优秀的程序员呢?
每年都有超过数十万名计算机专业的毕业生进入社会,据不完全统计,进步最快的阶段在刚参加工作的 1-3 年,同时众多程序员中 3-5 年工作经验的站大多数,很多人在此阶段达到瓶颈期,专业能力停滞不前,所以如何持续进步成为一名优秀的程序员?
回答这个问题很简单,我们只需要找到作为一名优秀的程序员,应该具有哪些特质,然后分析具备这些特质的条件。特质即结果,条件即方法,通过正确的方法得到想要的结果,从而成为一名优秀的程序员。
优秀的程序员具备的特质有很多,这里我向大家分享一个我最看重也是最欣赏的一点特质就是:创造力。
为什么是创造力?
回想一下当你遇到瓶劲期,专业能力停滞不前时的感受:每次写的代码千篇一律、拿手的需求得心应手,不拿手的需求每次都要 Google 一下粘贴复制、即使你写了很多年代码,做了无数的需求,但脑子里的存货还是那些,仅仅是把别人的代码拿来完成需求,并没有把别人的知识变成你的知识。
如果说到了你的痛点,别急,还有。
每次拿到需求都一筹莫展,但有的人却能同时拿出好几套解决方案,听到新的技术名词总是一脸疑惑,而隔壁家的小孩却早已掌握。
当然,这是你的痛点,也是我的痛点。
日常逛 GitHub 是我的习惯,每次看到好玩的开源库,我尝尝在感叹,为什么我写不出这样高质量的代码?为什么想不到这么巧妙的解决方案?
其中之一的原因就是:优秀的人在创造代码,而我只是在粘贴复制代码。
拥有好的创造力也就意味着你拥有不错的解决问题的能力。
如何提高创造力?
拥有创造力是我们的目标,根据前面说的:特质即结果,条件即方法。现在我们就来寻求一下通过哪些方法来提高自己的创造力。
丰富的知识储备
首先巧妙高质量的代码不是凭空蹦出来的,而是需要知识储备的,作为程序员我们每天和各种各样的 API 打交道,你知道哪些 API 可以实现怎样的需求,你做起来就会得心应手,你不知道就会在做的时候一筹莫展,所以我一直认为写代码不是一个拼智商的工作,而是一个拼经验拼知识储备的工作。
拥有丰富的知识储备,需要有获取知识和结构化知识的能力,在这里小跑一下题,同样我们可以把知识储备当成一个小目标,把获取知识和结构化知识视为实现目标的方法,以此类推你可以不断拆解,以此来发现自己已具备哪些特质,需要朝着哪些特质努力,并且找到实现这些特质的条件。
获取知识
获取知识的方法很简单,知识可以分为新知识和旧知识,旧知识就是我们已经了解的,新知识就是随着技术的发展而顺应趋势出现的。可能有同学会问:旧知识为什么还要获取呢?一叶障目明白吧?正因为是旧知识我们很容易会盲目相信自我,如果有错误的理解会一直根深蒂固的留在我们的脑子中,所以旧的知识也要时不时拿出来筛选筛选,查漏补缺。同时在旧的知识上面,我们有一定自己的理解,在遇到相左的情况时,也能更快的分辨出真假。
对于旧的知识,我的方法是去多看不同人实现的代码,需求一样,实现的方式会千差万别,GitHub 是一个非常好满足这一方法的地方,很早就之前就有人和我说过:「永远要写不一样的代码,这样才会进步」。
新知识就简单了,最正确的途径就是官网、官方论坛、官方的 GitHub 仓库等等,一手新内容一定是官方频道最新更新的,不要等着每天就看看一些技术公众号来帮我们介绍新技术,自己动手去了解是最快最直接最正确的方法。
结构化知识
当你拥有很多知识的时候,就需要去掌握组织、结构化知识的能力。很多时候,我们一直在努力学习,看了很多、也实践了很多,但遇到稍微有点变式的问题,就又会一筹莫展,这时你需要把脑子中的知识,组织起来,加强之间的联系,多种知识建立连接,才能在遇到问题的时候组合出不同的解决方案。
我在这方面常用的方法就是,先按最小单元拆分,然后已最小单元为基础进行查漏,看看有没有忽略的地方,然后去尝试通过各种方法去找寻各单元之间的联系。举个例子,在 Android 的官网中,我们可以查到在 Android SDK 中提供执行后台任务的 API 有 4 种:
就像上图所示,4 种每一个都是最小单元,当我都清楚每一个是干什么的、该如何使用之后,就要去找寻这 4 种单元之间的关系,这张图很好的诠释的它们之间的关系,当我理解完这张图之后,以后再遇到类似的需求,就可以很好的拿出合适的解决方案了。
扎实的基础
虽然我们有的在做客户端开发,有的做前端开发、有的在做服务端开发,从大类上划分我们都同属于计算机学科。基础方面我们可以划分为两大类:计算机基础和专业基础。
计算机基础
这方面就是我们老生常谈的一些东西了,例如:数据与数据结构,算法、网络基础、操作系统基础、设计模式等等,掌握这些方面,不仅能夯实我们基础,还能帮助我们在与不同领域的人协作的时候,减少不必要的麻烦降低成本,拓宽我们的技术视野,加强技术栈。
有人肯定会说你说的这些我都知道啊,可是我问你,你真的都懂了吗?问几个简单的问题:
数据和数据机构有什么关系?
数据结构和算法又有什么关系?
哪些是基础数据结构,哪些是高级数据结构?二者之间有什么联系?
欢迎在评论区分享你的看法~
专业基础
这方面就看各自的专业了,除了小白,大多数人都知道自己专业领域中,哪些是基础内容,哪些是高级内容,一切源于基础,高级内容是在基础之上加以扩展优化出来的。小白也许会问了,那我们怎么办啊?我只能说你现在了解、学习、掌握的都是基础...把现有的先吸收整理好,等你成长了,再回头看看。
所以在这方面,我能提供给大家的经验,就是写一份思维导图,划分出自己当前专业下,需要掌握的计算机基础和专业基础有哪些,总结出一份技能图谱,然后查漏补缺。
分享一份我曾经总结的 Android 技能图谱,看似简单,但扩展开其实内容很多。
学习能力
又是一个很常见的话题,我们从幼儿园就开始上学,一直到大学毕业,学习了十几年,但是 ... 你真的会学习吗?
一个完整学习过程的闭环包括三部分:学习、记忆、传授。这里简单和大家分享一下我的理解,如果你对此很有兴趣,可以评论告诉我,我专门写一篇文章像大家分享一下。
学习
同样学习也分为学习新的东西和旧的东西。在学习旧的东西的时候,我们是通过深度联想来学习的,用我们已知的理解来检索式学习,不断过滤我们已有知识概念,将新的理解与之前的理解建立联系加深记忆,这可以看作一个更新补充我们现有知识的过程。学习新的知识的时候,我们是通过字面联想来学习的,因为我们没有旧知识来做检索,所以我们只能通过文字上的理解来学习,这时就需要我们在学习的过程中,提取关键的概念,建立心智模型,同时需要我们拿其他方面已建立的心智模型来辅助我们记忆,这是一个新增的过程。
记忆
从小到大的上学经历,告诉我们要通过记忆来学习,在我看来学习和记忆应该相辅相成。学习是理解的过程,理解之后就自然记忆了,而不是通过死记硬背强行把知识留在我们脑中,到头来我们仅仅记得两个字:学过。最佳的记忆方式是:我们通过已有的知识来理解新的东西,将各个知识建立起联系来加深记忆,从而把新的东西转化成自己的东西。举个通俗的例子,你有一位很要好的朋友,你是如何记住他是你很要好的朋友的?在你的脑海中,不是因为你单单记住了他这个人,而是你一想起他,就想到了你们之间发生的事情,你的这位好朋友就相当于一个记忆点,而你们之前发生的事情,就是建立起来的联系,你们是通过联系而产生的记忆。
传授
这是检验你学习成果的最好方式。当你能正确的把学到的知识教给别人,这才说明你真的学会了,因为从你口中组织语言说出的东西,才是你自己的理解,这不是复述那么简单,复述和传授有着本质的区别,同时当你这篇文章看到这里的时候,我也很期待你的回复,希望你可以告诉我,我写的这些对你来说是否好理解。当你下一次向别人分享东西的时候,可以分析一下自己这段是复述还是传授,当然在你听别人分析的时候,不一定是你理解不够,也可能是说的那个人自己理解不够,导致你很难理解。
最后
说了这么多,我们再看一下开头这个问题:如何成为一名优秀的程序员?
我说了优秀的程序员是具有创造力的,具备创造力的必要条件是具有:丰富的知识储备、扎实的基础、良好的学习能力。
当我们把这些倒过来看,其实正是我们从上学到工作所经历的过程,十几年的学习生涯,无时不刻在锻炼我们的学习能力,上了大学,各种各样的计算机基础课,工作之后我们进入了不同的专业领域,随着工作开始储备我们的知识库。
所以优秀的程序员和我们走过的是同样的路,我们还在原地挣扎是因为我们在这条路上遇到了众多问题还没有解决,而优秀的人也只是先我们一步解决了那些问题,所以大家要努力加油呀!
如果你觉得这篇文章还不错,欢迎分享、转发、点赞、关注、这对我有很大的帮助。
最后的最后,上一篇文章《Android 工程师开发 iOS 是怎样的体验?》发布后,公众号这边还好,在掘金那边,真是键盘横飞,受到了很多冷嘲热讽,好伤心,写这篇文章的缘由是因为我第一次尝试去开发了一款 iOS App,作为 Android 工程师很激动,想通过这篇文章,与同样是参与过两端开发的小伙伴们,交换一下想法,没想到...😂,当然我的 App 也顺利上线啦,分享一张截图给你们:
App 的名字叫 Time Fly,很多人妄图做出翻天覆地的产品,把人性研究到极致,然后悄声无息的偷走你的时间,这款产品的逻辑很简单,以一条时间轴为载体,帮助大家记录每天的日常,当然之后的版本还有很多有趣、异想天开的想法在设计中,希望这款 App 可以帮你找回被偷走的时间。
目前只有 iOS 版本,Android 版本还在计划中,之前调研了一下使用 Kotlin 的跨平台功能来为两端做非 UI 代码的实现,不过这个方案还在考虑中。
在评论区分享你对本篇文章的想法,我会随机抽几位小伙伴送出 Time Fly 的兑换码。
感谢,我们下期再见👋。