从入门学习单片机到现在,不知不觉有了八个年头,也确实积累了一些经验。经常在网上发布一些开源设计,不免会被问起,如何学习单片机一类的问题:
如何入门单片机?
怎么学好单片机呢?
有没有什么推荐的书籍?
现在整理一下自己的学习经验,仅供参考。
定位很重要
这里,要先请读者给自己一个定位,或者说,你为什么要学习单片机。我这里总结出几个类型:
1、为了工作学习,听说单片机相关的行业,如嵌入式、物联网发展很快,就业前景好,薪资待遇高。
2、单片机爱好者,包括科班学生和半路出家的。因为兴趣喜欢单片机,也希望以后从事相关方面的工作。
3、出于兴趣的非科班爱好,学习单片机更多的是为了娱乐,丰富经验。这类人基础参差不齐,有些是科班出身,但不从事此行业或未曾深入学习;有些是零基础;有些是相关专业,如学习过电子、通信、机电等。
至于第一类人,我只能给点世俗的建议:你需要一个聪明的大脑,一纸名校文凭,只要肯学习,毕业后就业问题不大。以目前的行业发展来看,单片机在很长一段时间内都会是热门就业行业,本文也会提及到一些就业现状。
第二、三类人,我相信只要你有兴趣,一定会克服种种困难,至少入门还是可以的。以就业来说,即便是只入门水平,也可以从事相关行业。坐在电脑面前搞开发固然是水平的体现,但这个行业,各个方面都需要不同层次的技术人员。
入门单片机
兴趣
“兴趣是最好的老师”。正所谓程序(电路)虐我千百遍,我视程序(电路)为初恋,入了单片机的“坑”,对这句话应当深有体会。大多数和我一样经历过高考还不是学霸的读者都知道,对自己的不喜欢的学科,只有硬着头皮去学,只是为了在盛夏到来之前的6月,答完一份或许会改变你命运的试卷。
当迈入大学,或从事工作,有了自己的时间折腾感兴趣的东西,尤其是通过自己的努力做出了一件作品,甚至会让你产生一种错觉:如果当初我高中再努力一点,会不会读更好的学校,现在会不会在更好的实验室,有更好的工作?可惜没有如果。
兴趣带来的动力是无法想象的,如果你有兴趣来学习,而不是单纯的为了考试、就业,在学习的过程中,至少你会有克服困难的动力。
我大学时选择这个专业,也是因为有兴趣。记得才开始学模电数电,有个电路是做一个数控电源,通过按键控制电路输出不同的电压。为了焊接好这个电路,我搞到凌晨三点。回想起整个高中时代,我只有逃课通宵打游戏这么卖力过。等到第二天,我的电路正常工作,至此,我终于有了些成就感,这种成就感是在高中的三年模拟五年高考中得不到的——毕竟,我根本就不喜欢那些。
大学才开始学习焊接电路的时候,我的焊接水平很差,那时候没有智能手机,没留下照片,用我的老师的话形容我的焊点,就是鸡屎堆。我的同学就有焊接的很好的,加上老师非常形象的“讽刺”,每次作品完成后,我都默默的告诉自己,下次一定要比我同学焊接的好。
直到现在,我的焊接功底虽谈不上是大师级,但也可以说是水平不差了。这就是兴趣所给我的动力。
单片机除了涉及硬件,还有编程。很多看过我作品的人以为我编程很厉害,这其实学习经验尚浅之人的一种误解。如果有些编程经验的人来看我的程序,就会发现,我的程序没有什么特别体现水平之处。我的作品大多数讲究创意,在技术方面并不需要很复杂的知识。所以说,不要觉得会做我那些设计就意味着编程有多厉害了,我始终觉得我是入门了而已。
编程需要兴趣驱使,你们看不到的是我在编程上花的时间,光立方的程序我反复修改过3000多次,遥控车我也是写了1000多次。如果不是兴趣,恐怕我不会如此坚持。
编程也需要天赋,这和做硬件不同。硬件设计更多的是经验,而编程除了需要经验,还需要有些天赋。当然天赋并不是绝对的,后天的努力也可以弥补,下文也会说到如何学习编程。就算后天的努力,在编程方面也只能达到写写简单的程序,也没有关系,我始终认为,编程是少数人可以做的好的,只要你有了这方面的基础,或许你会发现其他类型的工作也很适合你。
数电模电基础
学习单片机之前,需要一些基础知识。数电、模电都需要有一定的了解。这方面的书籍理论部分很难,不要说非科班学生。就连大多数科班学生在学习理论,尤其是计算时,那也是懵逼的。
好在入门单片机,只需要对模电、数电有所了解,当然数电要多一些。个人觉得,没必要把书中的东西完全吃透,先阅其大概。
关于书籍,这里我推荐大多数专科学校所使用的教材,大专院校的教程相比本科教程而言,理论部分少一些,还有些教材注重实践。比如让你做一些小电路,锻炼动手能力的同时,加深理解。这种书籍都不错。
电工基础
无论是搞单片机,还是入门的电路基础部分,都需要有一定的电工基础。毕竟玩电还是有一定的危险。学会使用万用表、电工工具是必要的。我读大学的时候,我们这个专业必须考电工证。
现在很多学校没要求学生去考电工证,尤其是本科院校。这也确实会带来一些弊端,复杂的电路出了问题,如何去排查电路故障?有电工证的人,至少在思路上会比较清晰。当然,也不是要求所有人都去考个电工证。这里推荐另外一个方法,就是网上购买一些小电路设计,如小功放、抢答器电路、声控电路,这些小电路制作也不贵。制作的过程中,几乎都会遇到电路不正常工作的情况,这种时候就需要你根据电路图和万用表检查故障,看不懂电路,不会万用表没关系。多利用搜索引擎,多在论坛、技术群请教即可。
英语
我觉得,除了业余爱好者,其他人都有必要学好英语。学编程本身到不需要英语有多好,毕竟编程的关键字不多,死记硬背也记下来了。建议学好英语是因为,很多扩展性的资料很多都是英文的。如一些芯片手册、一些国外爱好者设计的代码等。至少目前来说,翻译软件还不能完全满足技术方面文章的翻译需求。
我建议读者至少要做到有一定的词汇量和语法基础,结合翻译软件能看懂英文技术文档。
是否购买开发板
是否购买开发板这个问题,是被网友问的最多的,这里根据我的经验给出一些建议。
读了前面的基础知识介绍,你可能发现学单片机并没想的那么简单,事实确实如此。个人认为,某些开发板鼓吹“一个月学会单片机”、“15天学会单片机”、“零基础学会单片机”,恐怕更多的是一种营销口号。
不过,我并不反对购买开发板,网上流行的开发板教程我都大致看过,还是说的过去的。前面提到的基础内容,可以在学习开发的同时兼顾学习。尽管这样做你会发现几乎没时间娱乐、游戏。想学好一门专业,尤其是这种需要大量时间实践的专业,确实要放弃一些东西。我希望肯下功夫和时间学习上述内容的读者,能够适当放松,不要忘记锻炼身体,有条件,去谈个恋爱。锻炼和恋爱都有助于学习——个人经验。
是否购买开发板,也要根据自己的学习环境考虑。如果经济条件允许,可以购买一套价格合理的开发板。购买之前一代要看例程代码多不多,最好索要几节免费的资料或视频。如果有自信的卖家,肯定会很大方的提供给你这些预览资料。
我之前也购买过STM32单片机的最小系统板,卖家的资料完全公开,不买也可以先下载。我就是下载了资料后觉得不错,最终确定买这家的,为了避免打广告的嫌疑,这里就不指明卖家了。我想说的是,根据我的方法够买开发板,可以减少被坑的几率。
当然,学习单片机也不是非要购买开发板。在我大学时代,单片机基础是通过仿真软件学习,实物几乎都是自己手工焊接。我一个师弟,不知道哪里搞到一个开发板的原理图,自己用万能板焊出了所有模块,然后网上找资料,研究各种模块的用法。这样半年下来,单片机学的非常好,还锻炼了动手能力和电路调试能力。这些能力如果通过开发板方式学习,恐怕是很难短期内掌握的。
不管是本科生还是专科生,你有条件有自己的实验室,或者你的室友也不是很介意你在寝室玩电烙铁,我希望读者优先通过自己焊接电路的方式学习单片机,入门级的电路焊接起来并不是很复杂。电路的调试能力和故障排除能力是在日后的工作中十分重要的。
开发板的优点是稳定,有些单片机只有贴片封装,如STM32,也只能买开发板。我在研究STM32程序时,就买的廉价的最小系统板(只有单片机的裸板,引出I/O口)。想测试什么功能时,如果有成品模块,就买来接线用。没有成品,就自己手工焊接,然后测试程序。而有些人往往需要马上利用开发板上的各种模块验证一些想法,这个时候是非开发板不可的。但往往这个阶段的人,已经度过了初学阶段。
总结:时间允许,环境允许的情况下,优先考虑用手工焊接电路的方式学习。其次考虑购买开发板。如果你的专业课程是学习STM32,建议只购买最小系统板,周边模块电路自己焊接。
如何学单片机
实际上,我被问到的是“如何学好单片机”,然而,我至今都不认为我学的有多好,我也只能分享一些学习经验。至于能不能学好,我觉得要看个人是否能够有持之以恒的精神、能否学会独立思考。
硬件篇
有了模电数电基础、有了一定的焊接、调试经验,可以说打开了硬件的门。但单片机,最终的目的是可以设计电路。给一个现成的电路在你面前,让你分析、焊接、调试,只要肯花时间,你总会找到解决方法。如果你能设计一个电路,可以满足别人提出的要求。这就是能力。随着能力的提升、经验的丰富,你可以设计出更好的电路,这叫做水平。
从学习现有电路到可以设计电路,我没有什么捷径,只能说多看、多学习电路。并开始学习看各种元器件的手册。很多人做我的光立方设计时,问我74HC154的工作原理,我从来没回答过。这些知识网络上都有。甚至有些人在购买元件的时候,问我窄体和宽体的74HC有没有区别,又或者问,窄体芯片上些的是“CD74HC154EN”,这个到底是不是74HC154呢?问出这种问题的,往往是没任何基础的人。这不是基础知识问题,而是懒的问题。这类人懒惰到不愿意自己查阅手册,也不愿意利用网络搜索引擎,甚至不愿意咨询卖家。
懒,是学不好电路的。因为懒,不愿意了解芯片,更不愿意去看更多的电路设计。
还是以74HC154为例。如果接触了这款IC,还要思考,怎么通过程序控制它的输出?有没有类似的芯片?如果一时间找不到74HC154,有什么芯片可以代替?记住,永远不要满足于现有的知识,要主动的扩展自己的知识面。
最后要说的是,多焊接,多练习。网上找开源设计,先学习他人的设计方法。这里也不得不说,国内好的设计拿出来开源的,相对于国外,还是较少。这也是我当初学习时遇到的最大的阻力。很多好玩的、看了后自己也想做的设计,却没有电路图,没有源代码。这也是为什么我做开源的原因。
补充:用软件绘制电路图、PCB也是要刻苦练习的。万能板焊接只是起步,是搭建模型或是做一些小制作的一种最直接方法。但我也推荐,个人或学校,条件允许的前提下,多打样PCB来实践。这方面的经验,在日后的工作中非常重要。
绘图往往是开发人员的工作,如果你的编程能力较差,完全可以把更多的精力放在绘图上,这也是一门学问。绘图的经验,需要大量的时间实践去积累,没有几年的经验,很难设计出优质的电路。
没有绘图经验,也不代表就不能找到工作。如果你有良好的焊接功底、电路分析故障、调试能力,这些也是企业所需要的。我的第一份实习工作,就需要这种能力。每天坐在办公室等电话,哪里的设备坏了,过去现场维修。比如焊接通信线路,拆下某个模块,从新安装等等。或许这份工作没有特别的难度,但好在清闲,有更多的时间来自学提升。我的一些同学,直到现在,都在从事这方面的工作,月薪在5K左右。我的一些大学师弟,在重庆或重庆周边,这种类型的工作,也可以拿到4K。如果说有什么缺点,就是可能经常去外地跑,跑的多了,对出差也就厌倦了。不过我想说的是,就算你学的没那么优秀,至少这种工作你也可以胜任。
实不相瞒,以后我就打算从事这方面的工作。读者们也不要把这份工作想的过于简单,如果你能力高,你所维护的设备也就越复杂,售价越高,客户也往往财大气粗。客户请你过来,希望你马上可以解决问题,人家可是等着用设备呢。只有用心积累经验,才能做到游刃有余,客户满意。
编程篇
在学生时代。想必你和我一样发现这样一个现象:不管什么课程,一样的老师,一样的内容,永远有人学的比你好。编程也是,你光有了兴趣,但人家聪明的孩子,就是比你理解快,这个你有办法吗?反正我是没办法,有办法我高中就考出好成绩,读更好的大学了。
没天赋就学不好学编程吗?当然也不是。虽然我承认天赋的重要性,但我更看重后天的努力,下面的文字,中心思想是让读者了解如何提高自己,缩小先天带来的差距。
我的自学之路
我读大学时,单片机课程是用汇编语言,也只有一学期,可以想见,这一学期能学到多少东西。后来我觉得有必要学习单片机C编程,那时候也早已大学毕业,就只能自学。
因为有汇编基础,我对单片机的寄存器、中断等概念已经非常了解(再次强调学汇编的重要性)。我只需要学习C语言基础即可。并不需要在原理上过多纠结。比如汇编中控制P1端口输出,代码为 MOV P1,#55H,我只需要知道,C语言中,同样功能的语句是P1 = 0x55即可。
但C语言毕竟和汇编有很大的不同,有很多新知识需要我去学习。我的学习方法是,用过小项目学习。下面是我做过的一些实验:
1 单片机实现流水灯
2 控制1位数码管
3 控制多位数码管
4 数码管显示温度(DS18B20)
5 数码管显示时钟(DS1302)
上面这些东西,都是我自己焊接电路,网上找代码逐一实现。最开始,while循环,for循环,数组查询,这些出现在程序里,我都是一头雾水。但我不耻下问,我会问懂C语言的师弟,我也不知疲倦的通过搜索引擎学习C语言的基本知识。虽然开始慢,但毕竟对单片机本身很熟悉,没多久,我就算掌握了一点C基础。然后我又给自己加大难度,做了这些实验:
6 单片机控制1602或12864
7 1620显示温度
8 1602超声波测距
9 12864显示ADC转换
10 单片机之间的串口通信
读者们可以发现,这些实验越来越有难度,但网上都有资料,结合单片机手册,我也很快就掌握了这些内容。
有了些基础后,就开始着手用C语言做新的设计,最开始是把我之前设计的光立方由汇编代码移植为C代码。后面又设计了光立方、手势遥控车等作品。
说到手势遥控车,最开始我是没这想法的,当时只是用蓝牙模块做了一个无线遥控小车。我最开始也并不知道电机如何驱动,也没用过蓝牙模块,都是自己通过网络学习加以反复实践。想到做手势遥控车是接触了ADXL345模块,当初纯粹是想学习一下IIC通信。我读取到ADXL345模块数据后,发现模块还可以测量倾角,所以就萌生了当遥控器的想法。
对于当时的我,实现手势遥控并不容易。我记得和师弟个人在实验室里整整两周,甚至吃饭都在思考程序怎么写。最后还是做出来了
这里也不得不说,直到现在,我的编程水平仍然很一般,搞算法对我来说最头痛的事情。这也是为什么手势遥控车至今都没加入PID处理。
从我的自学C编程之路可以看出,虽然我有汇编基础得以快速入门,但我同样也花了时间和精力,从简单到复杂,循序渐进。总得来说,我是通过一个个的小项目学习,这些小项目,在大多数开发板中也都可以学到(买不买心理有数了吧,能自己焊接当然没必要买了)。
有些人入门后,也有计划像我那样做一些小项目。我经常被问到这种问题:
我会写数码管程序,也会写按键程序,但如何把两部分结合起来,做一个计数器呢?如果把这个问题难度扩大,可以看做:我可以控制8*8的点阵(64个LED),但怎么编程控制8*8*8的光立方(512个LED)呢?
这其实并不是编程问题,而是设计问题。如何设计代码实现功能,这是一种思想的体现,这个过程,我觉得是一种艺术。而编程语言,不过是实现艺术的工具。
市面上大多数单片机编书籍或视频教程中,基本上都是这种套路:给出一个项目,给出代码,讲解代码功能。这样做无可厚非,不过学习者并不能学到精髓——为什么要这样设计?我也看过一些开发板给出的代码,这些代码本身就设计的不好,试问,一个本身就设计的有问题的代码,讲解的再好,又有什么意义呢?
如何学会设计程序——把用户功能转换为代码,最好是优雅的代码。这需要花时间去领悟。也是为什么我计划写书的原因,我的博客里,也会陆续的发布一些基础知识,以及编程方法的方面的文章。基础知识是必须的,但怎么运用知识设计程序,才是最终目的。
只要你掌握了单片机的精髓,那么顺带解决了另一个问题:选择什么单片机平台
现在主流的单片机平台有51单片机、STM32、STM8、arduino、AVR等,大部分人都是通过学习51单片机入门。有些人学了一段时间,听说有STM32、arduino等平台更强大,于是51还没学好就转投其他。又或者不少读者此时正在纠结,要不要学一段时间51后转为学习STM32等。
这里我想说,如果已经选择了51作为入门的读者,或者专业课程一开始就学习STM32人,好好的学下去。单片机编程,最重要的是程序思路。以光立方为例,这个设计可以用51单片机,也可以用STM32实现。
经常遇到一些人,他们只学过STM32单片机,看到我的光立方用的是51单片机,就会问我:STM32能做光立方吗?当我回答能时,他们又问:怎么做呢?这类人,我觉得他们学的很烂。我也曾耐心回答:STM32和51单片机做光立方的区别是I/O口、定时器、串口初始化这些不同,但控制灯珠的逻辑是完全相同的。只要你理解了硬件控制原理,就不难把程序移植到STM32单片机。问我这些问题的,至今我也没见过有用STM32做出光立方的。因为真正会学好编程和硬件的人,看了我的电路及代码,自然知道怎么做。没有学好的人,你让他用什么单片机都无法实现。
现在的我,就不纠结单片机平台,光立方我是用51单片机做的。如果需要,我随时可以移植到AVR、STM32、arduino平台。因为我掌握了单片机的精髓。
与其纠结学习什么类型的单片机,不如用心学好一种单片机。一旦学好,当你需要转入到其他单片机平台时,你会发现学习成本大大降低。
如果你擅长编程,那做开发工作是最好的。虽然内陆和沿海地区的差距较大,以我朋友在沿海地区和重庆、成都地区的薪资作为参考,作为开发人员的薪酬还是比较可观的。但开发人员的这碗饭不简单。
以手势遥控车为例,如果你所在的公司要把这个东西作为一款玩具发售。你会面对如下问题:
1 电路成本
2 稳定性
3 电路与壳体的契合
4 开发周期
5 开发成本
公司是追求利润的,你作为开发人员,就不能像我做模型那样,随便搞些元件做出来就完事。你的开发周期越短越好,短期内,怎么做出高质量的产品?这就需要你有过硬的技术和丰富的经验。这只是小设计,如果是工业产品、医疗产品、智能产品,开发人员面对的问题会更多。
开发人员的前景是很好的,别看那些“人工智能”、“智能机器人”、“智能家居”什么的被媒体炒的火热,最终落实到实物,还是需要底层开发人员。但现在不比以前。我12年大学毕业,那个时候,很多公司招收单片机开发人员都会接收应届生,哪怕你没有经验,甚至是相关专业都可以,公司摆明了说会有人带你。现在是18年,再打开招聘完网站可以发现,几乎都要有一定工作经验的开发人员。如果没有经验,除非运气好,赶上一些公司招收开发实习生,不然比较难找到称心如意的工作。
我建议,找不到开发方面的工作,也可以先从事我前文提到的技术支持一类的工作。积累必要的工作经验。毕竟,不是人人都可以把自己关在宿舍里几年就可以成就一个大疆。大多数还是循序渐进,骑驴找马。
从事产品开发,除了需要过硬的功底,也需要了解产品本身。你要知道你开发的功能用在哪里,用户怎么使用,有没有更好的方法。这固然需要经验的积累,也需要有设计头脑。如何培养设计头脑,后文我会推荐一节书籍。
补充:单片机编程不同于软件开发
有人问我,我学过C语言,是不是对学习单片机有帮助?我也是学过C编程的,根据我的经验,我只能说,有一点点帮助,很皮毛的帮助。对于学过C编程的人来说,上手来说确实要快一点,但仅限于此。上手快,不代表你会很快的掌握单片机编程。
这是因为,单片机的开发环境(Keil为主)和C语言(VC等)是不一样的,很多地方不能用C语言的角度去理解单片机编程。尤其是在8位单片机中,很多人定义变量一来就是int i;这都是先学了C落下的病根。在单片机中,变量的位长都需要考虑,能用char的时候不用int。
单片机编程,是直接操作硬件,特别是用汇编编程时。这也牵涉出另一个新被问及较多的问题,要不要学习汇编编程呢?我的回答是,学习汇编是非常必要的,因为以下几点:
① 在某些领域,是非汇编编程不可的,如汽车的遥控钥匙,以及诸如此类的通信类编程;
② 还有些芯片的技术手册,给出的例程代码本身就是汇编,如果你需要用C语言设计程序,前提就是看得懂官方给出的汇编例程;
③ 学习单片机的寄存器功能、寻址方法等。
④学习单片机寄存器知识,理解单片机编译原理,也是非汇编不可的。如果你有时间或兴趣,可以阅读这篇文章,文中分析编译的过程,就需要汇编语言。(有兴趣的可以阅读一下这篇文章)
很多网友和我交流说,他们学校不再开设单片机汇编教学,从长远看,这是不利于学生的发展的,但好在可以通过互联网学习汇编知识。这里我推荐《微机原理与接口技术》(清华大学出版社)作为汇编入门。入门后,读者可购买一些提供了汇编实例的单片机书籍再学习单片机汇编编程。
前期学习汇编,不需要搞特别复杂的程序,掌握书中的程序即可。如果是学习STC公司的单片机,参考STC官方手册中的汇编代码是一种性价比最高的方法,毕竟是免费的。
关于编程,这里能说这么多,篇幅有限。我会在日后的时间里,陆续更新编程方面的文章。
培养独立思考精神
多年来和网友的交流发现,不少学生不会质疑,迷信权威。这也难怪,我们自幼被灌“老师就是权威”,“书本就是权威”。有些在校的科班学生经常请教我编程问题。在我给出答案后,还在怀疑,甚至来一句:但我的老师不这么讲的、我的老师说应该怎么怎么样。这类人,是极度的不自信,或者是有极高的奴性。老师就不能犯错吗?换个角度说,你既然找我问问题,本身就是质疑老师了,我给了一个答案,为什么你怀疑我,就不怀疑你的老师呢?
在学习的过程中,你的老师、其他人的程序或者文章很有可能是有错误的,不严谨的。如果你迷信权威,觉得老师说的永远是对的,很难学好单片机这种专业。
其他行业我不知道,但我敢说,做技术这一行,就是要敢于质疑。前文提到了那篇文章,文章里写到的看起来正确,其实不然的内容,就是一些老师教的。我就是敢于质疑,才能发现这些问题。这些问题,有些人对它也不屑一顾,他们认为研究这些没有必要,没有意义。我身边对我说这些话的人,或许他们工作能力不错,但没有像我这样,做得出“养眼”的设计。
如何培养独立思考精神,这才是最关键的问题。我的建议是多读书。
这里说的读书不是消遣类的,而是名著一类。喜欢历史的可以读《史记》、《三国志》,喜欢国外文学的,我推荐大仲马、莫泊桑、都德、海明威、马克·吐温、杰克·伦敦的书。喜欢纪实性的,我推荐海尔·达尔的书,或者其他人物传记。
读书让你学会表达
我有过给学生授课的经验。我观察发现,编程学的好的人,不管他平时多么沉默寡言,只要涉及到编程项目,你问他的思路,实现方法,他们总能准确的描述出。而往往学的不好的人,都不知道自己要做什么,或者知道做什么,遇到了问题想问我,但总是无法准确描述他们的问题。导致我经常需要花时间去猜测他的意图。
不仅是在现实中,和众多网友的交流中也发现很多初学者都存在这个问题。说了半天,不知道他想做什么,想实现什么功能。最终和这种人的交流都不了了之。而有些网友,总能简明的说明自己的问题,让我知道如何下手去研究问题。通常情况下,都可以很快的解决问题。而这类人,也往往学的很好。
我也看过不少网友的代码,大多数看这些人的代码,是因为他们实在无法梳理自己的语言。但每次看这种人的代码都是一种煎熬,且不说杂乱无章的拼音命名、毫无规律的缩进。就说整个程序,毫无逻辑可言。我接触的大多数网友来说,那些无法用汉语准确描述问题的人,他们的代码通常也是让人头疼的。
以我汉语博大精深,去描述编程的功能,实在绰绰有余。
除了《史记》、《三国志》我正在看,上述作者的书,我几乎都读过,而且不止一遍。读书的好处就是,我遇到问题,我可以准确的描述问题,让给我解答问题的人,可以用最短的时间了解我的问题所在。或许读者不以为然,觉得读书有那么重要吗?
这里说一段我们大家都熟悉的三国故事。
刘备叛逃曹操来到荆州刘表的地盘,刘表这个人,是胸无大志的,刘备呢,又很得人心,刘表不得不提防。三国志只用了三个字,就非常形象的描写出刘表的心态和做法:
荆州豪杰归先主(指刘备)者日益多,表(指刘表)疑其心,阴御之。
“阴御之”,就这三个字,心态,行为都有了。是不是很传神?
除了学习中的提问,在工作中,也会经常需要写一些技术文档,比如申请专利、产品说明书、项目问题汇总等等。如果你的代码、技术文档也可以有如此简单明了,我相信你很快可以在职位竞争中脱颖而出。
还有个三国故事,官渡之战,我们都知道,曹操以少胜多,打败袁绍。也是以少胜多的著名战役。有说袁绍兵力十万,曹操一万,三万的,甚至说有五千的。不管怎么说吧,反正曹操兵力少,相差悬殊。但陈寿就提出了自己的看法,有理有据,这里不讨论历史细节,有兴趣的可以自己读读《三国志·魏书·武帝纪》。我想说的是,陈寿和裴松之,经常加入自己的观点和判断。也怀疑现有的史料。这种精神是难能可贵的,也是为什么推荐读《三国志》的原因。
高中的时候,我读了当年明月的《明朝那些事儿》。很痴迷,读了好几遍。后来大学读了《万历十五年》,又读了《毛佩琦正说永乐大帝朱棣》,近期也读了《中国大历史》——黄仁宇。结合网络搜索,也发现了当年明月书籍内容的不妥之处。之前我一直认为作者都用的是真实史料,很客观,很真实,写的又好玩。直到看了他人的著作,发现当年明月确实刻意回避了一些可能抹黑历史人物的史料。比如朱棣的残暴,总是一笔带过,甚至为其开脱。张璁为人不错,历史平评价很高,但在《明朝那些事儿》中,简直被黑出翔。以及他对明朝灭亡的看法,也存在不妥之处。这里不讨论他的观点正确与否,毕竟一个朝代的灭亡是很复杂的。我想说的是,如果只读一个人的书,你的想法会僵硬。如果多看一些他人的作品,你会了解更多内容,通过对比,或许你会有自己的结论。这就是独立思考。
这里我强烈推荐黄仁宇先生的《中国大历史》一书。近期读了这本书,让我受益匪浅。我们高中都学过贾谊的《过秦论》,贾谊认为秦代灭亡是因为“仁义不施”,秦二世也没有改正秦始皇的错误政策。然而,秦朝灭亡,真的是这样吗?又比如,宋代的灭亡,除了蒙古人因素,宋朝自身就没问题吗?再如后面明、清两朝的覆灭,又有哪些因素?《中国大历史》从不同的角度看待各朝代政策问题、灭亡问题,作者见解独到,值得细细品味。
看过这些书,对我来说,我学会了多角度看问题,在工作生活中,都有着极大的帮助。
最后,我还要推荐一本书给打算从事开发工作的读者。《设计心理学》,作者唐纳德·A·诺曼。相信我,这本书会让你相见恨晚。我读了这本书后,在我的新设计中,遵从书中的一些观点后,我发现,这样做确实有好处;也让我有了更多的思考问题的方式方法。读了这本书,你也可能培养出有独到的眼光,发现他人设计或你自己设计中存在的不足,并知道如何改进。
单片机入门类的书籍,没有什么特别值得推荐的。我建议理解能力好的人,直接看单片机手册,结合网络学习。若一定要买书学习,不妨看看网络中其他购买者的评价。如果是51单片机书籍,STC的官方手册到是有推荐,我摘录如下:
我采用手册+网络的学习方法,没有买过这些书籍,不对书中内容作出评论。这里也透露一下,工作室也在编写单片机书籍,预计18年9月前截稿。书中不会占用过多的篇幅讲解基础知识,更多的是介绍怎么设计一个系统、怎么设计电路和程序实现目的。为了让内容有实用性,本书以物联网应用为核心,让读者可以了解单片机在物联网系统中,到底扮演什么样的角色。
谦虚
这里说的谦虚,不是指小时候爸妈告诉我们:如果有人表扬你,你一定要谦虚,不能显露出得意,而是要说,这没什么,都是老师教的好,爸妈教的好,我做的还不够好。这些话我们从小就学会了,我们也称之为谦虚,虽然我更认为这是一种虚伪。
本文说的谦虚,是指可以认识到自己的不足,学习的越多,越能发现自己的弱点,进而激发学习的欲望。面对比自己水平高的人,能够质疑,但也保持尊敬的态度,虚心请教。
我发现,很多才入门的人,极度的不谦虚。
很多网友在做我的设计时候,焊接好没有调试成功,便会问我:我通电后不工作,是不是你的电路设计有问题呢?或者程序有问题?在得到我肯定回答,说电路、代码都没问题后。过段时间再来找我,说会不会我的电路或代码有问题。我问他们,你们电路检查过吗?他们信誓旦旦的回答说检查了好几次,十分确定自己焊接的电路没问题。
在我看来,这类人就是不谦虚。只检查过几次就认为自己的电路一定没问题,直接怀疑原作者。殊不知,如果我真的上传了有问题的电路或代码,为什么其他人可以做出来呢?为什么还要开放QQ群和QQ号码方便交流呢?
还有些比较基础的问题,我会让我们直接去自己搜索。有些人道是干脆,说“我什么都自己去搜,我还找你干嘛?”这是一种狂的没边的态度。殊不知,虽然我不是什么大神,但就那些基础问题,我基本上都有在网上检索过。网上检索不到答案的,或者说答案不准确的,我都会直接回答。
还有一种非常愚蠢的人,问我代码相关的问题。本来我都是乐于回答的,可我的时间非常宝贵,除了有意义的提问,我都是建议提问者自行搜索(通常我确定搜索可以找到答案)。但有人也毫不客气的对我说“既然这个东西是你设计的,你就应该回答我的问题”。这给我的感觉好像我欠了他什么一样。他们觉得,开源作者有义务给你解答他想知道的任何问题。他们不知道,这个世界上,肯无私开源的人,本来就是少数,而一味索取的贪婪之人却比前者多很多。遇到这种人,我都懒得理,觉得有失身份。
在技术群或技术论坛研究问题时,用尽量简明的语言描述问题,说明自己的的目的,以及尝试的方法,报错信息等。事先在网上检索一些答案,验证过不行,或验证后想知道有更好的办法,再来提问。一旦有人回答提问,应当马上去验证。不要让回答问题的人等你有时间了才去验证。这是我最喜欢的一种谦虚的提问方式及学习态度,我自己也是这么做的。有时候有大神回答我的问题,我可以不吃饭,不睡觉,因为他们的时间是宝贵的,难得为我解答问题。
为了控制字数不影响阅读质量,这次的文章中省去了一些内容如:单片机编程学习的误区、如何多角度的看待问题等,后面我会另写文章来详细说明。
最后要说的是,我的经验始终是经验,只能作为参考,独立思考,应该从现在开始——在我的经验中找到适合你自己的方法!