自学内容网 自学内容网

从认知角度分析编程为什么难

前言

        为什么写这篇文章?不是因为自己已经掌握了很多,正是因为掌握的不够多且想要掌握更多才停下来总结自己的痛点,从认知角度进行分析,不会详述具体的编程知识。如果可以的话,请过来人就此主题不吝赐教,不断进步才能积累底气。

1.为什么觉得编程难?

1.1思维突破

        一提到编程,很多人都会皱起眉头,觉得这是一门高深莫测的学问。编程之所以难,很多时候并不是因为它本身有多复杂,而是因为我们的思维方式和编程所需要的思维方式存在很大的差异。

        我们从小接受的教育,大多数都是要求我们记忆各种定律、公式,然后通过大量的练习来掌握它们。这种教育方式让我们习惯于从细节入手,一步步解决问题。然而,编程却要求我们具备全局视角,能够站在设计师的高度,去审视整个计算机系统,理解它的构成和运作原理。

        这就像是你突然从一个只关注自己脚下小路的行人,变成了一个需要俯瞰整个城市地图的规划师。这种角色的转变,无疑是需要时间和努力去适应的。

        那么,如何才能突破这种思维上的局限,掌握编程这门思维艺术呢?

        突破的关键就在于突破零散。学习编程你必须知道计算机是什么、每个组成部分又是什么以及它们是如何构成计算机系统这个整体的。为什么要这样构成、为什么要如此分解。

        你必须站在设计师的立场上看问题,把整台电脑,整个机房的所有电脑,整个国家互联网上的所有设备,统统收于囊中、置于眼前。

        抬头,看!先看全局然后进行抽象分解!而不是低头,做!否则你就连个最最简单的输入输出设备的访问代码都写不出来,因为你完全不知道某个调用发出后,会造成什么影响。 这是两个完全不同的视角。

1.2 刻意训练

        显然,掌控性的、全局的、研究性的视角,比隔离出来的一个个要你学习的局部难得多。因为它对你的知识结构要求严格。只有你知道整个计算机系统的来龙去脉,你才可能精确的影响它、从而得到你想要的一切。

        可惜,你从未受过这种训练。以小看大所以难。

        因此,我们要刻意去实践训练,没有其他途径。学生就刷题,工作就做项目,本质就是实践,当然,实践的过程中难免会犯错。但请记住,犯错并不可怕,它是我们成长的必经之路。只有通过不断地试错,我们才能更好地掌握编程的精髓。

2.刷题|实践项目为什么没有思路?

2.1培养思考习惯

        没有思路首先肯定是基础知识不够扎实,第二是思考方式不正确。从上述关于编程难的论述可以知道,我们思考问题习惯于从表面和细节开始分析,而不是从整体的关系上去分析。       

        从改正自己的思维出发,如面对一个事情不再直接动手解决,而是从另一个角度分析出题者的目的,将题目需要解决的问题分解为一个个小问题,这些小问题对应着你要提出的解决方法。假设我们已经模仿或实践了足够多的题目与项目,我们脑海中就会形成不同问题的解决模型,这个时候差不多已经可以套模型来回答问题了。如果是一个新问题,在脑海中寻找不到这样规律的模型来回答,我们也无需慌乱,因为我们可以利用我们的抽象能力,即解决问题本质的能力去分析问题进而将问题解决。

        比如问题是我要喝水,该如何培养编程时看待问题的习惯: 水(哪里取水,怎样的水可以喝);喝(如何喝,什么时候喝);要(随时随地还是固定时期,谁都可以要还是达到要求才能要);我(对应你我他,能允许喝多少,允许几个人同时喝,能快速取水还是等待取水)

        编程中的抽象思维是指通过简化、隐藏复杂性,以及将具体问题泛化为更一般概念的过程。在“我要喝水”这个需求中,虽然表面看起来很简单,但我们仍然可以通过编程的抽象思维来优化和扩展这个问题。

        以下是体现编程抽象思维的过程:

2.1.1需求抽象

        首先,将“我要喝水”这个具体需求抽象为一个更一般的概念,比如“用户请求执行某个动作”。

        然后,可以进一步抽象为“事件触发与响应”的模式,其中“我要喝水”是触发事件,而响应则是执行与喝水相关的动作。

2.1.2功能模块化

        将与喝水相关的功能封装成一个模块或函数,比如drinkWater()。

        这样,无论在哪里需要执行喝水的动作,都可以调用这个函数,而不需要重复编写相同的代码。

2.1.3接口设计

        设计一个清晰的接口来表示用户的请求和系统的响应。

        比如,可以有一个UserRequestHandler接口,其中包含一个handleRequest(String request)方法。当用户说“我要喝水”时,这个方法会被调用,并根据请求执行相应的动作。

2.1.4状态管理

        考虑与喝水相关的状态,比如用户是否已经喝过水、喝水的频率等。

        通过抽象的状态管理机制来跟踪和更新这些状态,以便在需要时做出相应的决策。

2.1.5扩展性与可维护性

        在设计系统时,考虑未来的扩展性和可维护性。

        比如,如果将来需要添加其他与用户需求相关的功能(如“我要吃饭”、“我要休息”等),可以很容易地通过扩展现有的模块或函数来实现。

2.1.6测试与验证

        编写测试用例来验证系统的行为是否符合预期。

        通过抽象思维,可以更容易地设计出覆盖各种情况的测试用例,并确保系统的稳定性和可靠性。

        综上所述,即使是一个简单的“我要喝水”的需求,也可以通过编程的抽象思维来将其泛化为更一般的问题,并设计出更加灵活、可扩展和易于维护的系统。这种抽象思维不仅有助于解决当前的问题,还为未来的需求变化提供了更好的准备。

3.有思路代码却写不出来?

        当你面对一个问题,已经有了清晰的思路,甚至已经在脑海中构建出了解决方案的大致框架,但当你坐在电脑前,准备将这些想法转化为代码时,却发现自己的手指似乎僵在了键盘上,无法将那些构思转化为实际的代码。这种情况,对于很多编程学习者来说,都是一个不小的挑战。

3.1 基础知识与语法掌握

        首先,我们需要明确的是,有思路并不等同于能够写出代码。编程是一门实践性极强的技能,它要求我们不仅要有解决问题的思路,还要能够熟练地运用编程语言将这些思路表达出来。因此,如果你发现自己的思路无法转化为代码,很可能是因为你的基础知识或语法掌握得还不够牢固。

        为了解决这个问题,你需要回顾并巩固你的编程基础知识,包括变量、数据类型、控制结构、函数等基本概念。同时,你还需要熟悉你所使用的编程语言的语法规则,确保你能够准确地写出符合语法要求的代码。

3.2 编程实践与经验积累

        除了基础知识外,编程实践也是将思路转化为代码的关键。通过不断地编程实践,你可以逐渐熟悉编程语言的特性,掌握常用的编程模式和技巧,从而更加轻松地将思路转化为代码。

        此外,经验积累也是非常重要的。当你遇到类似的问题时,你可以借鉴以前的经验,快速地找到解决方案。因此,不要害怕犯错,每一次的尝试和失败都是你积累经验、提升技能的机会。

3.3 算法的运用

        在编程中,算法是解决问题的关键。即使你有了清晰的思路,但如果没有掌握适当的算法,你仍然可能无法将思路转化为有效的代码。

        有人可能会说:咱们实际编写中好像用不到算法,好像可以不用学?

        在这里回答一下,首先在某些编程语言中的确很少使用到算法,比如使用Shell语言中编写脚本,通常不会涉及到复杂的算法。

        Shell编程语言擅长体现你的抽象能力,它的强项在于能够快速地编写出来完成特定任务,尤其是那些与系统操作和自动化相关的任务。

        然而,这并不意味着在Shell脚本中完全不会使用到算法。在某些情况下,你可能还是需要用到一些基本的算法,比如:

  1. 条件判断:根据文件类型、大小、日期等属性进行条件判断,从而决定将其归类到哪个目录。这实际上是一种简单的决策树算法。

  2. 循环遍历:遍历指定目录下的所有文件,这是Shell脚本中非常常见的操作,可以用for循环或while循环来实现。在这个过程中,你可能会用到一些基本的排序或过滤算法,比如按文件名排序、按文件大小过滤等。

  3. 字符串处理:在处理文件名、路径等字符串时,可能会用到一些基本的字符串处理算法,比如模式匹配、字符串分割、替换等。

  4. 简单的数学运算:在某些情况下,你可能需要进行一些简单的数学运算,比如计算文件大小的总和、平均值等。虽然这些不是复杂的算法,但它们仍然是算法的一部分。

        通过shell编程的举例,你就看出它的局限性,它不能承载过多的算法也就做不到像c、python等编程语言跨平台调用,实现更强大的功能。

        言归正传,为了运用算法,你需要首先理解问题的本质,确定需要解决的问题类型。然后,你可以从已知的算法中选择一个适合你的问题的算法,或者根据问题的特点设计一个新的算法。

        在选择或设计算法时,你需要考虑算法的效率、可读性和可维护性。一个高效的算法可以大大减少程序的运行时间,而一个可读性和可维护性强的算法则可以让你的代码更加易于理解和修改。

        同时,你还需要熟悉常用的数据结构,如数组、链表、栈、队列等,因为这些数据结构是算法实现的基础。掌握这些数据结构的特性和操作方法,可以帮助你更好地理解和运用算法。

        在实际编程过程中,你可能会遇到一些复杂的问题,需要运用多个算法或数据结构来解决。这时,你可以尝试将问题分解为更小的子问题,然后为每个子问题选择合适的算法或数据结构。通过不断地练习和实践,你会逐渐掌握如何运用算法来解决各种编程问题。

3.4 寻求帮助与资源利用

当你遇到难以解决的问题时,不要孤军奋战。你可以向身边的同学、老师或同事寻求帮助,他们可能会给你提供新的思路或解决方案。同时,你还可以利用互联网上的丰富资源,如编程论坛、在线课程、教程等,来寻找答案或学习新的技能。

4.总结

        综上总结,编程思维由分解、模式识别、抽象能力与算法能力组成。

        分解——拆解复杂问题的能力

        模式识别——锻炼整合“重复规律”的能力

        抽象——锻炼找出问题本质的能力

        算法——锻炼解决问题的能力

        最后,我想说的是,编程不仅仅是一门技术,更是一种思维方式。它教会我们如何以逻辑和抽象的方式去看待问题,如何化繁为简,将复杂的问题分解成一个个小问题去解决。这种思维方式,不仅对我们编程有帮助,更能够让我们在生活中受益匪浅。

所以,如果你觉得编程难,不妨试着调整一下自己的思维方式,去掌握这门思维艺术。我相信好的思维方式是可以改变一个人的前进方向和前进速度的,一起加油!


原文地址:https://blog.csdn.net/qq_39178993/article/details/142643793

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!