决定学编程能否成功的三大难关(编程水平真的是一个量变到质变的过程吗)
以下文章来源于 公众号【腾讯技术】,作者是:爱编程的
鹅厂内部,有一个关于“编程水平提升”的帖子,题主是这样写的:
我是非计算机专业出身,近一年来,发现开发相关的工作越来越多。虽然能勉强应付,但是特别害怕别人看我的代码,觉得自己的代码写得很糟糕。
我试图去请教前辈,怎么才能提高编码水平,前辈说多写。但是我感觉多写就一直在重复那个勉强应付的if else过程,体力搬砖,并没有什么进步。前辈说:量变才能达到质变。
请问大家有好的经验可以借鉴么?多写真的会量变到质变么?这个量变的过程大概需要多久?
关于这个问题,我们来听听鹅厂程序员们的经验:
01有效努力是量变引起质变的前提
@Jianfei.
说下个人的理解,量变到质变的前提是:做出的是有效的努力。那么什么是有效努力呢?
- 无效的努力:一年的经验努力用了十年
- 有效的努力:遇到问题问5个以上why、深度思考、不停学习、不断突破舒适区的边界
只有做出了有效的努力,才能积累知识的深度和广度,当广度和深度达到一定程度的时候,就会发生所谓的质变,质变是什么样的状态呢?
- 学习新知识会很快,很多东西一看就知道技术的本质是什么样子
- 遇到问题可以一眼看到问题的本质
那具体怎么做出有效的努力呢?给几个小建议:
- 遇到需求不要着急写代码:一定要想明白为什么要写这个代码,这个代码到底要解决什么问题,这个需求的实现方案有几种?最佳方案是哪个? 怎么能优雅的来实现?脑子里能彻底想明白了这些问题,写代码只不过是分分钟的事情。
- 遇到问题不要慌:解决问题的关键是先找到到底是谁的问题,“根因”是什么,如果不能很清晰的答上来,那就说明并没有掌握,这时候就去查资料、学习。直到吃透为止。
- 从点开始扩展成面:当你负责的是大系统里很小的一个点时,一定要先从各种渠道去学习和理解这个系统整体,去深入理解你的上下游的架构和原理,不断扩展,进而理解整体架构
总结起来,以下三点:
- 保持好奇心:对不懂的东西保持好奇心,并且有决心去理解和攻克
- 持之以恒:技术本身是比较枯燥的,但是解决问题的时候成就感是很好的,一直保持下去
- 一切都是思维:一定要学会深度思考,不要只顾埋头干活儿,所有的问题,如果你有清晰的思路都不是问题
@Howard.
这事我觉得吧,量变到质变是有的,但单纯重复简单代码是不可能质变的。我自己水平也就一般般,班门弄斧说两句,希望能抛砖引玉。
其实计算机专业的大学课程就已经指出大概的学习方向了:
1. 一般大一学C语言,大概掌握面向过程的程序设计思路。大多数非科班工科专业的计算机课程基本都停留在这阶段,无论用多少年MATLAB也不会改观(我用了8年matlab,我现在天天黑)。大多数脚本语言也都是这样,按照顺序把思路写下来,让计算机一步一步执行。
2. 理解OOP(面向对象编程)是水平提升的一大飞跃。掌握继承、多态、封装之后是一个aha moment,原来代码还能这么写,真牛X!现在大多数的大型系统基本都是基于OOP思想设计的,OOP是你掌握编程和控制系统复杂度的一个利器。
3. 学会算法与数据结构,也是代码提升的一大步。当你像洋葱一样拨开数据结构的层层外壳时,你对编程的理解就进入了一个新的阶段。什么时候用链表、什么时候用顺序表、什么时候用图、什么时候用树。什么是B数、B 树、红黑树?为什么数据库要用B 树,为什么有些场景要用红黑树。
4. 学会操作系统原理,也是代码提升的一大步。当程序设计到一定阶段,想要继续提升和优化,你就必须要深挖程序所在的平台 - 操作系统了。明白操作系统底层的运作机理,你才会明白,如何调度程序能够让代码更高效,如何并行、如何多进程,如何多线程。
5. 当然再往下深挖编译器和计算机组成原理(压榨CPU性能、压榨GPU性能等),依然有很大的代码提升空间,但对大多数人用处不大了。一般都是交给专业人员来深入优化。
02量变引起质变,需要找准标准 刻意练习
@Zale.
个人深知自己能力及知识都存在很大局限性,仅尝试分享同为非计算专业毕业生当前认知中的理解,如有不同见解欢迎沟通和补充。
【结论】
1、量变不一定会引起质变,而1万小时 刻意练习能极大程度上促进质变的形成PS:为方便梳理,下面主要将量变等价于1万小时,质变等价为领域专家,质变的尝试界定详见基础知识的PS2。
2、无论如何,不要因为现在忙而放下学习和成长,视野和能力的提升会帮助你更好、更高效的解决问题。
【基础知识】
一、量变与质变
一万小时定律起源于《异类》,指“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力”,并提出1万小时是任何人从平凡变成世界级大师的必要条件(注意,只是必要条件)。
《刻意练习》对一万小时定律进行了补充,即1万小时 刻意练习能帮你更大概率的达到专家水平(注意,会极大程度上促进你成为专家的概率)新增的刻意练习主要是指通过不断重复,将学习区的内容拉取舒适区,主要涉及以下内容:
0、找准标准:有合理发展的领域或行业、能引导你的导师。主要作用是明确标准,从而引领你刻意练习的方向。
1、大量重复的训练:从不会到会,秘诀就是重复。在熟悉之后就跨越舒适区,不断再将学习区中高难度的事件重复并尝试将其纳入舒适区。
2、持续获得有效的反馈:反思、总结、改进
3、精神高度集中:独立思考和独立练习(可引申至深度工作)总结一下核心就是:直面问题,明确标准,独立思考,持续行动,不断走出舒适区。
PS1:遇到恐慌区的事情怎么办?
计算机领域中有两个重要概念分解和等价,遇到恐慌区的事务,将其分解为多个学习区和舒适区内容的总和,保证整体等价,即A(做不了)= B(可以做) C(可以做) D(可以做) ... Z(可以做)。
PS2:如何界定质变/专家?
这里的界定可能比较模糊,每个人心中的标准可能不太一致。但你既然提出了这个问题,更大概率是跟高水平框架设计、优雅的实现及公司/业界的专家相挂钩。如果是指这些,他们在领域专业程度和贡献上都会有比较高的积累,也许我们短期很难达到。
可以尝试换个角度思考,一方面,我们可以通过学习逐步成为领域内的组内专家、部门专家、公司专家、业界专家;另一方面,我们可以将看问题的视角从外部转向内部,减少外界身份或标签的界定,更多地关注自身的每一次成长,关注每一次实现是否能有更好的解决方案,关注技术所产生的价值和成就感。这样会让我们更快乐、更快速的成长,更大概率的触发专家的质变。
二、稀缺与体系化
稀缺在《稀缺:我们是如何陷入贫穷和忙碌的》中定义为:“拥有”少于“需要”的感觉:
书中结论一:稀缺容易触发管窥
书中结论二:稀缺会进一步延续并加剧稀缺
优化方案:跳出当前"管窥"场景和视野,站在更长远的角度去思考问题。
管窥:专注于某一件事物就意味着我们会忽略其他事物,也叫“隧道视野”。就像视野被局限在一个管子中,那些存在于“管子”视野之外的事务就被抑制了。为什么忽然会提到稀缺?是希望能对提问中“开发工作逻辑简单、很多东西不懂”这里有所帮助。
在完成需求的情况下,你可以跳出你原本的开发内容,去自由的了解更多你想知道的东西。
可以感受到你希望自己能够快速成长的心情,那可以站在让自己快速成长的角度,更体系化、更全面的去了解技术、项目甚至领域,这对你的未来工作和发展也会很有帮助。比如去了解文章中描述的配置、存放目录甚至是项目技术选型、框架设计等等内容,当然这需要你主动花费时间。
【回到编程领域】
一、找准标准:从整体到局部
- 了解学科发展:计算机行业已经发展几十年,各个领域都有自身的体系架构,可以参考学习。PS:能让我们更清楚的了解到自己所在的领域历史发展,当前处于什么阶段,当前需要什么,以后会要往哪个方向发展,我们需要做什么准备。
- 站在巨人的肩膀上:领域经典书籍、领域前沿技术、领域成熟开源项目的代码都有非常大的参考学习价值的。PS:能帮助我们完善领域知识体系、框架设计、代码风格等很多内容。
- 基础知识:语言、数据结构、算法、设计模式、操作系统、计算机组成原理PS:能让我们在遇到问题的时候,了解有哪些方法可用,如何更便捷、更高效,更普适实现。
- 个人实际编程:技术是由场景和需求推动的,在自己所处的领域、场景和需求中尝试做到最好。PS:能让我们将上述学习到的所有内容进行实际的落地和尝试。
二、刻意练习:从局部到整体
- 优化原有代码:自己写的代码能否尝试优化,抽象,封装,甚至开源协同推广给其他人。
- 业务需求:新的业务需求是否有用更优的方案实现,是否可以花更多时间去仔细研究。
- 开源协同:参与到内外部开源协同中,接触更多的优秀代码,接触更多的业务场景和需求,详情可见技术图谱。
- 不断成长:不断稳固基础,不断在上述3项中成长,不断吸取领域前沿知识并反思落地,相关成长还可以分享到技术论坛。
03编程水平的提升是解决问题能力的提升
@Liquan.
楼主提问的真实内涵是为了提高自己的编程水平,那大多数人都会建议多写一写代码,量变才会有质变。这里就要看看“量”变的量到底是代码量的积累还是其他,这里结合自身的一些经验谈谈:编程水平的提升,不仅仅是代码量的提升,归根结底是解决问题的综合能力的提升。
分享一下我大学的编程故事:
大学的时候参与过一些软件开发项目(C语言、网络协议实现),当时是一行代码10块钱(大括号也算一行),也就是说,像一般的学生来做,写个1-2千行代码,其实创造的收入也会有几万块,现在想想依然还是会兴奋的搓搓小手,当然前提是代码质量和功能均能够通过评审;
当时因为是和传统软件厂商合作,所以项目都是严格的遵守项目流程的,采用的流程是V模型,大概会经历这几个阶段:
在这个流程下,前期的需求分析,概要设计和详细设计大概会占到2个多月,后期的单元测试,集成测试等也会占到2个多月,实际代码开发的时间一般不到1个月,所以真正编码的时间可能仅占整个项目的不到20%左右的时间。
项目前期的需求分析、拆解以及概要设计一般是项目经理(公司的资深经理)带着几个项目骨干完成,详细的流程图、设计图和文档等,作为菜鸟一般就继续结合相关业务知识完成详细设计和编码,以及后面的功能验收等;所以说编程能力仅仅是编码实现吗?至少从这个流程中看,对业务知识的理解、详细的设计等系统性的思考会比编码占据多的多的时间。
所以编程水平绝不仅仅只是把代码写好了,它是一个系统工程,归根结底还是高质量、高效地解决实际业务问题。
编程水平的提升过程,在我看来应该是这样一个过程:
1、能够把简单的业务需求转变成代码逻辑,并能够高效的完成;2、针对小型的项目能够将业务的实际问题拆解成详细的需求,能够完成整体方案的设计和选型;3、再往上就是能够完成较大项目的设计,能够设计多种方案,并且明白所有方案的优缺点以及当前业界方案的优缺点来选择最优,能够根据实际问题突破关键性难点,取得原创性的成果,最终达到系统的最优。
所以对于我们来说一般做到第1.2 层面也许就够了,可以:
1、多写代码,多总结思考,参考编程规范,写出高质量的代码
2、将一些常用模块抽象成库,尽量的复用已有模块;
3、熟悉常见的一些设计模式,并基于此解决项目中实际的问题;
4、了解业界同行在相同项目上的方案,并知道优缺点。
-END-
敬请大家星标关注公众号《朱老师IT充电站》。
每天了解一些新技术,每天辩一些真道理!
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com