在攻城狮、程序猿的圈子里,文人相轻的现象可是非常普遍的,在程序设计的各个领域里都有着错综复杂的「鄙视链」。从硬件到软件,从程序语言到编辑器、从算法到操作系统。
做fpga表示谁都瞧不起。瞧不起搞芯片的,天天折腾那几个触发器与非门,两年就写那么几行代码,真是浪费生命,关键是做出来的东西还不能改。
做芯片的瞧不起搞驱动的,有毛意思,天天就对着我给的寄存器配置一下,读写一下,里面的原理实现一窍不通,关键问题定位还要我来搞。
做驱动的瞧不起搞算法的,一副高冷的样子,还不是对着别人的paper翻译一下,那几个公式又不是你推出来的,都是对着别人好多年前的公式抄一通,有啥牛逼的,最后资源优化架构优化还不如靠我。
做算法的瞧不起搞上层的,只会调调api,连内存在哪里都不知道。
做arm-linux的瞧不起搞单片机程序的,来个多任务多并行分分钟把你搞死机,管你上什么操作系统还是裸机。
做c语言瞧不起搞java的
做linux的瞧不起搞windows的
云云...
这种现象的存在其实是每个领域的开发人员只看到自己工作的价值,只是从自己工作的角度去理解未知的领域或者知识,就像FPGA最大的特点是在于可编程性,电路的可订制性及保密性,那它适应的领域就必然是那些需要对电路进行专门设计的领域,通常在军工,电力仪表行业应用比较广。
一般的领域,通用的电路就可以满足用户对硬件需求,所以我们看到通用的处理器在市场中得到了广泛的应用,开发人员可以不需要把时间花在电路设计上,而把精力更多的放在如何根据用户需求快速开发出符合要求的产品上。
FPGA和芯片还是属于硬件的范畴,最终做成能满足用户需求的产品,仅有硬件还是不够的,如果没有软件,硬件的意义的作用如何发挥,这就是软件存在的意义。软件之于硬件就像精神之于物质,意识之于大脑。
软件大体可以分为系统软件和应用软件,系统软件就是我们常说的操作系统,在嵌入式领域应用最广泛的是Linux,在个人桌面最广泛的是windows,而题中所说驱动开发就属于系统软件的范畴。
先说下驱动开发和应用开发的区别。
以IPCamera为例,应用开发关注的是如何管理用户连接,如何对音视频数据进行缓冲管理,如何处理多进程或者多线程的并发等。
涉及到的知识可能就是文件io操作,多线程,网络编程,有C语言的基础,掌握相关的系统调用(文件,线程,网络,同步机制)等操作接口就可以了。
而做IPCamera的驱动重点就需要关注芯片的工作原理,如何在Linux操作系统把芯片驱动起来,对于驱动的开发者来说除了需要具备操作系统原理相关的知识外还需要了解硬件相关的基本知识,所以驱动的要求会比较高。这也是为什么驱动开发的工资待遇会比招应用开发人员的高的原因,因为对开发者的要求高。
如果从嵌入式产品开发周期的角度看每个阶段都是不可或缺的,前期硬件pcb板的设计,当单板从产线上下来后,底层驱动才开始调试,这个阶段也很重要,只有当引导程序(bootloader)操作系统boot up成功之后,才能进行后面的应用程序开发。
应用程序也很重要,因为和用户的需求最近,应用程序开发好后,还要有测试团队负责给出测试数据,对程序功能进行测试,给出结果,开发才能根据结果对程序进行优化调整,最终完全符合客户的需求。
所以从产品开发的完整周期看待硬件,软件,驱动和应用,才不会狭隘的认为只有某个部分比较重要。
(推荐《程序员的十层楼》,可以帮助程序员为找到自己的位置,到底在哪一层楼。)