编程是什么?也许每个人都有不同的见解。
有人认为编程是一份工作,也有人认为编程是一种爱好,甚至有人认为编程是此生追求。其实,编程就是编写程序。
首先,从“编”字分析,它既可以表示编写,也可以表示按一定的原则、规则或次序来组织或排列。但,都离不开思考。
“程”字,它既可以表示工程,也可以表示行进的距离。但,都离不开执行。
简单来说,编程就是不停的思考,不停的执行。
编程与做别的事情相同,没有执行捷径,只有思考的方式不同。
章节预览:
1. 成功案例
2. 为自己定制一个小目标
3. 提升“绝对力量”
4. 分析每一次“执行”
5. 你已进入“天才”领域
章节内容:
1. 成功案例
说起编程界的“天才”,我们首先想到的就是Linus Torvalds。
linus Torvalds的成名之作是我们熟知的linux内核,在它的基础上诞生出许多著名的操作系统,比如:Slackware、Debian、RedHat、Fedora、Ubuntu、LinuxMint等。
linux从初期被人们了解,到中期被人们熟知,甚至到后期占据绝大部分内核江山,都离不开linus Torvalds的宏伟目标。接下来,我们一起了解linus Torvalds的成长之路:
上世纪八十年代,Unix开始向商业化方向发展,大部分学生由于支付不起昂贵的授权费用,不得不停止相关的研究。1987年,荷兰有一位大学教授编写了一个类Unix的应用系统并命名为Minix,用于教学使用。Linus Torvalds起初接触Minix是为了学术研究,接触一段时间发现Minix一些设计观念与自己的理解存在一些差异,但是他不能轻易修改和发布该系统的源码(由于Minix的许可证等问题)。
1991年,Linus Torvalds为当时新推出使用Intel 80386微处理器的计算机开发了一款全新的操作系统,并命名为Linux。
期初,Linus只是在自编写的内核中植入gcc编译器和Shell。由于Linux完全遵循GPL协议主题,发布到互联网后得到强烈的反响,很快吸引了众多开发者、黑客对其代码进行修改和维护。
Linux内核从发布到现在经历了4个大版本以及众多小版本更新,linux发行版也从Slackware最初发布到后来的Debian、RedHat、Fedora、Ubuntu、LinuxMint等等。
上述故事中,我们可以分析出一个关键字,就是“成长”。Linus Torvalds刚开始只是为了学术研究,迫不得已编写自己的内核,内核发布后,发现许多人面临同样的问题,这也让他萌发了新的思想——与大家一起完善这个内核。就这样,linux内核从初期只能编译、执行简单程序,到后来一步一步走上正规化,这些都离不开思想“成长”。
其实,并不是只有伟人的想法可以称为思想,我们每一个人的想法都可以称为思想。思想既表示我们未实现的想法,也可表达为我们未来的目标。
有想法是件好事情,它寄托着我们对成功的向往。接下来,我们为自己定制一个小目标,每一次实现都代表着我们在前进、在成长,并离成功更近一步。 然后我们通过数个小目标,完成我们的远大理想。
2. 为自己定制一个小目标
为自己定制一个小目标很简单,可以是学会几个单词,也可以是学会一门语言的基本类型,甚至可以是理解一篇文章。
目标越细越好,也更容易实现,它更能激发我们求知的欲望。因为目标过大,容易使我们退缩,甚至放弃。而目标过小,太容易实现,无法从中得到“成就感”。
定制目标应根据自己的实际情况做决定,定制目标的原则可以分成以下三步:
1. 预算一周或一个月能够完成;
2. 目标分成多部分执行,执行中如果发现某一部分走不通或太难实现,应修改这部分计划甚至重新定制目标。
3. 目标每一部分足够细致,至少在定制过程中每一步在脑海中都能走通。
生活中,我自己也不停的定制新的目标,执行过程中也遇到不少弯路,好在及时纠正,没有造成过多的影响。
我从正式入职工作到现在也接近五年了,这几年也跨越了几个领域,虽算不上光辉事迹,但也作为大家的参考对象,分析一下:
- 刚入职时,我是一个编程小白,未使用过VS2008编译器,基本的调试都不会,迫于工作压力,第一个月硬着头皮向同事求助,在他们的帮助下,第一个月我学会了调试程序、发布程序,并且学会了分析结构和结构中的代码含义。
- 入职两个月,我习惯了厚脸皮,也习惯了与他们打闹嬉戏。那段时间里,我有了较大的进步,甚至能写出令他们头疼的代码。
- 入职三个月,我具有了独立编写新项目的能力,硬是在接下来的一个月里,使用QT写出了工作一年才能写出的项目,并且也得到了领导赏识,后来让我做了C++项目负责人,并管理四位成员的代码。
- 入职一年多,通过大量阅读文章和参考书籍,让我有很大的进步,并通过<STL之双向循环链表(List)的内部关系>这篇文章,正式开始业余作家之路。
- 入职两年多,那段时间里我接触了不同领域的代码,比如DSP、DMA,甚至FPGA代码我也会参考一下。那一年我也学习了windriver,用于Windows下的驱动编写和理解。后来开始使用Linux系统,接触Linux驱动,并在一个月后编写出了字符驱动。
- 入职三年多,先后编写了几个不同硬件的Linux驱动,并做到Windows、VXworks、Ubuntu的驱动思路互通,以及下位机的编写。后来,带领团队自主定制安卓系统,从最初的4.4.4版本在模拟器里执行,到后来的6.0.1版本成功移植到我们的硬件板卡中。这期间实现了许多功能,比如IOS风格定制,小程序排列在屏幕中间位置,去除各种无用部件,单屏双显,陀螺仪坐标定位,开机动画修改,framework框架修改等。
- 入职四年多,定制linux内核,增加硬件适配,使用设备树控制基于芯片的相关硬件等。也在GitHub发表了一些原创,比如胸章设备支持中文等。
私下里,我一直保留着写博客的习惯,每一篇文章都记录着我的成长经历,这些经历包含着我心酸的往事、也包含着我对编程的激情。
以前的经历从现在来看,都很轻松、随意,但也是我曾经做了好多努力才做到的,这段经历也是我曾经头疼的经历。
最近这段时间,我自己编写的书籍也篇目过半了,我还在继续为我的以后定制着计划。
任何大的目标都是从一个小目标,甚至是一件小事情做起,只有经历过了才明白其中的艰辛和“成就感”。
3. 提升“绝对力量”
绝对力量不是任何负面因素,它代表我们的编程基础。
编程基础非常重要,日常编码中,我们的每一行代码都由它们组成。刚开始,我并不看重基础知识,因为那时候靠想法编程,几乎是异想天开的想法。但经过一次又一次的打击才发现,基础知识深厚才能编写出优质代码,现在我更愿意按照基础知识编程,因为这样的代码更可靠,也更容易理解。
后来,为了学习基础知识,我参考了大量书籍,每一本都非常认真的分析,每当遇到难点都用铅笔或水笔记录在笔记本内。
再后来,基础知识稳定后,参考任何书籍或任何代码都非常轻松,跨平台、跨语言也可以很快上手。
使用基础知识,可以让我轻松分析透STL中每一份完整代码,比如Vector,map,List等,也可以让我分析透甚至编写出每一个设计结构,比如二叉树、红黑树,甚至我自己编写一个多容器框架。
2018年,我通过自己设计的内存池、红黑树、List,结合在一起做出了一个智能框架,设计它的目的是为了突破多线程中读写的限制。比如在我自己设计的内存池中缓存数据,通过红黑树平衡数据,并通过List储存或删除数据,达到数据同时读取和写入完全不用加锁。但最后还是失败了,那时候能力还是不足,只能在少量数据中做到同时读取和写入不用加锁,大量数据时,则会出现数据错误。当然,以后有时间也许我会重新设计这个结构。
基础知识对于我们的代码来说非常重要,不能为了快速提升自己的能力而忽略基础知识,毕竟少走弯路才是最快的路径。
4. 分析每一次“执行”
编写程序的精髓在于每一次失败,每一次失败都会发现很多不足之处,也许是设计思路不对,也许是内存管理不到位导致,也许是算法使用不当。
编写过程中,代码执行结果在意料之外也是常事,不能因为结果不对就否认这份代码。遇到这种情况,首先要做的就是冷静下来,然后仔细分析容易出错误的代码范围。当然,能调试的情况下,尽量调试代码,错误的出现可能是一个条件的优先级问题,也可能是数据未对齐,或是数据溢出,也或是数据访问越位。这几种情况我们通过眼睛很难观察出原因,只有通过不断的调试,一次又一次的分析数据结果来判断问题所在,调试分析也是最省时间的一种方式。
我在设计新结构时,也遇到过眼睛无法检查出的错误,比如之前写完全随机加密算法。我分析了每一个函数,每一个循环结构甚至是每一条语句,都没有检查出错误。后来调试中想起来,四个字节数据向一个四字节单位位移,如果前三个数中有负数,将会得到一个错误数值。根据这种情况,每次位移时都增加了“&”运算,确保数据的准确性。
坦然面对每一次失败,并总结出失败的原因,是我们成长的路上不可缺少的因素。
5. 你已进入“天才”领域
上述2、3、4中,每一条如果你都能做到,或者都能处理好,那么恭喜你,你成功进入“天才”领域。
所谓的“天才”都是通过日积月累的练习,不断的突破自己,最终脱颖而出。
生活中,如果你是一个仔细的人可能会发现,那些看起来笨笨的人经过一段时间的努力,都会有惊人的进步。其实,这部分人并不笨,他们只是更相信自己,更愿意通过自己的实践来证明事情的对错。因为自己努力得到的结果,比别人口头说出的结果更准确。
几年前,我和普通人的想法一样,认为高手就应该比别人更聪明,比别人更强。但这几年努力后发现,高手不愿意与别人比较,他们更愿意与自己比较,突破自己才是正确的方向和目标。
转载:https://blog.csdn.net/a29562268/article/details/104704992