本文首发于:行者AI
“形而上者谓之道,形而下者谓之器。”
这句话是笔者在拜读《计算机心智:操作系统之哲学原理》时看到的,结合以前师傅的教导,感触良多。授人以鱼不如授人以渔,我愿和大家分享自己学习到的思维模式。
笔者是一名励志成为卓越程序员的前端开发工程师,因为不喜欢把自己限制在前端开发中,所以在这里和大家讨论如何成长为高级工程师。
按照德雷福斯模型,技术人员可以分为五级:
- 新手:只能按照指令一步步地走。新手没有接触过当前行业,所以只能按照指令一步步地走完过程。
- 初级:能够完成局部工作。只需给出局部工作的目标而非指令,初级便可达成这一目标,但初级没有形成全局概念,不知道自己所做的内容在全局所占据的份量有多重。
- 中级:能够完成全局工作。这一层面的技术人员对一个领域的各方面都有所了解。他可以在给定目标的情况下独立完成项目,可以带人,不会频繁求助高级。
- 高级:具备主动性,能够根据环境纠正自己的目标和手段。高级能够站在一个中立的层面考虑什么应该做,什么不应该做,怎么做代价最小,需要权衡付出与收益。
- 专家:凭直觉工作,每击必中要害。在长期的解决问题过程中,专家形成了丰富的经验积累,可以快速抓住问题的关键点。
可以看出,解决问题的能力是决定技术人员级别的根本。你能解决别人所不能解决的问题,你在团队的分量自然更重。而解决问题的能力是自己在学习工作中不断培养的,是不断解决自己的问题,亦或是帮助别人解决问题以后,不断复盘、归纳总结出来的一套思维模式。
在此之前,我想先和大家讨论学习方法。
以前我刚接触前端开发,在实验室老师指导下,拜读《JavaScript权威指南》,学习了Js底层知识。私认为自己基础不错,开始研究当时盛行的JQuery框架,不曾想处处碰壁,强行看完一篇JQuery框架源码系列文章之后,不仅没感觉到任何技术提升,还让我更加怀疑自己。也是在这个时候,认识了我的师傅,在师傅指导下,掌握了一套通用的学习方法:螺旋上升迭代学习法。
螺旋上升迭代学习法:该方法与敏捷开发的思想有点类似:具体是通过看书系统学习理论知识并运用到开发中,在实践中加深理论的认识,发现新的问题;再针对性地复习相关理论知识,解决发现的问题,形成一个迭代上升的循环,并且每一轮的起点都比上一轮高。在学习任何知识,尤其是在掌握面向对象思想、设计模式、重构思想、代码设计、抽象封装思维等抽象性的理论知识时,此种方法效果尤为显著。每次解决问题都需要自己主动思考,解决完问题以后会带来巨大的成就感,以此来保持对学习的乐趣。
具体实践是通过写H5小游戏,从中提炼2D游戏引擎。在这个过程中学习抽象思想,并通过不断地迭代实践,熟练掌握此学习方法。为了更好地掌握抽象思想,《冒号课堂》我看了四遍。此后,我发现学习生活中各种技能都能够使用此种方法做到触类旁通,在不熟悉的领域也能比大多数人做的更好。
在这个过程中,我开始在师傅指导下使用前端类型化语言TypeScript和vim指令,尤其是vim配合vscode的快捷键,编程如同钢琴演奏一般美妙。这些工具的使用改变了我的编程方式以及思考模式,抛开工具,人与人之间的差距是不大的。
多年以来,我不断探索世界。但直到我看了《刻意练习:如何从新手到大师》这本书,才了解到我所掌握的学习方法原来很久以前就被人提出:刻意训练的本质是长时工作记忆,这种能力可以通过一定的训练进行激活,通过不断增加难度的重复训练,在每次训练中收到反馈,不断纠正自己的错误,不断提升大脑的适应能力。这个训练是历经痛苦的过程,每次当你适应这种痛苦以后,你的能力也就得到提升。
接着我们来聊聊计算机理论基础的重要性。
在计算机科学里,可以分为两个维度:工程和科研。“工程”中最核心的知识包括:数据结构、体系结构、架构设计;“科研”中最核心的知识包括:算法、数学基础、快速阅读论文的能力、将理论经过简化后应用到工程中的能力。所谓万变不离其宗,掌握了计算机核心的底层原理以及思想,具备了抽象设计的思维,这样不管你学习哪种语言都能快速抓住其本质。
彼时,我毕业进入一家创业公司,当我技术水平达到能够独立完成前端项目,并保证各种前端优化都已经尽善尽美的时候,我开始思考如何成为一名合格的程序员。在看了知乎很多博主的文章以后,我启动了补充计算机理论基础的计划。在创业公司的半年时间里,我每天早上和晚上都在学习数据结构和算法,并在LeetCode上做题,只有下午才写公司业务代码。也正是因为熟练使用vim指令让我的编程速度提高了2-3倍,才能在当时的环境下完成此次计划。
最开始的时候,我写递归算法题需要一整个上午的时间,有时候理不清楚,需要在纸上写下每一步执行结果,逐步剖析才能理解当前执行到哪一步。历经半年,看了数据结构、算法、计算机网络、Webkit内核、操作系统相关书籍,刷了158道题,我终是达成了目标。在经历这次技术洗礼以后,我感觉非常踏实,思维方式得到很大改变,常常深入思考程序的更优解决方案。
随后我离开创业公司,和师傅一起创业。师傅对代码有极高的追求,在他严格的CodeReview下,我了解到高级程序员的重要技能:如何写出让别人易读的代码以及如何保证你的代码质量,可以归为工程化思想。通过学习《计算机程序的解释与构造》《重构-改善既有代码设计》和《代码整洁之道》三本书以及和师傅不断争论,我们的编程风格越来越相近,每次CodeReview的重构点也从最开始的50多个逐步减少。
现在我们来聊聊如何成长为高级程序员。
从初级到中级过程中,我们需要掌握一套高效的学习方法,你可以学习任何一门语言,深入了解其运行机制,然后学习计算机理论基础:数据结构、算法、计算机网络、操作系统。其中,操作系统和计算机网络不是必要的,但是学习这些知识可以让你认识到计算机底层执行原理,开阔视野。
从中级到高级过程中,需要看到问题和技术的本质,善于思辩、独立思考,思维方式需要从被动完成任务转变为主动解决问题。前面提到,只有不断解决问题,在解决问题的过程中弥补相关知识,寻找更好的解决方案,并不断复盘、总结,才能提高你解决问题的能力。所以,如果中级在主动性没有根本性的改变,中级就会留在原地,如果有了转变,就能够有着越来越多的机会提升自己,进而与中级拉开距离。
高级程序员重视工具的使用,更愿意花时间去研究新的工具、新的手段让解决问题的方式变得更加简单,从而提高自己的生产能力。最重要的是,工具也包含了扩展思维能力的思维模式,这种思维模式让你总是为同一类型的问题寻找更好的解决方案。
高级程序员不会轻视任何一个项目,每次项目都是表达自我的机会。需求不清晰,没有关系,我可以通过沟通来将需求弄清楚,这样可以锻炼沟通能力;框架有问题,没有关系,我可以修改源码来让框架更适合当前项目,这样可以锻炼我的源码阅读能力;以前老代码很乱,没有关系,我可以通过重构思想来简化项目,这样可以锻炼我的抽象能力;无论是用户体验还是代码格式都需要做好,这才是高级程序员表达自己的方式。
以上都只是高级程序员所应该具备的硬实力,这些年我开始学习软实力,包括产品思维和领导能力。
- 产品思维:能够充当半个产品经理,站在产品的层面思考问题、设计程序。能够与产品、质量部门出色的完成沟通。
- 优秀的领导能力:能够凝结团队力量,获得团队的肯定与支持,确定技术方向。领导能力并不是说你一定是经理或者老板,而是在团队中大家认可你的技术实力以及为人,自然而然地愿意听你指挥。
我始终相信越努力越幸运,期待自己能够在30岁以前进阶成为一名高级工程师。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。