
比赛结束了,不少同学来咨询山外对智能车和未来学习的看法。山外就不一一和大家私聊,直接论坛发个帖子,仅供参考:

山外的观点如下:
1、智能车比赛,跨多学科,确实是很好了解工程开发的练手比赛。
新手,刚学基础的C语言,单片机,PCB等,并没形成项目开发思维,例如团队合作,开发进度控制等。拿智能车比赛来练手,可以很好查漏补缺,知道自己缺乏的知识点在哪里。可以收获志同道合的朋友,毕竟这一年,大家一起经常通宵熬夜攻克难题。夜深人静的时候,孤独和挫折,感情升温特别快。

2、智能车比赛,非常耗时间,不利于更广泛学习更多未来工作需要的技能。
这比赛,长达一年的准备,非常耗时间。而且,比赛进行到后半阶段,大部分时间都浪费在参数调试上,非常浪费精力和时间。大学时光匆匆,短短4年时间,而真正工程师需要的技能非常广泛,难度也非常大。
学生阶段,坚持以学习为主,项目开发为辅,把大学时间都消耗到比赛上,真的不划算。
3、智能车比赛,虽然跨学科,但实际上很难深入研究各知识。(除非你真的耗时间去研究各种知识了)

例如,上位机编程,做智能车比赛,很多同学都用到上位机,但实际上能真正有上位机编程能力的同学非常少。因为比赛的难度很大,很多同学都把精力集中在调试小车上,忽略相关技能的学习。
例如,单片机开发,虽然提供库,但很少同学会深入研究库的开发步骤,思路。例如如何方便切换IO,LCD等。绝大部分同学都只停留在用库的阶段,没足够花时间去自己动手重写库。
4、连续参加多次比赛的同学,大部分是没有新目标
他们之所以不停刷成绩,大部分的表面理由是不服气,遗憾,老师要求。除去考研加分等特殊情况外,其实大部分第二次参加比赛的同学,都是缺乏新目标,对未来工作方向迷茫,于是他们选择逃避,继续原路走。

读万卷书不如行万里路,行万里路不如高人指点(但你也必须具备被指点的基础和悟性)。课堂学习,就如同读万卷书;智能车比赛,电设比赛,就如同行万里路;缺乏师兄等有经验的人带路,大部分同学都会陷入迷茫,原地踏步是他们无奈的选择。
(当然,如果你是第一年打酱油,第二年助力,第三年怀着情怀指导,这是没有问题的。)
不要迷恋老师,绝大部分的老师都只会照本宣科,成不了高人来指点我们走出迷茫。(一般老师都脱离企业研发)

我见过有一位同学,第三年参加智能车比赛,他的说法是老师要求,帮学校提高成绩。实际上,从他提问的技术问题看,他对我们的库完全不了解,找bug思路也完全不熟悉,一点也不像老手。
5、不要看重智能车比赛的名次
智能车比赛,需要的知识,和真正项目开发的知识,还是有非常大差距的。能给得起高工资的公司,基本上都收下不少参加过智能车比赛的同学简历,知道他们的含金量。

比赛成绩,最多成为你们简历上多一行介绍。如果你的最终简历是以智能车比赛为主体,基本上高工资的岗位都与你无关。例如,做平衡组的同学,以为以后可以找平衡车研发这类的工作,实际上平衡车早就烂大街,已经有现成的廉价成熟方案。
作为一个技术主管,不会在乎你的比赛成绩多牛逼,而是在乎你的技能是否符合他的岗位需求。而技能的深度学习,需要你们静下心花时间去磨练,而不是智能车比赛那样耗时间调小车。

山外是拆智能车比赛的台吗?
非也。纸上得来终觉浅,绝知此事要躬行。人,每个阶段都有不同的目标。大学,实际上也可以分为3个阶段:
1. 初出茅庐的纸上谈兵
2. 久经沙场的实战磨练
3. 踏破铁鞋的实战与理论相结合,深入研究

课堂学习,如同纸上谈兵。智能车比赛,或者电子设计大赛,就好比实战。是进阶过程中的重要一环。缺乏实战的洗礼,就好比万卷诗书看转愚,就是读死书。大学中,电子编程类的同学,没经过比赛洗礼,绝大部分的同学出来社会后,最终都会抛弃自己大学的专业知识。所以,这是拆台吗?
我上面的观点是,每个阶段都有不同的目标。已经参加过一届智能车比赛的同学,可以进阶更多的专业知识研究,而不局限于耗时长的比赛中。
初出茅庐的同学,我们依旧强烈推荐参加新一届的智能车比赛。

谈谈比赛后,该往哪些方向进攻?
经过比赛的洗礼,相信很多同学都已经找到不少自己的知识缺陷,都大体有进攻的方向。
山外是偏向于软件开发的,所以我下面谈的也是软件开发的进攻方向:
1.深度解剖C语言
课堂上学的C语言,蜻蜓点水,和工程开发的要求差甚远,需要进阶学习。如果你认为自己的C语言过关,请挑战论坛的帖子:每日一题
此书,自行网上下载。这书是一个指点我进阶的师兄推荐给我的,我一口气3天看完,头晕脑胀2天;再重头看一遍,觉得轻松了一些;如此反复看了几遍,就觉得如同1+1等于几的问题,不需要思考,条件反射就回答出来。从此写程序就开始脱胎换骨。

2.数据结构
此知识会大大提高你编程的效率和稳定性。队列,FIFO这些结构体,是编程中经常用的,例如智能车比赛里,无线数据的接收和处理,就是用队列知识,先入队存储,再主循环有空时出列处理。大数据存储的时候,二叉树存放,也是经常用的,例如我毕设时做的文字识别,存储文字的特征,就需要用二叉树去记录,方便识别时,快速查找特征。
毕业找工作时,很多笔试,都说要求现场笔试写出,队列入队,出队代码,FIFO的进出代码。不学数据结构,好比小学生学了数字,但不会加减号。

3.QT(C++)/.NET(C#)等上位机开发工具
QT的好处是跨平台,而且学过C语言的同学,其实很好上手C++的。网上的开源参考代码也多。山外的上位机,就是基于QT C++开发。
.NET C#是微软的开发平台,特点是开发速度快,window编程比较方便,也有不少的参考资料。但缺陷也有点,就是容易被反编译,所以重要数据加密处理需要用C语言写好DLL文件。

如果之后就职的是小公司,那么上位机开发能力,是必须要做到。哪怕是大公司,自己会写个上位机,加快自己的工作速度,也是必须的。
4.熟悉标准C运行库函数
这个是我到公司就职后,才发现标准C库的重要性。因为我大学写的window软件,都是用QT或者MFC,所以很少去学标准的C库操作函数。
那到底标准C库重要性表现在哪里?

首先,Window和Linux系统,都支持标准的C库函数,所以用标准C库函数写出来的代码,都可以跨平台使用(需要重新编译)
其次,可以容易编写命令行执行的程序,即非gui的程序。非GUI程序,有何优势?举个简单的例子,IAR编译后,都可以选择执行命令行程序。例如公司要求,每次编译后,bin文件,都必须按编译时间,命名,并保存到指定目录,以做备份,发现bug时,就会烧录之前的文件,查看bug从哪里开始引入。
实际上,公司里,很多数据处理工作都写一个命令行程序,而不是写一个上位机来慢慢点击完成。例如,我们提供的K60代码包,里面有个"清理临时文件.bat",里面实际上就是CMD执行命令行程序,来把IAR生成的临时文件删掉。

用法,实际上非常多的,例如从MAP文件里,提取函数的执行地址和大小,然后生产数组,追加到bin文件里(IAR编译后,自动执行命令行),这样APP程序可以根据PC指针和SP寄存器,找出当前函数和上一个执行的函数。
我们论坛,实际上经常面临大流量攻击,但如果找到对应攻击的IP,就可以直接封掉IP,就不会对服务器造成很大影响。所以,之前山外也用标准的C运行库,写了一个基于linux系统的防火墙软件,监管每个IP的流量,从而对异常流量的IP进行屏蔽。
5.uCOS-II 或 Linux 系统,值得深入研究一番
uCOS-II是实时系统,很多嵌入式系统的思路都和uCOS大同小异,而uCOS的资料多,代码风格也比较好,值得深入学习。很大单片机类的公司,都要求会实时系统,例如物联网的设备端,跑uCOS系统是非常常见的。
Linux系统,现在物联网,基本上离不开的。绝大部分的服务器都是linux系统,就连安卓系统也是基于linux内核的。当年我们学安卓时,需要在linux内核里,打个安卓补丁,就变成安卓系统。山外论坛,这个服务器就是基于Linux系统搭建的。

如果你的目标是物联网或者大数据方向,那么以下一些知识,也是需要掌握的。
1.PHP,服务器的程序,基本上都是PHP编写的。
山外论坛,很多插件都是基于PHP编写的,实际上,山外也会写一些基础的PHP程序。做物联网,一般我们是用别人的框架,但自己也得有修改程序的能力。

电子软件工程师,一般都不学,但搞物联网,不学就没法写服务器程序。
2.SQL,数据库
这个不用说,服务器肯定很多用户数据保存在里面,肯定需要数据库存储的,而SQL就是操作数据库的语言。
3.Python
这个是写开发工具的好帮手。网上非常多的开源代码。据说,卓晴老师很多很炫的教学软件,都是用Py来开发的。例如写个网页爬虫,或者写个jlink的上位机,网上都有很多参考资料。

现在很多人工智能,大数据处理,很多都是用这个语言来展开工作的。
爬虫,这个自己获取网页上大数据,或者获取相关的资源,都非常方便。例如,公司要求你调查某个产品的数据,可以用py写个爬虫软件,把网页里相关的信息爬虫提取出来,来做统计。
4.Android Studio (Java)
安卓已经成为主流手机平台,那么app的开发工具Android Studio,作为程序员,没理由不会开发手机程序的。(下方有提供学习资料,非常好的资料)重要性,我就不多谈了。
虽然现在谷歌在推广新的开发平台,但就目前情况看,Java开发依旧是主流平台。

上面是学习方向,下面提供一些山外自己网上购买的学习资料。上面谈论的知识,并不是每个我这边都有资料。例如有些大学学的知识,现在山外已经毕业多年,就没保存的。
大家根据进攻的方向,选取一些学习资料:

这是程序员相关的方向。硬件相关的话,高速数字电路、微弱小信号、电力电子、高精度测量、射频还有专门的custdown设计,都可以研究一下。哪一门学精了都可以靠它吃饭。
