工做两年多感悟

       先自我介绍下,本人是一名软件工程师,身为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的事情,可是里面却有这么多的东西要学,能产生这么一个庞大的产品,不得不说一个惊叹。至于何时是尽头呢,仁者见仁智能见智。不要跟我说:永远不会有尽头噢,我指的是对你本身来讲。难道你想贡献终身为软件行业孜孜奉献,那么也恭喜你,精神可嘉。我想,软件有一个很不错的好处呢,就是能够构筑一些咱们之前很想要的美好图景,作出本身想要的温馨功能,让本身的生活更轻松些,也算是一件是功德无量的事情吧