我的编程之路

来源:互联网 发布:浏览器缺少java插件 编辑:程序博客网 时间:2024/06/06 13:57

题记:晚上,无意中看到了一份ARM公司关于物联网的研究报告,重新燃起了我对物联网的热情,自离开物联网的世界至今,已有好多年了,蓦然回首,我对过往的无止境回忆不断涌上心头。思索了一个晚上,清晨起来便开始动笔,用文字记录自己近几年来在技术道路上颠沛流离的生活。

一、c语言和单片机

自己使用c独立求解问题是从数学建模中的一个过河的游戏开始的,一开始我并没有想过要使用编程来解决这个问题,但是随着问题逐步拆解分析,我忽然觉得计算机也可以做这个事情,数学模型离不开数据的训练,问题一旦抽象为具体的数学模型,就很容易通过计算机编程来解决,这可是计算机最为擅长的事情。也正是这个事情,让我自己真正认识到c语言的实际作用。不过那时候也只懂得基本的变量、运算符、表达式、控制语句、函数.基础库而已,这仅仅只是c语言的皮毛而已。此时,我还无法想象windows程序那操作简易的窗体界面究竟是怎么实现的,特别c程序每次都是黑屏白字的运行调试界面。

关于这种带有界面的程序认知,是Delphi首先教给我的,可能业界很多人首先接触到的是Visualstudio,我仅仅只是个外行。饱许现在的年轻程序员并不懂得什么是Delphi,Delphi如昙花一现,曾经风靡一时,最终急匆匆地退下历史舞台,我记得最后一个版本应该是Delphi8。运筹学课上,老师使用他自己编写的软件求解动态规划的问题,而这些软件就是用Delphi做的,这引起了我的兴趣,下载安装Delphi之后,便立马建立第一个项目,向导默认会自动创建一个窗体,这让我非常开心。不过,在我享受Delphi带给我很多便利的同时,也必然让我失去了对技术细节的掌握,而这一点认识深深地影响着我后面全部学习过程。与那些从微软MFC开发起步的同学完全不一样,我还浮于技术华丽的外表,享受着一点进步的短暂兴奋中。Delphi使用的可视化的Pascal语言,是一种面向对象编程语言,对那时候的我来说,与c语言的最大不同之处在于,它封裝了很多技术细节,涉及更多语法层面的东西,要求编程人员更加关注各种库以及API调用等问题。 

c语言的第二次深入学习是从单片机开始的,我始终不会忘记第一次点亮LED灯时的那种兴奋劲儿,它让我整夜都无法入睡单片机的C语法在原标准之上进行了简单的扩充,比如位定义volatile关键字等,因为单片机重点在于控制,因此对于端口操作的位运算比较多,这也让我进一步理解了位运算的现实意义。那时候不懂什么是上拉电阻、推挽式输出、漏极开漏输出、高低电平、寄存器等等、现在想来也挺可笑的,总之,在不断的自学中,懂得了定时器、看门狗、数码管、蜂鸣器、红外遥控、直流电机、步进电机、AD转换、DS1302,DB1602、24C08、AM2302、LCD等常用器件的基本操作,懂得了UART、IIC、SPI、1-wire常用协议,懂得了如何根据数据手册上的时序图编写相应的驱动程序,也学习了汇编程序设计,虽然单片机开发环境提供了启动文件的汇编代码,但是为了搞明白我还是专门学习了以下汇编语言,这也让我对寄存器,内存以及CPU的运行流程有了更为深入的认识。

 C语言的第三次深入学习是因为NF906这款芯片,这是法国Nordic公司生产的一款数字接口无线射频芯片,自带链路层协议实现,用于无线数据通信,视距1-2公里,具体的通信距离要看功放电路的具体设计了。由于项目涉及无线数控、电机驱动、LCD显示、继电器、串口通信等等,继续采用之前的编码习惯,代码变得臃肿和混乱起来,为了更好的组织程序,大量使用了函数、指针、结构体和接口处理,上位机程序采用Delphi编写,涉及多个模块,无线数传是物联网的一项基础技术,万物互联有了通信的媒介之外,还要有网络,当时比较热门的是Zigbee组网技术,TI公司专门针对Zigbee协议提供一系列的软硬件套件,蓝牙、WIFI技术刚开始崭露头角,并不像今天这样大量普及的程度.但是Zigbee因为功耗大的问题没有得到非常好的应用普及。

二、ARM和μCOS

进入ARM的世界是漫长的.ARM从来不做简单的事情,对于初学者来说,功能的丰富强大也意味着操作的更加复杂,第一关时钟配置就卡住了,ARM的时钟树在提供丰富的时钟频率的同时也带来了繁琐的时钟配置。第三方芯片生产商提供了友好的固件库,简化了开发人员的配置操作,由于基础功底太差,以自己那时的能力根本看不懂ST公司为STM32F10x系列提供的庞大固件库”笨人就用笨办法,死看代码,俗话说先混个面熟,跳转一个接着一个,历经几个月的迷茫,总算是有点眉目,渐渐熟悉了PLL分频器、PWM,DMA,AHB.CAN,USB,JTAG等模块配置使用,同时,由于固件库的巧妙的设计、灵活的编码、规范的风格,我的c编程功底也有了非常大进步。当然,随着硬件功能的丰富,相应的程序设计也就变得更为复杂,也正是因为这个原因,需要移植成熟稳定的操作系统,不会采用编写裸机程序的方式,操作系统就是将大量通用的重复性设计和代码进行高度抽象总结,将底层工作机制透明化处理,操作系统作为一款标准化通用平台.大大减轻了开发人员的工作量,这样一来能够让开发人员更加关注于上层应用,这样一来,就需要学习嵌入式操作系统μcos作为一款微型实时系统学习门槛低一些,主要提供:任务调度.事件管理、任务通信、内存管理,虽然这都是最为基础的知识点,但是对于初学者来说能够熟练掌握就已经非常不错了,从裸机到基于操作系统,是认知的一次较大转变,学会使用μcos是基本的要求,要能够深入理解其设计思路和运行机制还需要一段过程。理论终归是理论,理论转化为具体应用场景下的工程设计和实现,还需要做很多的工作,因此对于初学者来说,μCOS给你的并不是一堆代码,还有大量的工程设计思想、行业惯例以及常用处理阅读μcos代码,你会为作者严谨优秀的编码风格和习惯所折服,你会为作者巧妙的设计和灵活的处理所折服。此外,顺便提一点,μcos作者的故事也更令人心动不已。

 ARM第二个阶段学习始于三星S3C2440这款芯片,这也是一款较为成功流行的芯片,与之前的ARM单片机(Cortex-M)不同,这款芯片属于ARMCortex-A系列,属于深度嵌入式应用芯片,增加了协处理器和内存管理单元,结构要复杂一些,由于RAM和ROM的外置,电路板的设计也更为复杂,一般核心板都是多层设计,同时,RAM和ROM控制器是必须要独立提供,既然是高端点的芯片,那么S3C2440就不是用于简单的控制系统,而是手机.平板电脑、医疗设备、工控设备、仪器仪表等等,由于大量的普及使用以及硬件的提升,对于类似这样的应用场景,在软件设计中又被剥离出了一个标准化的东西,BSP板级支持包或者Bootloader,现在比较常用的是UBoot,代码全部公开。应用的广泛,开发者还要掌握文件系统、网络协议、图形界面等组件包的移植使用,嵌入式应用特点就是这样,根据具体的应用场景软硬件可裁剪,需要什么就加入什么。但是,随着这几年嵌入式硬件性能的不断提升和linux的大量普及使用,一些组件也作为基础部件被嵌入到软件平台中去,编程功底就是在实际应用中不断建立起来的,几年前不理解寄存器、寄存器变量、位图运算、函数实质指针,编译,汇编,链接,重定位、加载器、动态库、组件、堆、栈、线程、进程、链表、队列等等好多机制,但是当你经历了大量丰富的实践之后,你会突然明白一切原来都是这个样子,一切并没有原先想象的那么高深莫测。

三、IIS+ASP+Access

面向对象编程也是如此,它也是工程师经历长年大量的编程实践工作中总结出来的,在成为一种成熟稳定的标准之后,交由编程工具进行了处理,对于初学者来说,面对一大堆概念名词,无法理解这些高度抽象的语法糖,最好的方法还是:不断写代码.第一次认识VisualStudio是因为做网站,那时候ASP还没有没落,动易网络公司还是赫赫有名,桌面程序还是业界主流,今天web应用开发能如此大热,根本原因在于智能手机和移动互联网的大量普及,对于小型网站,基本采用"IIS+ASP+Access"的基础架构,当时对于BS风格的程序还不是很了解,具体的编程工作也只是在现有开源项目上进行小的改动。

四、C#、.NET、Oracle 

C#是一款面向对象编程语言,拥有着大量语法糖,比如引用.集合,泛类、委托,λ表达式·封箱拆箱,LINQ等高级语法特性,此外编译器也为项目开发提供了注释,标记特性,单纯为了学习而学习,是永远无法理解这些语法糖,还是需要实际项目的推动,一方面,使用原先的编码技术实现项目的基本需求;另一方面,通过反复的迭代掺入新的语法特性,提高自己的编码技术,像单例模式、工厂模式、观察者模式、策略模式、适配器模式、依赖注入、控制反转、AOP等面向对象编程设计模式,也是需要在大量的项目实践中不断总结出来的,因此,在日常的编码中要经常性的进行重复迭代,不断总结思考,只有这样才能提高编程功底。.NET平台和JVM一样,横在了操作系统和上层应用之间,c#编译后的项目并不是二进制的机器指令,而是IL中间语言代码,程序运行时由CLR提供实时的翻译,并转换为可执行的机器指令。.NET提供了托管内存机制,增强了系统和程序的安全性,提高了程序异常调试能力,对数据库的操作也是项目开发一项必备仅能。.NET平台提供了ADO.NET机制,将数据库访问机制进行了标准化,这就像设计模式中的适配器模式,数据库操作的技术细节被隐藏了,各大数据库厂商针对ADO.NET提供自己的数据库驱动,便能实现数据库与应用程序的自由对接。由于项目使用的是Oracle数据库,除了标准化的SQL语句外,Oracle也有自己专有的SQL语句,为高级开发人员提供特殊功能,在真正做项目的时候才体会到自己的知识是那么的贫瘠,学习的时间是那么的紧缺。

五、GIS 

了解GIS技术也是项目的需要。智能手机和移动互联网出现极大的推动了电子地理信息可视化技术的发展,谷歌地图、百度地图、腾讯地图、高德地图等等,目前普遍使用的还是二维电子地图,但是三维电子地图、全息投影和WebGL等技术还在加快地发展中。对于GIS并没有去深入学习地理科学方面的知识,只是简单的了解一些地图的制图技术,重点精力放在于GIS组件上,搞清组件的基本工作机制,组件之间的继承依赖关系,以及组件的调用接口和使用方法等。总之,GIS是包含众多行业在内的一项综合性工程技术,GIS软件的开发需要各专业人员协同配合。

六、MPF和MVVM 

本来并没想着去学习WPF这项技术,但是时代要求走到了这随着软件技术的不断发展和成熟,人们对软件的要求也越来越高,除了要完成基础业务功能外,软件界面的美观也成为一项关键性指标。WPF改变了以往桌面程序的图形系统,参照WEB程序开发的模式,将界面设计从程序设计中剥离了出来,提出了一种全新的MVVM设计模式。当然,WPF强大图形系统支持和美观的界面也必然吃掉了一部分硬件的性能,不过相对于硬件性能提升来说,这点损失还是利大于弊,对于用户来说只感受到了巨大的利好,此时的我还并不是非常清楚Web程序界面的设计方法,毕竟之前做的很多工作都是Web后端,对于HTML,CSS,JS还是大概知道个模样,WPF界面设计使用的是XAML语言,和HTML原理类似,也是从XML基础上发展起来的一种标记语言.WPF程序分离式设计开发、界面和数据的双向绑定,最终经过编译器的拼装组合实现,对于这一点的理解花费了我好长的时间,高级语法特性的难点就在于它隐藏了太多的技术实现细节,让开发人员失去了对底层工作机制的了解。此外,高级语法特性带来的是工程建设思路革新,代码特性只是其中的一个手段,有了MVVM这种设计框架的革新,增强了项目的协同配合,提高了项目的迭代效率,缩短了项目的开发时间,方便了项目的升级维护,延长了软件的生命周期,大大提升了软件在市场中的竞争力。

七、虚拟化

最初我对虚拟化的理解就是虚拟机,也许就和VMware公司最先开发虚拟机时想的一样,当时并没有想到虚拟化带来云计算.云服务,虚拟机也可以简单地理解为仿真机,就是模拟一台硬件计算机,用户可以近似像使用一台计算机那样操作它,开机,关机、增加硬盘、安装系统、安装程序等,但是虚拟机并没有简单地停留在这个层面,它在服务器集群中的应用才将其优势发挥地淋漓尽致,而在这方面应用建设的领头羊就是VMware公司,其余还包括Citrix,红帽公司等等.VMwarevSphere就是该公司为服务器集群开发的一套完整的高可用集群解决方案,承担起了云计算平台的整个基础设施建设。因为实际项目建设的需要,我结识了VMware,了解了该公司为企业信息化建设提供的各类解决方案,并为之震惊,起初我们只是为了提高网站的高可用性和安全性,在网上找了许多论文和资料后,偶然得知了VMwarevSphere这套解决方案。逐渐掌握了VMwarevSphere软件的部署和使用后,才有胆量下定决心使用这套工具,当时最新版本VMWare vSphere5.5。

八、HTML+CSS+JS 

服务器集群这个底层基础设施建好之后,这才有精力考虑上层应用的建设。项目建设实际需要推动了个人在新技术领域的探索,由于采用了开源的网站后台管理系统,因此开发重点就放在前端,也就是通常所说的HTML+CSS+JS。对于初学者来说,HTML本身并不是很难,难就难在如何使用良好的编码习惯进行各种组件的设计,对于CSS盒模型的理解是个长期实践的过程,经历了场场界面出现的诡异现象之后,才算是对CSS有了切身的认识JS内存模型、原型链、闭包、作用域也是在大量编程实践之后才能有一番清晰地认识。在接连不断的惊讶和赞叹中,我认识了Bootstrap、jquery、,AmazeUI、Requires、Coffers、Angularis、Backbone、Extjs、easyul这些“轮子”,虽然没有技术大拿发明轮子的本事,但是能够使用好大牛们的轮子,完成自己的项目才是最重要的。只要你有着强烈的好奇心和求知欲,你总是可以对这些事物有着一定程度的认识,至少再次遇见它们时就像与“朋友”的重逢,毕竟亲切了一些。

九、 Apache+PHP+MySQL 

在做ASP的时候对于PHP就有耳闻,但是此时ASP早已被淘汰,取而代之的是ASP.NET,之所以将目光转向PHP,是因为PHP活了起来,大量的成熟框架和项目采用PHP编写,很可惜微软从ASP过渡到ASP.NET的过程中,被其他语言抢占了市场,尽管ASP.NET提供了很多优秀的语法特性,但是市场的反应并不总是那么迅速,不仅是因为学习需要一个过程,而且整个项目团队重新形成能力需要更加漫长的过程,这个过程需要大量的资本投入的。就像WPF那样优秀的技术一样,并没有得到很好的市场青睐,对于商业活动来说,投资收益率始终是一个根本问题。因为开源的项目采用了成熟丰富的 Symfony框架,让我对于PHP框架有了第一直观印象。在随后的自建项目中,采用轻量级国产框架Thinkphp以及自己编写的MvC框架。

十、网络技术

既然是做互联网应用,不学习网络技术怎么行,为了系统的学习网络技术,报考了网络工程师资格认证考试,一方面是为了督促自己的学习,另一方面也是检验自己的学习效果。刚好结合项目的需要,对网络布线、IPSEC VPN搭建、交换机和路由器的配置有了一定程度掌握,根据项目需要设计了 Web radius认证审计方案,用以提高网络安全管理能力。此外,通过使用思科Packet仿真工具,对数据报文进行分析,总结了几篇关于ARP、OSPF、TCP的文章。

十一、HTTP

随着web程序开发的逐渐深入,我觉得有必要深入学习一下HTTP,这对提高web程序的安全性有很大助益。HTTP协议的重点在于报文的头部,为协议内部机制的实现,而报文的主体则是用户数据,不需要过多关注。《HTTP图解》是一本非常不错的书,配合的图文对有些工作流程机制解释的比较直观易懂。学完之后对HTTP的管线化通信机制也有了一定的了解,并通过 wireshark抓包工具进行了验证性的分析。

十二、 Unity3D和 Webgl 

Unity3D出现大大降低了三维游戏的开发难度,就像工具最初被造出来的时候,它的用途还是非常小的,但是在使用者的大量实践中,工具的用途被推向了更广的天地。Unity3D作为一款三维游戏开发引擎,并不仅局限于游戏开发,像现在比较火的虚拟现实软件,就是采用 Unity3D进行开发的。当然,我也是因为项目需要才学习 Unity3D的开发。计算机图形学是基础,虽然整个图形效果的实现被 Unity3D完全封装了起来,但是计算机图形学的一些基础知识还是要有的。 Webgl技术是浏览器端提供的种三维渲染机制,也是随着这几年Web应用的流行才逐渐被推行出来的一种技术标准,已经被各大浏览器厂商纳入进去, Unity3D针对BS风格的程序也推出了一套浏览器端的asm.js三维引擎组件。目前有着很好的应用前景,作为数据可视化的支持技术受到行业青睐,像百度的 chart、谷歌地球等都建立在 Webgl技术之上。

十三、物联网

随着移动互联网的普及,物联网似乎又迎来了自己的春天仿佛现在的我们比过去任何时候要更加接近物联网,物联网、智能时代是目前最炙手可热的宠儿。从嵌入式开始,辗转多个行业,最终又回到了嵌入式。这几年来,我不断寻找着出路,在技术上过着颠沛流离生活,却始终没有一个好的归宿。朋友多次劝诫我,要找准一个方向深深地扎下根去。可是现实中的种种情况和变故,让人难以有清醒的头脑、清晰的认识、足够的精力,以及可以努力一辈子方向,在中国这片人才富饶的疆土上,市场的竞争愈演愈烈,全世界互联网焦点都在我们这里,大牛们层出不穷,发明的轮子数不胜数,Hadoop、Hive、 Spark等大数据开源项目如雨后春笋,各类开发组件、自动化工具、生态系统层出不穷微服务架构、自动编排、 Devops等一系列新的技术标准、框架,被戏称为“代码搬运工”的码农更是多如牛毛,我有时再想,这种激烈的竞争导致的就是,人们本可以在10年时间里赚的钱,都在1年内赚完了,市场的价格机制并不总能如此快速地匹配实际的供需情况,很多矛盾在时间维度上就被极度压缩,最终导致整个市场不可持续、不稳定,看似外表繁华实际上是一种“虚胖”大多数程序员并没有人们想象中那么好,一方面是由于他们自身技术实力的原因,另一方面是由于外部激烈竞争环境的原因。人生的重大转折总是因为一些标志性的事情。智能化建立在大数据基础之上,原始数据的获取必定要借助于物联网,这次下定决心再次投身于物联网,也算是自己未来事业的发展定下一个总基调,虽然不知道物联网时代的全面来临是什么时候,也不知道物联网时代能够持续多久,但是有方向总比没有方向强吧。几年没摸的技术都有些手生了,先清理一下灰尘、除除锈蚀,再说吧。