先自我介绍下,本人是一名软件工程师,身为IT战线上的民工,深感IT这碗饭吃的不易。当然本人大学就读专业是电子科学与技术,同时呢也想给专业是硬件专业想从事软件的兄弟姐妹们一点思考和参考。
先说说软件知识的研究学习吧,当然了,硬件专业主要学习的是物理课程,有半导体物理、dsp、单片机、模电数电等的课程,一般来讲主要涉及的还是硬件方面的知识。当然他也是分出两块出来:一块是信息电子,和通信专业的电子信息有点像,只不过电子信息涉及到网络方面的课程会多些,自然通信方面的课程量也大些。信息电子会着重往fpga、dsp、arm这样的方向靠些,简而言之之后可以从事的方向:嵌入式开发将是比较明显的开发。当然单片机开发、电力相关方向开发、无线设备电路设计也都包括在可就业的范围之内。 而另一块呢,(一时半会想不起名字了),主要从事的是显示设备、半导体工艺、新能够、高级电源等纯硬件方向的研究,自然大家也知道这个算是地地道道硬件工艺研究了。这个不在话题之中。那么如果从事信息电子方向,有部分人可能会直接间接转到软件方向来,比如我就是。那么对于想转到或者由于某种原因转入软件相关开发的同学来说,会经历哪些问题呢?
大家都知道,学习会经历四个过程:不知道什么不知道,不知道知道了什么,知道了什么知道了,知道了什么不知道。而对知道的体会也会经过三个阶段:觉得好多好多东西要学,觉得东西学得差不多,发现还是有很多东西要学而且永远都学不完。我呢,也是经历了这些过程。大学开始接触软件的时间应该说是从计算机软件基础来说。当然大家应该会知道这个是基础到不能再基础的课程了。但是由于我家里都没有电脑,在大学之前也没什么接触电脑(就高中一个什么电脑课程接触了下),所以电脑使用上还是属于新手。但是我进入大学有个愿望,就是想学非常多非常多的知识,最好全部都会。所以我努力疯狂的阅读各种各样的书籍,涉猎的知识当然包括什么心理学、经济学、哲学、数学,还有一些成功励志的、开发人脑的书籍。毕竟追求拥有聪明的大脑、想通所有的事情、拥有渊博的知识,解决所有的难题是我不懈的追求。当然追求的时间我是有限制的,并没有拿大学所有的时间来进行研究,因为大学就只有4年,这样成本太高。所以我只给了自己一年半的时间,接下来自己就做了个决定:要成为计算机行业的专家。于是我又开始努力学习计算机方面的课程,白天除了上课我就是泡在图书馆里,然后晚上的时候我会去机房疯狂的上机,把自己学到的知识转化为实践,不断提高自己的计算机水平。当然功夫不负有心人,很快滴,半年的功夫我学习了计算机的基本入门课程,还意外的攻入了学校的交换机,于是很意外的在年段中出了名,成为一名“黑客”。这些当然只是计算机入门的开始。
接下来的一年里,由于知名度提高的原因,有高手上来切磋。通过他的交流,我认识了linux,在他对windows鄙视和了解到linux开源的号召的情况下,我对linux产生了兴趣。开始熟悉了解使用linux,学习他的基本用法,系统内核等。当然说实话,因为当时软件这块对我们专业来说,懂得的人太少了,所以你只要会那么一点点编程语句、操作知识,大家都会觉得:恩,你这个软件蛮强的。其实呢,说实话,由于当时软件的专注点错误,所以当时只是一直在学习计算机的操作知识,对于软件的编程概念一无所知。至于当时看linux的源代码呢,说实话只看懂了基本的文件夹结构,还有微量的启动代码,对整个系统的设计、基本的数据结构的设计(当然指的是数据结构设计的原因,为什么这么设计,这么设计有什么好处,除了这么设计,还可以怎么设计,这些设计之间的区别是什么)这些问题毫无思考、毫无研究,差不多属于从来没想过这些问题的情况。所以本人实在惭愧。说来时间也快,后面就开始参加校园招聘了。很庆幸的是,在招聘的前几家公司中我就应聘进入了公司。自然很快得公司就要求我们去参加实习,说是实习,其实是廉价劳动力。
接下来说说我在实力技术的成长情况吧:其实我在实习的时候做的是界面设计的工作,即UI设计。我想如果没做过软件设计的兄弟姐妹们,可能第一感觉:这个UI设计嘛,恩,就是设计用户的界面使用用户更好的使用理解整个软件嘛,让用户在不用别人教授的情况下就可轻松使用软件。话是这么说:但是请问,给你一个系统,你怎么设计呢?从哪开始设计呢?你可能认为:我们可以把用户需要使用的功能列出来,然后将功能翻译成界面就好啦。恩,对,实际中的确也是这么做的。但是关键是具体怎么做就是另外一回事,这里面的细节就是千差万别了。对于UI设计的资深人员来说:可能一个控件的长宽高都是需要严格进行限制的,因为这个直接影响到整个界面的协调、美观,和操作系统的协调一致。但是作为一个第一次接触UI设计的我来说:在我看来,其实怎么摆都一样啊!因为我一摆上去,我都知道这些功能是啥啊!真的,当时真的认为摆在哪里其实都是差不多的。所以虽然老大对我的设计一直都不满意,但是我自己始终不明白自己设计是哪里出了问题,知道多年以后,才理解到:原来界面设计都是有模板套用的,需要多年的软件测试使用体会感觉出来的,如果你自己不多去认真的体会系统界面的设计,你还真感觉不出实际上的那么点点微小差别。因为软件的使用上,一个刚接触电脑人的使用和一个电脑资深的使用者、一个高级编程人员使用电脑上是两码事。每个人都有自己使用的各种方式。而软件的设计也是要针对人群而进行相应的改良设计,这样软件才能被使用者接受。
接下来再说说,后面我干了啥。后面我正式进行了这家公司,当然由于我在实习期间的拙劣表现,我未能继续在UI设计上继续做下去,换而做客户端的软件代码书写。当然也是鉴于自己在代码书写这块写的代码量实现是太少了,所以刚开始写一个很小的软件功能,自己写起来一点底都没有。只是很简单的到网络上去copy。当然,你想想,对于一个自己根本没有接触的领域的代码,请问你会是一种什么心态呢?当时丈二摸不着头脑,什么com、mfc啦,不熟甚至不懂。而代码的逻辑呢,可以说没有逻辑,最直接的逻辑啥呢?那就是程序的执行流程怎么走,我们就怎么写。你想想这样会是什么结果,那就是代码都是一句一段凑出来的。我想要怎么功能呢,网络上找,找到了copy进来,直接运行,一个语句一个语句跟啊,一个变量一个变量看啊。为啥?因为实现不相信这些代码能够正确执行。为啥呢?因为一直在做硬件的缘故,所以习惯于写某个软件,要把软件里面的每步逻辑都搞得清清楚楚,脑袋里面可以把整条执行的路线想清楚了,才认为这些代码自己清楚明白他们在干啥?而后面才清楚了,其实软件并不是这么写的。其实他是一种思想的产物,只要你分层分清楚了,逻辑概念上ok了,那么代码其实更多的逻辑执行的代码,而非真正意义上的指令执行。所以当时的思维会造成一个什么结果呢:C语言式面向过程编程,函数命名随便来。为啥,因为在那个编程里面:流程的执行比函数的分类更重要。就是说:这个函数的名字是啥不重要,重要的是整个流程哪边接过来,这个要到哪里去。也导致了一个最直接的问题:一个问题出来了,我查不出到底是哪里出了问题。为啥,因为我只知道整个流程,但是却不清楚这些流程怎么分层执行。
鉴于,代码设计也没学好,可能自己是硬件专业的缘故吧,先前有做过usb相关的,被老大派去做usb相关的事情。但是其实做usb底层驱动的事情更加糟糕。为啥呢?学了几年才知道,usb驱动调试的技术非常的高级,是你要你的经验、代码量达到一定程度上才会理解里面调试的重要性的。usb驱动主要考验的是你的调试能力、分析能力、整体的架构能力。而这些你说对于没有什么大项目经验的我来说,实在有点勉为其难了。所以拿到一个支持单过来,我的第一反应是:先熟悉,了解上层程序的基本使用功能。说实话吧,其实很早的时候我就看过了intel奔腾处理器结构、半知半解的读了linux源代码解析,虽然大体了解了他们所讲的内容,但是里面精髓的东西实在不知啊,因为对于一个人来说:他刚开始读,后几年经验后再来读是完全不一样的认知水平。这种东西又很难说,只有你自己会真正写一个操作系统了,你才会真正理解到里面的设计巧妙、博大精深,要不总是在外面看门道,觉得呢,好像她也不就是那么几个指令在那边跑嘛,没啥特别的。但是你能不能写插件修改别人代码的功能,破解别人的软件那就差别大了,体现的是就是思维、设计、架构了。还有完成这些功能的时间也很重要。所以需要在实践中不断学习、领悟。
后面换了家公司,有了一个比较友好的顶头上司,他有很多很好的设计理念,可以对代码进行很好的分层管理、维护,让我学到了很多。当然这里学习了机构设计的一些东西,虽然学完后看起来,觉得软件无非就是代码写写嘛,api的东西谁不会,但是如果你做了大型的项目好像真的有那么一点不一样。不一样在哪呢,第一你可以快速看懂你从未见接触过的代码了,而且可以轻松的从软件崩溃的现场得出软件崩溃的真正原因。再者有一点:你的熟练度提高了,api很熟悉,代码设计架构很熟悉,也学会了很多避免错误的设计手段,提高软件扩展性的实际模式,知道了如何通过设计架构降低软件的维护成本、减少软件出错的概率。这一切的一切还真得好好研究的了。当然这里面如果这些这些你都学会了,你已经是一个代码熟练工了,可以很快速的开发软件了。但是在软件的开发过程中,又有问题了,很经常的你要接手别人留下来的软件,当然很多情况下别人写的代码问题一堆啊,很容易出现崩溃、泄露什么的。这时,新课题又来了,你还得学会软件调试,学习如何高效的进行错误的定位。而当你对一门语言比较熟悉时,问题又来了,因为语言都是有缺陷的,这和它的设计初衷是分不开的。所以如何快速高效的开发出好的软件产品出来,就需要你去综合各种语言的优势进行整合设计,提高最大的产能。软件行业真的是学无止境啊!
当然到这里,结局还没完,这个学习加解决问题真的是多的没法说:那就是如何控制软件开发中需求变化的问题,如何抓住需求中的有用重要的,去除多余、无效、浪费时间的需求。这个就把问题从技术的层面转移到了产品层面上来,甚至公司的发展层面上来。当然这里面也随即爆发一个问题:那就是公共库的整理、开发、存仓。因为很多开发其实是重复进行,而如果将设计中重复的元素提取出来,并且整理成一套公用库,无疑将极大的提高生成的效率。这又提升到了软件生成流程的高度上来。真的是有解决不完的问题。
这些解决方案的最终结果是:如何更快更好的推出用户希望的想要的功能,把握住市场中用户的粘滞度,获得良好的用户口碑。重大而严肃的问题。不要小看这个目标,你以为软件人员只要写写代码就可以了吗?如果是那样,那就大错特错了。这里面当然包括如何知道用户真正的需求、把握市场中用户需求的动向,将用户关注的功能做些,少做甚至不做用户基本用不到的功能,这个课题可就扯远了。整个产品的所有流程已经包括的差不多了。这也是很多软件开发人员直接就能够出去创业的一个重要因素吧。
所以,学习是需要一个过程的,过程中的酸甜苦辣还是蛮多的。当然如果你的理解能力比较强的话,大概进步的比较快。话又说回来,其实大家看嘞,软件好像就是那么回事,无非就是调调api的事情,但是里面却有这么多的东西要学,能产生这么一个庞大的产品,不得不说一个惊叹。至于什么时候是尽头呢,仁者见仁智能见智。不要跟我说:永远不会有尽头噢,我指的是对你自己来说。难道你想贡献终身为软件行业孜孜奉献,那么也恭喜你,精神可嘉。我想,软件有一个很不错的好处呢,就是可以构筑一些我们以前很想要的美好图景,做出自己想要的舒适功能,让自己的生活更轻松些,也算是一件是功德无量的事情吧