8种提升程序猿编程能力的方法+编程思维四个核心:分解、抽象、模式识别和算法

简介: 对于程序员来说,提高自己的编程能力,算是给自己定的职业发展目标之一,不过定一个成为编程大神的目标很容易,具体做起来可能就不是一件简单的事了。首先,既然决定“我要变得更好”,得先知道“更好”是什么样子的。另外,不能“想变得更好”,却没有任何具体可行的措施。

8种提升程序猿编程能力的方法


对于程序员来说,提高自己的编程能力,算是给自己定的职业发展目标之一,不过定一个成为编程大神的目标很容易,具体做起来可能就不是一件简单的事了。首先,既然决定“我要变得更好”,得先知道“更好”是什么样子的。另外,不能“想变得更好”,却没有任何具体可行的措施。


2021042423341119.png


本文分享 8 个成为编程大神的可行经验,供读者参考。


1. 警惕“我了解”,“我知道”的学习态度


比如希望学习C语言,那第一步要意识到自己不懂 C语言,都懂的话,干嘛还学呢?这听起来像是一句废话,但是太多的计算机专业的学生毕业时,都会有一种傲慢的“我最了解”的虚张声势,并且迫切的希望向每一个同事证明这一点。然而又有太多的例子证明,持这种态度的程序员往往在技术上进步的都比较慢,所以,在深入学习中,“我了解它”,“我知道它”的态度会妨碍你学习任何新的东西。


现在想想,一般声称自己“精通xx语言”的都是菜鸟。


2. 不“自我欣赏”


若希望成为程序员大神,得从各个前辈的经验中学习。但是要小心,经验也有可能会让我们重复不良行为和养成不良习惯。我们都遇到过有八年“经验”的程序员……但是他的“经验”是:同一年的经验,重复了八次。为了避免这种情况,需要时刻反省自己做的每件事,问问自己,“我怎样才能使这个更好呢?“


20210424233509961.png


新手程序员会欣赏自己写出的“优美”代码,并且编写出测试用例证明它们是可以正常工作。这一点,似乎很多“有经验”的老手程序员也常这么做。不过,优秀的程序员应该积极寻找自己写的代码中可能错误的地方,写出的各种测试用例的目的也在于查找错误,而不是欣赏自己的代码在自己的测试用例中的完美运行。因为他们知道最终用户会发现程序中的错误和漏洞的。


3. 程序运行起来不是停止,而是开始


的确,程序员的第一步工作应该编写出符合规范的高质量软件,不过一般的程序员一旦把功能实现就会退出,然后继续下一步。一旦“完成”就停止的这种做法,就像是随手拍一张快照,期待它成为一件艺术品。优秀的程序员把功能实现只是开始,还要继续对其精雕细琢,写出稳定性更强,性能更优的程序。


20210424233544645.png


这个过程的一部分就是文章开头提到的“更好”的含义。加快速度有意义吗?是更容易记录?更可重复使用?还是更可靠?答案因每个应用程序而异,但是对待程序的态度却是一致的。


4. 写三次(个人比较看中这点)


一般的程序员编写可以正常工作的软件,优秀的程序员编写工作性能更好的软件。但是工作性能更好的软件通常都不是一次性就能完成的,从某种意义上来说,最好的软件一般都要写三次:

第一次,编写程序证明自己设计的解决方案是可行的,并在此基础上优化设计。

第二次,让程序正常工作了,但是可能还有性能的优化空间,以及可能还存在漏洞。

第三次,让程序不仅正常工作,而且可以高效的,稳定的工作。


20210424233638271.png


一般我们看到优秀的程序项目,都会感觉大神写的代码行云流水,如此优秀,但是大神的优秀程序项目一般也是需要“写三次”的,只是这些工作都隐藏在背后。有些程序员开发程序会停留在第一或第二个版本,这其实是与希望“我要变得更好”的初衷相悖的。


5. 阅读优秀代码


可以说,阅读大神们的优秀代码是提高编程技能最常见,也是最有价值的建议。当阅读别人的代码时,会看到大神是如何解决编程问题的,不过不要只是“看看而已”,想要变得更好,需要问问自己:

要是我遇到相同的问题,我该怎么写这段代码呢?

我学到了什么?我如何将这种技术应用于我的程序?

如何改进此代码?如果这是一个开源项目,而且你有更好的解决方案,那么就去做!

尝试以作者的风格写程序。这样可以让自己从不同角度看待问题,相信是有好处的。

不能只是漫不经心的想这些问题,应该把自己的答案写下来,可以是以个人日志、博客、代码审查等各种形式,就像是向朋友解答一个问题一样,写下并分享自己的分析常常可以帮助自己加深理解。这其实是内省的一部分,可以帮助自己冷静的判断自己的长处和弱点。


20210424233709226.png


不要只是漫不经心地想这些步骤。写下你的答案,无论是在个人日志、博客、代码审查过程中,还是与其他开发人员在社区论坛中。就像向朋友解释一个问题可以帮助你找出解决方案一样,写下并分享你的分析可以帮助你理解为什么你会以一种给定的方式对他人的代码做出反应。这都是我之前提到的内省的一部分,帮助你冷静地判断自己的长处和弱点。


许多开发人员通过查看开源软件或其他软件来“找到答案”,并且很有可能复制和粘贴似乎可以解决类似问题的代码。这样做实际上会使自己成为一个更糟糕的程序员,因为盲目的复制和粘贴缺乏自己的思考,别人的东西永远是别人的东西,变不成自己的。


6. 编写程序不全为了挣钱


在自己为研究某项工具或技术而进行一个新的编程项目时,很可能是不挣钱的,但这不能成为停止学习新技能的理由。首先,学习新技能肯定可以提升自己的能力,这些工具和技术可能在目前的工作中不可用,但会使自己在下一个工作中更具市场竞争力。


20210424233735922.png


无论你是为开源项目做贡献,还是为当地社区组织从事公益性工作,都将获得技术技能和自信。另外,个人项目也可以向未来的雇主证明你是一个自学成才的人,从不停止学习。不要只选择自己十拿九稳的个人项目,在自己的个人项目中失败是可以接受的,这样才能激励自己不断的学习和研究,避免在工作的失败。


7. 不完全忽视他人意见


愿意听取别人的意见,对提升自己的编程技术也有所帮助。当进行一个开源项目时,应该注意从用户,或者其他开发人员那里得到反馈,分析这些反馈常常能够推断出自己的项目中存在的问题(用户反馈的使用体验问题,其他开发人员反馈的技术问题等)。


20210424233756735.png


只有发现自己的不足,才有机会进步,达到让自己变得“更好”的目的。而且在这一过程中,幸运的话还会遇到同领域内的大神,不要浪费像大神学习的机会。


8. 学习的是技术,而不是工具


编程语言、工具和框架总是在不断发展,有的工具或者框架很火,但是可能过段时间就落寞了,已经有太多这样的例子。所以在学习某种工具或者框架时,不应该只停留在工具和框架本身,更应该深入它们了解背后的设计思想和经验这些基础知识,因为基础永远不会过时。


停留在工具和框架表层,会逐渐形成“教条式经验”,而它会阻碍你学习新技术、新框架的能力。另外还有一点要说明的是,我们的确应该深入了解工具和框架,但是自我提高还有一个关键是要知道深入到什么程度,什么时候应该停止。举个最极端的例子,作为程序员,学习某个技术一直深入到 cpu 怎么制作还不停下,就显得太钻牛角尖了。


编程思维


编程思维是什么?


很多人都听过编程思维,但对它了解的却不多,甚至会产生这种误解——编程思维就是编程算法。


其实,编程思维并不是编写程序的技巧,而是一种高效解决问题的思维方式,它是“理解问题——找出路径”的高效思维过程,由分解、模式识别、抽象、算法四个步骤组成。


20210424234303335.png


1、分解


锻炼拆解复杂问题的能力

分解,就是把一个复杂的大问题,拆解成更可执行、更好理解的小步骤。

假如,要为自己全家人做一次出游规划,“全家旅游规划”听起来非常庞大、繁琐,而懂得“分解”的话,就可以把这个大难题分解成几个容易解决的小步骤:确立目的地、安排行程、预定机票和酒店、准备行李清单。


20210424234334811.png


所以,在学习编程的过程中,就是在不断地训练他们把复杂的问题拆解、理顺的过程。这个过程是解决问题的基础,把问题拆解清楚,才有接下来实现的可能。


2、模式识别


发现并整合“重复规律”的能力

模式识别,就是识别不同问题的模式和趋势(共同点)的过程,在我们的经验库里找出类似问题的解决办法,套用解决。识别的模式越多,解决问题的速度也就越快。

例如,如果需要画100只猫,你会怎么办?是找100只猫来临摹还是找出猫的“模式”?

对猫进行模式识别,我们会发现猫有这些共同点:有眼睛、耳朵、尾巴、四条腿……

我们根据这些特点建立起猫的“模式”,按照这个模式就能批量画猫了。不用每次画一个新动物,只需要变换局部特征(例如毛发颜色、尾巴长短)就能轻松解决。


20210424234407314.png


这样看来效率是不是瞬间飙升N倍?

在编程过程中,其实我们一直在进行着这样的训练,当发现一些可重复的步骤,就会把它们整合起来,建立模式;再遇到类似问题时就能让计算机套用此模式,快速解决。


3、抽象


锻炼找出问题本质的能力

抽象,是指聚焦最重要的信息,忽视无用细节。简单来说就是找到问题的本质,过滤掉其他无关紧要的因素。

例如,面前有一套房子,我们看到的是这样的:


20210424234435292.png


但是在建筑师眼中,这套房子可能是这样的:


2021042423444967.png


通过抽象,建筑师过滤掉对他来说无用的因素,找到了房子最重要的信息。

抽象思维,能够让我们在大量信息中抓住关键信息,提高学习效率。


4、算法


锻炼高效解决问题的能力

算法,是一步步解决问题的过程。根据前面对问题的分析与理解,设计每一步的路径方法,解决整个问题。

在具体解决问题的过程中,最关键的是逻辑思维能力和调试纠错能力。![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20210424234531511.gif#pic_center

计算机程序需要很强的逻辑性,逻辑顺畅才能顺利运行。例如,正确代码呈现出的五角星动态图这样的:

                                                     20210424234546906.gif


而只是把其中两行代码交换下顺序,结果就成了这样:


                                                     20210424234615679.gif


所以,我们需要严格遵循编程的规则,把解决问题的步骤转换成计算机能理解的语言。在这个过程中,我们的逻辑思维能力能得到很好地锻炼。

而调试纠错,就是当出现结果与预期不符时,需要找出算法之中的漏洞并解决。

在编程练习中,任何一行代码出问题,程序都会出错无法正常运行下去。这时,就必须要自己一步步执行步骤、梳理逻辑,找出问题并想办法解决。


苹果CEO乔布斯曾说过:“每个人都应该学习编程,因为它教会你如何思考。”编程思维在各个行业都用得到,是未来人工智能时代每个人都应具备的一种思维,先人一步学习编程,快人一步把握未来机遇。


相关文章
|
4月前
|
数据采集 机器学习/深度学习 算法
机器学习方法之决策树算法
决策树算法是一种常用的机器学习方法,可以应用于分类和回归任务。通过递归地将数据集划分为更小的子集,从而形成一棵树状的结构模型。每个内部节点代表一个特征的判断,每个分支代表这个特征的某个取值或范围,每个叶节点则表示预测结果。
145 1
|
2月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
2月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
2月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
22 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
2月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
148 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
3月前
|
机器学习/深度学习 编解码 监控
算法金 | 深度学习图像增强方法总结
**图像增强技术概括** 图像增强聚焦于提升视觉效果和细节,广泛应用于医学、遥感等领域。空间域增强包括直方图均衡化(增强对比度)、对比度拉伸、灰度变换、平滑滤波(均值、中值)和锐化滤波(拉普拉斯、高通)。频率域增强利用傅里叶变换、小波变换,通过高频和低频滤波增强图像特征。现代方法涉及超分辨率重建、深度学习去噪(如CNN、Autoencoder)、图像修复(如GAN)和GANs驱动的多种图像处理任务。
82 14
算法金 | 深度学习图像增强方法总结
|
4月前
|
机器学习/深度学习 算法 数据挖掘
算法金 | K-均值、层次、DBSCAN聚类方法解析
**摘要:** 这篇文章介绍了聚类分析的基本概念和几种主要的聚类算法。聚类是无监督学习中用于发现数据内在结构的技术,常用于市场分析、图像分割等场景。K-均值是一种基于划分的算法,简单高效但易受初始值影响;层次聚类包括凝聚和分裂方式,形成层次结构但计算复杂;DBSCAN基于密度,能处理任意形状的簇,但参数选择敏感。文章还讨论了这些算法的优缺点和适用场景,并提供了相关资源链接和Python实现。
79 9
算法金 | K-均值、层次、DBSCAN聚类方法解析
|
3月前
|
存储 算法 搜索推荐
告别低效编程!Python算法设计与分析中,时间复杂度与空间复杂度的智慧抉择!
【7月更文挑战第22天】在编程中,时间复杂度和空间复杂度是评估算法效率的关键。时间复杂度衡量执行时间随数据量增加的趋势,空间复杂度关注算法所需的内存。在实际应用中,开发者需权衡两者,根据场景选择合适算法,如快速排序(平均O(n log n),最坏O(n^2),空间复杂度O(log n)至O(n))适合大规模数据,而归并排序(稳定O(n log n),空间复杂度O(n))在内存受限或稳定性要求高时更有利。通过优化,如改进基准选择或减少复制,可平衡这两者。理解并智慧地选择算法是提升代码效率的关键。
53 1
|
2月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
3月前
|
并行计算 算法 Python
Dantzig-Wolfe分解算法解释与Python代码示例
Dantzig-Wolfe分解算法解释与Python代码示例
下一篇
无影云桌面