根据我自己的想法和理解,IT技术体系并不能单纯地划分为软件和硬件(有些时候,持这种理解的人问的一些很嘲讽性的问题会让人吐血的),硬件我并不是十分精深,模糊中我认为纯粹的硬件应该分为模型和电路系统这两个部分,模具制作应该是属于模型的,PCB板属于两者都有,电路设计是画PCB的基础和前置条件,理应属于电路系统。两部分难度不分上下:模型需要更多的考虑环境和人的因素,电路则更倾向于技术知识。但是根据我看到的一些情况,往往懂技术的人不少,但真正能结合模型去思考电路(也就是根据实际情况,使用者的习惯,质量,外观等因素)的人在大学生中真的不多见。如果在本科阶段就能在技术之上结合模型相关的考虑,那么这个做底层硬件的人算是真的“硬起来”了,在就业过程中应该会很受欢迎的。
有人经常会想单片机到底属于哪一块的东西。我这里的划分仅仅是凭着“代码”来作为依据,并没有太大的实践指导意义,仅仅是为了更方便的说明问题,做一个归档罢了。单片机在我眼里属于软件的最底层,但是考虑到软件都是建立在硬件之上的,即使是最底层的软件,也应该在硬件之上(上下并不止价值和难度,只是指在架构中处于的逻辑位置)。往往处于架构结合部的技术都是属于难度非常大的,但是单片机是个例外。也许时光倒退个几十年,单片机的确是一个难点,但是到了现在,单片机的难点正在逐步因为其自身性能的提高,软硬件技术体系的完善所侵蚀。功能越来越完善的IDE、越来越丰富的片上资源、功能完备文档健全的API、统一封装的功能模块等,这些因素使单片机编程越来越成为一个引导新手入行的工具:现今软件的难度主要表现在大规模系统代码设计、技术选择和架构上,单片机的应用特殊性注定其代码规模有限(单颗处理芯片);硬件系统中的封装思想愈加完善,底层模拟实现逐渐被API屏蔽。不过任何事情想要精通还是很有难度的,单片机也是如此,属于入门容易,精深有难度。这个难度主要体现在代码规模的膨胀和为了充分利用硬件资源而进行的代码改革优化。代码规模的膨胀需要编程者向纯粹上层软件体系学习架构、设计模式、算法优化等领域的知识;硬件资源的发挥也在于编程者对模块底层实现、单片机的底层实现有一个充分的了解,主要表现为基础知识数字模拟电路以及他们的引申知识(诸如EDA,高频模拟电路或者类似通信等专精的电子领域知识,关于单片机和这些相关技术的学习我建议去http://www.51hei.com/ 里面的教程比较人性化)。另外我个人建议对于并发,多核编程有所了解会有助于跟上时代的步伐,毕竟这已经不再是 80C51横行天下的时代了。
一路往上走,单片机之上应该是嵌入式系统相关的东西了。我在专注于嵌入式的学习之后和一同学习的兄弟探讨嵌入式系统,觉得嵌入式系统的难点关键在于广,而一个真正的大牛会在广的基础上对这些广泛的知识做进一步深入的研究而达到精神,并且对于某几项技术做到专精。因为嵌入式系统其实也是建立在MCU、CPU 之上的,上文所述的知识体系对嵌入式系统学习者同样有效。但是与纯粹的单片机编程相比,嵌入式系统的难度还体现在系统。除了要对软件体系的基础——操作系统要有着十分精通的了解以外,基于操作系统环境下的编程代码规模成几何倍数的膨胀,同时带来的还有测试和调试难度变大,手工测试已经无法满足要求,而自动化测试代码覆盖率也很难保障。基于操作系统的编程在学习过程中十分复杂(一旦掌握了开发起来倒也没那么痛苦),要了解各种API,操作系统的各种调度机制和其架构体系(不然怎么写驱动)。而对于专业领域上还有一系列让人望而生畏的东西,比如说智能算法,图像分析,稳定性实时性要求等等。我在这里没事掰着指头算都要算很久,就不一一列举了。但是我着重要提到的是,嵌入式系统这个名词中系统二字代表的并不是操作系统,而是指更加广泛意义上的系统。具体解释有兴趣的去翻翻系统论(与控制论,信息论并称三论)。一旦从模块级上升到系统级,考虑的问题各种各样,有兴趣的去翻翻软件工程吧,虽然写着是软件工程,对于硬件也同样适用,个人觉得对于工程二字都不怎么了解的人有何脸面自称工程师。那么需求工程、架构设计、编码规范、编码管理、系统测试、项目发布等领域的知识多少也要懂一点的(没人愿意一辈子当小工吧)。然后别忘了还有人机交互,这个界面其实十分十分关键,开发过程中你至少得花30%以上的精力在这上面。
像android,windows phone,ios之类环境下编程如果仅仅是做个应用丢APP去卖的那种的话,根本算不上嵌入式系统(别以为写了个非PC程序就算是搞嵌入式了,差别太大了),也就是一般的计算机编程加点佐料而已。
在往上走一点,那应该是传统意义上的计算机编程了。这是一个十分蛋疼的东西,因为涵盖面过分广大了导致很多人都快累死了也搞不明白那是啥。还是老规矩从下往上说。最下面的应该是BIOS,这个不能被忽视,就跟嵌入式的bootloader为代表的引导程序一样,是整个体系不可缺少的一部分,当然PC上的 BIOS我没有太多的了解,也就不班门弄斧了。我只是想提一下汇编这门语言的重要性。我大一大二的时候经常性有学长跟我说,汇编这种东西都快被淘汰了,没有搞头啊,不如把时间放在别的方面。我觉得这是一个误区。对于所有有志向在软件编程上有所成就的人来说,代码的效率,功能往往是重点中的重点,而汇编正是效率和功能最佳的伙伴。我这么说不是让人都用汇编去提高效率实现功能,这对于这个时代来说成本太高,根本不科学。我要说的是,学习汇编这个过程能够帮助所有学习软件的人能更好的理解硬件,理解底层。有了理解后,产生的代码自然而然会对一些效率上的硬件障碍有所规避(比如经典的乘2操作),对于这点无论是用什么上层编程语言来编写代码都是一样的。此外,会汇编,你懂的,可以干很多坏事的(为了网络环境的和谐这些请自己领悟了)。
(时间有限,我写得累死了,下面开始稍微简洁一点,等哥满状态复活了在以后的日子逐一论述)
BIOS之上是操作系统,这个其实跟嵌入式很相通的,最多操作系统种类有所区别,然后要求、性能也有所区别。这里关键是要了解操作系统的运行机制,一些系统级常用算法数据结构啥的(别觉得没用,这些东西才是好东西,自己做稍微有点规模的系统时候有用得很,毕竟是一群大师的智慧结晶)。我坚信一个不懂得操作系统运行机制的人写的代码也好的有限。
操作系统之上的东西又海了去了,比如网络啦,数据库啦,并发啦,人机交互啦,测试啦等等(发现没,哥说的都是通用型的技术,绝对不搞技术阵营化,微软跟甲骨文闹多大都跟咱没关系,微软倒闭了地球也照样转的,别到时候哪家公司倒闭了自己也跟着失业)。这些是纯粹技术上的东西。这个时代比较流行的就是这些啦。网络大家都懂的,多扯也没意义,学TCP/IP协议族有多恶心看过的人都知道,但是看过跟没看过区别还是十分大的。一些眼花缭乱的技术比如P2P之类的都是基于基础的网咯体系的,看基础知识总没错的。数据库也是当今软件不能少的东西,但是关键能力还是在于数据库架构能力,数据库管理维护能力,表结构设计能力等,在此基础之上可以去搞某一种数据库的专精(甲骨文是好东西)。并发是经常被无视的,但是没有并发哪有现在的软件体系,其重要性各位看官自己心里都应该明白。人机交互对于我们这些代码男来说是最痛苦的,但这年头就属它最重要,第一映像嘛。这个跟把妹钓凯子一样,长着一副*丝样,就算有颗高富帅的心路人也不会搭理你。
另外一块就是WEB技术体系咯,近十年最火的东西。照理说我应该多扯一点这方面的,因为内容真的很多,但我个人对其的看法是眼花缭乱前路迷茫。这并不是指的是WEB技术即将会没落,而是对开发时程序员的状态和技术体系的运作模式表现出一种模棱两可的态度。WEB技术体系是当今发展速度最快的技术体系,百花齐放,各种框架和技术实现争奇斗艳,更新换代十分快,单拿出某个具体技术进行品头论足实在没什么意义。任何人看到这种现状第一反应就是好累,这种生活是一种看不到尽头的生活。我只能说,多关注WEB技术的底层,框架的范式型实现规则和技术,通用型技术架构,交互模式,高并发后台支撑容器,容灾等等东西。最后的总结在于:会个具体技术当敲门砖开路不错,最重要的还是学习新东西的速度,速度跟不上,别人讨厌你不说,自己也会活得很累很痛苦。
最后我扯一下项目管理的东西,这并不是一项需要很多精力去翻书查资料去研究的技术,但的确是最为重要的东西,即使没有一颗成为管理者的心,学一下这些东西也能让自己更能被管理,理解管理者需要面对的困难会有助于交流,从而使整个项目推进更加顺利,思想更加统一,也能为自己争取到更多机会,从更高的层面看待整个世界,也会有种豁然开朗,一切尽在掌握的快感。
句句肺腑,也算对自己的一个总结。
上一篇:关于单片机的输入与输出
下一篇:不用网络照样可以打字聊天