[Other] 我是这样玩的~ ——回复@norda

Photobucket

感觉来你这边学到很多东西。现在我的51还不是很成熟,电子类大三的学生,个人兴趣是一方面,另一方面想着能学到些以后让自己比别人更有资本找到好工作的东西,所以目前又是Linux C又是51然后想从51再转AVR。。。感觉有电点好高骛远了。。。求指导
——norda 2012-01-10 15:33

其实很正常啦,我大三的时候面对林林总总的各种技术,也是晕头转向吧,高中VB,大学里C、ASP、C#、ASP.Net。06年大学毕业以后,因为不是计算机科班出身,也一直没有从事IT相关的工作,在一个非IT的圈子里面,完全是不会感觉到自己所学的正在慢慢Out的。2009年回家乡工作以后,才重新捡起来玩。基础虽然是有,但是基本也是忘记得比较多,甚至跟不上时代(好在.Net的东西,基本就是那么回事,IDE还变得更加人性化)。倒是基础都还好,语言本身或许有所变化,控件库越来越强大,但是思路啊,逻辑啊,都还是比较清晰。而接触硬件的好处在于,是有实物做出来的,成就感比一般程序好很多,而且通过视频能更好地进行展示,这样分享的快乐,比代码被匿名下载的感觉是完全不一样的。

至于你在学的几个东西,其实并不矛盾。

Linux操作系统非常NB,大牛级的程序员都是在Linux下面玩儿,所以,学Linux不会有错。我也希望有朝一日能到Ubuntu上来开发。这其实也是在学习Java,转用eclipse的部分原因,因为Java是跨平台的。同样,这也是放弃STC51的一个原因,因为STC的下载软件USB-ISP是没有linux / Mac 版本的。就因为这个,老姚鼓吹“中国MCU公司统一全球市场”的那一天就肯定就不会到来。而反观AVR,以及以此为基础的Arduino就好很多。Processing也是基于Java的“语言”(或许称之为框架更合适一些),同样具备跨平台的特性。Arduino也是一样,原生IDE在各个平台上都能用。

C 算是各种高级语言的始祖吧,有太多经典教材,关于算法、数据结构的教材大都以C为基础,打好这个基础非常关键。在此基础上学习新的语言一点就不会难,至少说如果C里面那么诡异且严谨的程序写法都能看懂的话,未来除非碰到像Ruby那样诡异的脚本语言(a,b=b,a 这样就直接实现变量互换……),一般情况下学起来不会很难,毕竟基本就是语法的切换。但是,要注意的一点,就是纯C是面向过程的,而非面向对象,所以在移植、扩展和升级过程中会遇到相当崩溃的事情。用C把程序搞得很强大,是很厉害没错,但是自己学的话,不推荐用C去实现一个很牛逼的程序,真的很难,我个人目前的极限,也就是个俄罗斯方块。所以,算法、逻辑是靠C来学,但是不要局限于C的编程思路。C语言已经一把年纪了,而编程方法,设计模式却一直在进步。

至于汇编,我确实不会编,也没有去学的欲望……

至于51和AVR,对于我来说,学习51能更快了解到单片机里面都有什么东西吧,知道寄存器、中断这些是什么概念,也熟悉了一些简单的数字应用电路,知道芯片的数据大致是怎么回事。这里是位运算大显身手的地方,而且毕竟硬件资源有限,所以也逼人把C语言玩得更精,倒是不错的挑战。

而学习AVR的时候,其实学了两下我就跳出来了,因为在应用层面来讲,想在AVR上实现的功能,借助Arduino都能实现(至少对于我想做的东西来说是这样),虽然中间多了一个Arduino感觉执行效率会低一些,但客观来说,AVR运算速度本来比51要快,在牺牲一定速度的情况下,获得极佳的扩展性,这个牺牲是值得的。就像从C发展到C++,一个在栈,一个在堆,执行效率其实也是降低的。但是,代码得到更好的封装,可移植性、安全性更是强大了很多,这一点速度方面的损失,同样是值得的。所以,从应用方向来讲,与其深入底层去扣,不如直接基于Arduino做,而且能快速实现项目。而且Arduino平台也在与时俱进不断地发展,包括最近出现的以ARM为内核的Arduino硬件平台——Maple。所以,在我看来,把应用做出来,比深入底层去研究某款CPU更具有实用意义。看个人发展的方向,毕竟你是从电子专业的,考虑问题的出发点,会和我这样先开始玩软件的会不一样。

C#和VC++的问题,在上篇博文里说过,就是一不小心就让你开始玩控件库了,反而忽略了更加重要而且NB的编程思想(面向对象只是其中之一),虽然按键、文本框都是对象,但是说实在的,对于自己的程序模型没什么帮助。这方面Java就好很多,而且C#和Java的语法基本相近。所以,我个人也在从C#转向Java。而Processing又给我提供了一个很好的学习Java的切入点。东西很牛逼,但是不知道用来干啥,肯定是很痛苦。

对于个人的学习来说,首先,保持一个开放的心态吧,毕竟时不时就会有新东西冒出来,虽然程序员是一个比较“苦逼”的社会角色,但是学习肯定是他们身上必不可少的素质。一个优秀程序员,掌握多种语言也不是什么稀罕事,内功深厚,变招就轻轻松松。其次,学校老师教得毕竟有限,而且也未必跟得上行业的更新换代,更糟糕的是,学校里面教计算机的老师,许多并没有经过专业化商业程序开发的磨练。或许比较支离破碎的算法之类,可能还有点过人之处,但从整个软件工程的宏观角度来看,估计是很烂。学生去参加商业化的培训,总是很贵,所以就靠自学咯。还有,学习的话,多看引进版的教材吧,国内的大多数教材,还是比较快餐化,尤其是单片机的教材,很多甚至依然停留在“抄代码”,“烧写”,“看疗效”的套路,如果配合开发板的话,连硬件线路都懒得解释了。所以,如果没有基础的话,不会选择性地看的话,学得很累,而且学不到真本领,只能靠“读书百遍其义自见”,使劲去悟,很惨。国外的就不会,图文并茂,示例配合思维引导,效果会好很多,而且还配合大量的参考资料,能方便进行扩展阅读,进行相关知识的补强。或许,国家逼着大学生考四级,就是为了让我们看国外教材吧,想必是教委那些人也心里有数——咱自己的教材不靠谱。同时,学一个东西,不要指望一本教材就能学会,有的是上手教材,有的是系统教材,有的是强化教材,有的参考手册,有的内功秘籍,有的放在电脑旁,有的放在马桶边,有的放在枕头旁,都不太一样,但说的可能是同一件事情。最后,多实践总是没有错,虽然实现功能本身已经挺不容易了,但还是硬着头皮去不断优化它,甚至另起炉灶重写。每一个学习阶段,给自己订立一个实现的目标吧,类似于课程设计的性质,做个小项目把学到的用出来,纸上得来终觉浅,绝知此事要躬行。

最后,学会利用网络,利用视频、博客、微博、Q群,形成一个学习圈,分享圈,这样有人问,也有人帮。还能结识和自己专业产生互补的人,例如@低调@圣源@严泽远,一起完成项目,在此再次表示感谢。学会合作,自己真没必要“一条龙”样样通,学得很累而且也不太可能都搞得很懂。

以上纯属个人的体会,直至现在,我依然没有经过专业的商业化软件开发磨练,依然是以兴趣为导向,骚包为目的。那种有着严格开发周期的项目,我感觉也不一定应付得来,依然是个半调子,路还很长。

作真实的自己,作自己喜欢的事~

关于aGuegu

阿古 真名:官微宏,技术Geek,玩Arduino,玩Linux,爱Google,爱开源;现居福州
此条目发表在杂七杂八 | Other分类目录,贴了, , , , 标签。将固定链接加入收藏夹。
  • norda

    感谢还专门写了篇博文来解决我的疑惑。看了之后感觉自己的走的路跟你的相差不会很远——虽然你说你是软件出身的。我还是比较倾向于硬件吧,软件的话不想花那么大精力去学得那么精。

    • 本来是想简单回复一下,但是发现一两句话说不清楚,又有点话唠,干脆新写一篇就是了。至于软硬件的关系,我觉得其实是这样看吧:同样的解决方案,有的硬件做起来很简单,软件来实现却很麻烦,相反的情况也很多,思维开阔就更容易找到最优方案。而电子这个行,要深入玩下去,值得去精学的东西也很多啦,我都报不上名字。加油哦~

  • vbcity

    我是一个电子行业的工作者,以我过来人的意见是:未来的趋势是软件为王,硬件为寇。未来搞纯的硬件板级的设计的话,将是一个没有前途的工作,纯属于一个抄板员的工作。因为所有的硬件设计工作都将由IC设计公司提供,硬件工程师所能做的就是换个PCB重新布局一下而已。
    这一点也在市场上得到了体现,相同工作年限的硬件工程师的工资水平要低于软件工程师至少20%的水平,而且趋势是越来越明显。所以建议你纯粹的搞软件,硬件就让深圳那边的人去搞吧。
    如果你真的喜欢硬件的话,还是建议你继续学习到研究生水平,出来可以找到IC公司的集成电路设计职位,相对来说比搞硬件的比较有钱途。
    但是希望你别走错方向,俗话说“男怕入错行”,到时候想转也会来不及的。

    • 谢谢前辈。
      就自己的目前能力来讲,比起硬件,其实我对我的软件能力更有信心一些。其实玩Arduino并不能在严格意义上称之为“玩硬件”,毕竟许多组件都是现成的,而且“积木化”了,搭建硬件电路非常简单,而且功能的实现,总是需要通过软件的,而且数字电路嘛,本来就不是特别复杂。至于纯粹搞软件,毕竟还是在应用电子这一块的话,缺少基本的硬件知识,也是很难施展拳脚,所以都学一些咯。就我个人来说,并不是特别对立的事情,而我日常的“修炼”,也一直是以软件这边。
      至于,入错行的问题,或许很早就错了吧,你肯定猜不出来我现在在哪一行,嘿嘿,不过也还好,总是一份经历~

  • 作真实的自己,作自己喜欢的事~
    同意