前言
先叠层甲
以下内容只是我的一些基于过去经验总结的个人看法,有很强的主观性,不一定是对的,也希望大家能说说自己的想法,帮助那些想学习但是无法入门的人。
说来惭愧,作为一名工科生,从高中暑假迷迷糊糊对着书学了一个月的C语言(就是谭浩强那本第四版),大学开学又学了两周,后面就去加社团做考核去了,C语言的学习并没有多深,完全没有体会到其精髓,例如结构体、数组、指针等,而且这些还可以彼此交互。
应用
比较典型的应用记得是打机器人比赛的时候,要用到一个轨迹规划和路径跟踪,诶,这个就可以用上面的知识点了,比如可以定义一个结构体数组,里面用来存放当前底盘中心(简化为一个点)的位置(X、Y)、偏航角
、经过运动学解算的X、Y方向的速度
、加速度
等信息,然后定义一个函数
,用来将这些信息和目标的位置对比,最后就能计算速度大小。
那么,现在的位置和角度
已知,因为是路径规划已经提前规划好了点,(当然,如果有激光雷达什么的那理论上就可以实时路径规划了),现在的点和目标几个点的位置已知,那么就可以通过拟合
,比如三次多项式,五次多项式等方法,拟合出一条比较光滑的曲线。
再通过插值
算法得到路径上的点,这样一条连续曲线就变成了一个个离散的点,那么路径上的点的位置角度等信息就可以规划出来,并通过路径跟踪
算法计算该点底盘的速度(线速度和角速度)了。
再通过逆运动学解算就可以知道电机的速度了。其中路径跟踪算法的函数就是要传入这些点的信息,就可以用到结构体数组
,而传参肯定不能把这些点都传过来嘛,所以就要用到结构体指针
啦。
结构体指针可好用了,你只需要指向该结构体数组的第一个元素的地址,你就可以操作这个结构体数组了,具体指针的大小就由你数组元素的大小确定了。
遗憾
虽然当时知道了指针、数组、结构体的妙用,但是却因为比赛的推行,以及学业推着我往前走,我没有时间和机会能重温那段尘封的代码,。后面打比赛的过程更多的是配置诸如定时器、串口、CAN、GPIO、PWM
,写各种实现各种动作功能的函数,无尽的调试,后面出于自己的兴趣自也学了一点电路。但是编程工具本身我却没有学习。
其实我认为编程语言绝不止是一种那些表层的语法,关键是学习它的应用,在它的应用环境下,发现它的特性,逐渐思考领悟怎么用它来发现问题、解决问题。对,编程就是用来解决问题的工具或者说是自己思考的延伸,将自己的思考外延,表现并实现出来
。在学习和使用编程语言解决问题的时候,你不仅仅是获得了一门工具,更是在一次次使用它解决问题时,学会的思考方法和经验。
回想起来,初入大学的迷茫和焦虑让我不敢停下脚步,直接就是埋头看视频学C语言,大一寒假还看黑马的视频学CPP,那些视频看过的都知道,真的很久,可是如果不去花时间去实践的话,很快就会忘记那些语法。这就引出下一个问题,我们到底应该怎么学习C语言或者其他编程语言。
如何学习编程语言
我想介绍一下我学习各种编程语言的过程
,这样也许能让大家更了解我的学习心路历程,和我在学习中的困惑。
C语言
首先学习的编程语言当然是C语言
,因为是工科,根本离不开C语言,想要控制单片机里面的寄存器
(我当时用的是的STM32),从比较底层的角度来看(最底层应该是汇编了),想要操作寄存器,就要对数据进行各种位操作,使得32位的二进制数据能够对应寄存器的32位,通过各种高低电平组合实现数据手册中的各种功能。当时底层用C来写还是最方便,我们当时用的是标准库,还可以学各种库函数的用法。总结来说c语言很适合底层,对于电路芯片的寄存器操作用C语言实现非常容易理解和方便
。
所以可能是因为当时我对于C语言的使用就是止于控制某个具体的电路板吧,我的想象力到现在还是限制了,但是我认为它绝不止于此,作为底层的语言,换句话来说相对基础的语言,怎么可能只有这些应用,而实际上为数不多的能用来编写操作系统的语言就有C语言。还是我当时的学习方法有问题,没有带着问题去学习啊,都是被现实的问题已经打到头上了,才想着去解决。根本没有自己的主观能动性
,学而不思则罔,思而不学则殆,意思就是如果只是学习而不思考,就会迷失方向,变得茫然;如果只是思考而不学习,就会陷入危险,变得空想。
总结
我之前对于C语言的应用就只是用于嵌入式,当没有用电路板的时候,思考就停止了,现在简单总结一下,说得简单点就是由于对于C语言的应用环境和特性不足够了解,所以对怎么发现它能解决的问题不“敏感
”,也就是悟性的问题。
那么怎么培养悟性呢?也就是培养自己发现问题,解决问题的能力?
经过我的思考和探索,发现大概两个方法。在此之前,请允许我做一个类比和假设,经过我的思考,我认为C语言作为一个解决问题的编程语言和思考工具,和数学在某种程度上是有点相似的,就是相当于是一级学科
,数学本身作为一门一级学科,他并不是为了直接对标某种问题而进行自己的发展和完善的,而是一种逻辑的自洽
,数学一直是拓展人类未知领域的思想利器,它本身必须严密,所以很多时候,它并不直接对标解决某种问题
。因此数学是十分抽象
的。
相比之下,物理因为有很多物理模型和应用背景,就相对好理解。C语言作为一个面向过程的语言,语言粒度很细
,可以用相对基础的语法实现很多复杂的功能
。这就像盖房子,C语言用的砖很小,那么你就可以盖成各种各样的形状。它十分灵活,没有很强的限制,所以你可以用它来实现很多的功能,以很多别的语言能实现的功能它都能实现。所以我认为数学和C语言在某种程度上具有类似的抽象性和精细性
。以下正式介绍我认为有效的方法。
- 方法一:初期,悟性低的时候,就可以去找实际的项目,
在实际运用中学习语法,以及细细体会各种操作,体会C语言的特点。干就完了,不要带有太强的目的指向性,这样会限制自己的思考,不要功利。
罗翔老师说过:“只有增加非功利性的阅读,才能丰富人的内心,对抗外界的浮华、虚荣”。 - 方法二:在有了一定的悟性之后,
带着问题,去细细研究、学习,这个时候有了一定的经验,就可以带着特定的视角去思考
,这个问题我能够用C语言来解决,怎么解决,这样有利于提高自己的发现、解决问题的能力,毕竟有了一个思考框架了
其实经过我的学习,语法没必要花那么多时间去学习,我一个大佬朋友也如此建议,他说最关键的就是实践。一直学语法但是没有去用,没有去看,很容易困惑,这玩意到底有什么用啊,就像学数学的时候一样。其实处处有用,只是没有实践。见多才能识广。可以多看看各种底层库函数的实现。要尽快进入持续开发的状态。
Python
python是我大二上为了打电赛,需要在电脑做一个图形化的应用来和单片机进行交互
,我当时使用的是串口通讯,Python方面用了多线程、读写Excel的库、QT、串口库等等,当时学pythond的基础语法也只用了几天。
为什要用Python呢,因为Python它是更接近人类语言的,容易上手而且有很多强大的第三方库,开发一个小项目的话速度很快,可能只需要一百多行代码就能完成功能,如果要快速攻坚一个问题的话,python真的是一个利器
。
但是python就是让我觉得自己只是在实现功能,没有什么动脑的地方(可能自己还不到火候),需要用的功能查一下官网、文档、或者搜一下就好了。
所以对于学习Python我的建议就是要快速浏览语法
(因为学到python之后你基本上都有别的语言的基础,再学python很快的),快速找到一个项目或者做自己想要做的项目直接上手做
,不会的内容再去找文档。
学到现在我对python的印象就是,很适合用来处理数据
,就像Matlab一样,而且很多强大的库
,适合快速搭建一个项目,而且学习起来反馈快
。
Java
我是在大四的时候,有个项目需要我做一个应用,需要能够在手机或者网页上实现一个系统。我当时就根据自己之前选修过Java的经验觉得应该用Java来做,后面一如Java深似海,开始的时候我连JavaEE、JavaSE都不知道,后面学着学着才知道我应该直接学JavaWeb。
Java在我个人认为是一个有着十分丰富开发环境的跨平台语言,它的内容实在是太广了,我现在还没有算是入门吧,它的东西太多了,生来就背负太多东西了哈哈,就像这篇文章一样,你得学完一条链,才能有一个整体的感知,但是又会陷入另一条链。由于我自己也不甚了解,就不误导大家了,但是我知道的是Java真的很有意思,可以用它来做很多有意思的事情,比如一个网页,一个手机App,只不过你想要得到这些,就要相应花很多时间去学习。
后言
以上内容只是我的一些基于过去经验总结的个人看法,有很强的主观性,不一定是对的,也希望大家能说说自己的想法,帮助那些想学习但是无法入门的人。
下一篇文章我会记录C语言的特点(适用的环境)以及引出为什么我们要学习它。
下下篇文章我会记录一下我找到的别人推荐的关于C语言的开源项目,我也不知道他们到底怎么样,我会自己试试,然后记录自己的学习过程和对这些项目的特点进行总结。还有一些其他资源以及自己想做的东西。