您的位置:首页 > 职场人生

资深码农谈编程——编程岁月

2016-06-08 07:19 597 查看
发表说明:本文原名为《编程岁月》,为博主原创,2013年被某期刊收录,现分享于CSDN。

汪永松(1980年10月—),2012年6月毕业于武汉大学测绘工程专业,硕士。具有多年IT行业开发及管理经验,现为重庆车杰盟科技有限公司高级产品经理。

引言

    屈指算来,笔者从大二开始接触计算机到如今已经过十多载,所以不夸张地说,计算机已经改变或者铸就了笔者的人生轨迹:首先是让笔者从财会专业跨入到计算机行业,再是让笔者从普通的程序员逐步炼成技术骨干、项目经理。
    可能和大多数程序员不一样,笔者是跨行学计算机,同学之间对编程的交流甚少,加之当时上互联网也不方便,所以很多内容都是通过购书学习和上机摸索积累而来,那些初学时的艰涩、调试bug时的孤寂至今还让笔者无法释怀。
    在一头雾水地接触编程的时候,加上“编程就是吃青春饭”的传言纷纷,笔者也曾纠结过何去何从。幸运的是,笔者还是找到了用计算机去解决问题和去改变的兴趣,兴趣如同扬起帆的船,带着笔者跨越一个又一个难题,闯入一个又一个世界;其间那些“山穷水尽疑无路,柳暗花明又一村”的欣喜,如一座座闪亮的灯塔,鼓舞着笔者前行。

第一篇 蓬门今始为君开

    最初接触的开发工具是FoxBASE,记得是在DOS界面下,无需编译成可执行文件,通过命令行进行交互执行,可以非常方便地创建数据库表,进行记录的查询、新增、删除和更新操作。从现在的经历来看,FoxBASE算是比较简陋,甚至谈不上是专业的开发环境,但毋庸置疑,它毕竟还是充当了笔者编程生涯的启蒙老师。对于变量的定义、程序结构、模块化、SQL,这些概念和认识却一直延续到现在,只不过对它们的认识是逐步加深和拓宽。
    大三的时候开始学习C语言,采用的教程是清华大学出版社出版的《C程序设计》(谭浩强编著,第1版),上机使用的是Turbo C(又戏称为拖把C)。相比FoxBASE,C语言是真正的编程语言,但笔者认为它不是一个完整的开发环境,而不像Linux平台下的C编程,包含了网络通信、多线程等内容。从专业化的角度而言,C语言不仅强化自己在编程方面的概念,更是夯实了编程的思维模式,无论是从数据定义、表达式运算、指针应用,还是从函数设计、文件操作、宏定义,都有助于笔者举一反三地应用到其他语言(例如后接触的JavaScript和Java)。
    对开发者而言,C语言需要关注的细节较多,例如:数据在内存中的存储状态、操作符的优先级、堆内存的分配和回收,这些都是让初学者畏难和晦涩难懂的地方,在开发的初期阶段可能会觉得毫无乐趣可言。尽管如此,笔者建议程序员还是应该把C语言当成一门帮助自己修炼“内功”的编程语言,只有经过了它的严格历练,程序员就会养成了谨小慎微、规范清晰的编程习惯,以至于转入到其他的开发环境,或是其他语言的开发中,都会觉得得心应手,游刃有余。
    等逐步深入了解了C语言,笔者却开始倦腻于DOS开发环境,开始渴望可视化编程,希望能够编制出如同Windows程序那样具有丰富多彩的界面效果、能够响应鼠标和键盘的执行程序。基于此,笔者开始如饥似渴地接触C语言的图形库绘制以及高级DOS编程。从求伯君编写的一本有关DOS编程的书籍中,笔者续道了如何使用C语言的DOS库调用系统中断,从而实现例如:磁盘、鼠标、屏幕功能等系统功能。然后一段时间的激动之后笔者发现,虽然可以自行绘制各种形状和颜色的界面,但是这些和Windows程序的效果和操作比起来还是有天壤之别,一下子笔者开始沮丧起来。

第二篇 无心插柳柳成荫

一次偶然的机会,笔者无意之间翻看了同学借的一本有关JavaScript的书,结果发现可以使用JavaScript进行可视化编程。以现在的认识而言,JavaScript是一种宿主脚本语言,其属于Web开发的范围,但当时对笔者而言,JavaScript可以用来编制网页程序,使用记事本就可以写代码,再使用浏览器加载运行,开发环境简单明了,而且JavaScript的语法也颇类似于C语言,所以学起来还比较得心应手,对可视化编程可谓是踌躇满志。还记得当笔者用JavaScript在网页上弹出一个对话框时的惊喜,应该算得上是笔者人生中写出的第一个可视化对话框。特别值得一提的是,JavaScript语言中的对象、属性、方法、事件等概念,成了笔者面向对象编程的启蒙,帮助笔者后来平稳地从C过渡到C++。
打从JavaScript起,再到HTML、CSS,笔者开始领悟了可视化编程的一些核心概念,例如:可视组件(Web元素)的控制、事件(鼠标、键盘、窗口)的响应、对象创建和引用等。所以,笔者至今还感谢那一次与JavaScript的偶遇,不仅帮助笔者开启了可视化编程的大门更是把笔者带入了面向对象编程的世界。有趣的是,当时笔者对Web后端开发却没有太多感应,而是等若干时间后才再次接触。

第三篇 乱花渐欲迷人眼

    继JavaScript之后,笔者开始关注和寻找Windows编程的教程,笔者使用的第一款Windows程序开发环境是Borland C++ Builder(5.0),当即被其快速开发的模式给震撼了:基于组件的窗体设计、消息回调机制、数据库编程、网络通信、三层架构、Web开发以及整套体系的Win32 API参考。一时间,笔者就像一个小孩打开了装满礼物的包裹,看到映入眼睛全是琳琅满目的新鲜玩意,欣喜若狂。为了更好地学习C++
Builder,笔者买了一本也迄今为止笔者买的最厚的一本有关C++Builder程序设计的高级教程,有近750页,台湾人写的。当时的情形是,一边看书一边上机验证,验证不了的再反过来看书,再次揣摩书中的细节,再次上机验证,最后把上机的总结在书中进行标注。
    由衷地说,C++ Builder是一款优秀的集成开发环境,其几乎包含了可视化程序开发的所有功能范围,正是它把笔者引入到职业编程的轨道上。C++ Builder采用的C++语法,而从C到C++,JavaScript是功不可没,面向对象和对类的理解,都是由它借鉴而来。随着对C++ Builder的理解和使用的不断加深,笔者开始摸索Windows编程的高级技巧,例如:自定义组件、三层架构数据库应用、多线程、并发控制、分装动态链接库等。然而,其中一个不算很起眼开发功能却把笔者引入到另外一个天地,即Web开发。
    C++ Builder 5支持的是CGI和ISAPI,Web后台调用这些模块可以访问数据库并生成网页内容,数据的显示效果只需要与HTML融合即可,且客户端无需分发程序,而不像独立程序那样,数据的组织和展示组件都必须编码,而且程序的发布需要复制分发。鉴于Web程序如此神奇的开发模式,笔者开始迷上了Web后端开发,而且一发不可收拾。笔者曾在半年的时间里,先后尝试了PHP、ASP、JSP等服务页的编写和部署,其中PHP(3.0)简单易用,就是语法比较怪异(相对JavaScript和C++,其类似于Perl),同样,笔者对ASP也不怎么待见,而倒是钟情于JSP,觉得其中的Java语法和C++、JavaScript很接近。经管如此,笔者对JSP的兴趣没有维持多久,其原因竟然是觉得Tomcat不好用,而觉得不好用的原因,经过后来笔者分析,主要原因有两点,一是对XML配置不熟悉,再是对类容器的概念尚未形成。这一段插曲算是与Web开发的第二次接触,结果是浅尝辄止。其间,笔者还学习了数据结构和算法,主要是为软考做准备。

第四篇 绝知此事要躬行

    笔者从2003年开始自己的IT职业,主要使用C++ Builder进行开发,主要开发MIS系统。在一年多的项目实践中,先后使用过Access、SQL Server、Oracle等数据库,在数据库的设计、数据的层次设计及SQL的编写技巧方面积累了不少开发经验。其中参与了一个硬件通信的小项目,却得到了意想不到的收获。该项目是通过工控机的串口获取多个终端传来的信号信息,然后在界面上显示实时信号,此外还包括向各个终端发送控制信号。通过这个项目,笔者掌握了在I/O控制中的多线程编程以及其间的并发控制,也为后续研究HTTP服务器做了很好的铺垫。与此同时,笔者开始自学Java,并尝试写一个Java
HTTP服务器,这个服务器实际上就是一个类容器,采用多线程的方式,按照HTTP标准接收和返回客户端的请求和回复,支持CGI进程的调用和类似于JSP页面的解析。这个尝试,最终激起了笔者对B/S架构的兴趣,并延续到现在。
    不到两年时间,由于工作的原因,笔者改用微软公司的Visual C++工具进行开发,主要是开发数据处理系统。一方面,除了了解MFC类库,使用ADO访问SQLServer数据库等,并开始接触STL等标准库或外部库,开始有意识地使用或积累一些功能稳定、简单易用的工具库或功能库。另外一方面,依旧保持自学Java的态势,开始摸索JDBC、XML、RMI等技术的应用,并对开源产生兴趣,并尝试引入到实际项目当中。自此笔者IT生涯的两条技术主线:C/C++和Java基本建立,C/C++的应用主要还是C/S框架应用、桌面程序和基础库;而Java的视野则更为广泛,除了桌面程序和B/S架构应用,还引发到移动应用。

第五篇 柳暗花明又一村

    自从在诺基亚手机(S40)上用J2ME写了第一个程序后,笔者就一发不可收拾,从界面到无线通信,从多媒体开发到个人信息管理,笔者差不多花了大半年的时间对J2ME手机开发进行了全面的尝试,并于2008年将所开发的案例编写成《J2ME手机高级编程》一书,交由机械工业出版社出版。应该是说尝到了手机移动开发的甜头,加之J2ME已经有点暮气沉沉,于是在J2ME之后笔者迅速转移到Android平台的开发当中。相比J2ME平台,Android的架构更为系统和完整,几乎不受到制约,其信息获取渠道和数据处理能力更为强大,例如:电话系统、数据库、核心系统服务等内容都是J2ME平台没法比拟。在对Android平台开发了解得差不多时,笔者发现Android程序开发的范围可以延伸到本地(Linux),即通过本地开发库(NDK)的方式,使用C/C++语言编写本地库(so),然后使用JNI的方式在Android程序端进行调用。也就是说开发一个Android程序可以将Java和C++两种语言进行结合应用。后来经过笔者摸索发现,很多多媒体应用的程序都是采用如此模式:后端使用C++库对媒体数据进行编码/解码,而在前端使用摄像头或渲染容器捕获或展示媒体数据。
    Android平台让笔者第一次觉得有点天地合一的感觉,不仅可以整合使用C++和Java开发语言,而且还可以集成B/S应用(基于Wi-Fi或3G网络)和C/S应用(WLAN通信)。

第六篇 似曾相识燕归来

    再次由于工作的原因,笔者正真转入到Web开发的,主要是面向基于J2EE平台的商业智能(BI)应用。从应用的广度而言,前期使用C++主要关注的是后台功能,例如:数据抽取、解析、转换和存储,而现在面对的Web应用不仅关注功能而且还关注数据的集成和展现,从数据存储到组织、传输、解析,再到集成展示,几乎涵盖了笔者从事IT行业以来的所有业务环节。从应用深度而言,Web应用更突出其服务特性,数据的处理都围绕服务的提供而展开。
    这一次,笔者不仅重新拾起了曾经浅尝辄止的JavaScript、HTML、CSS、JSP、Tomcat,而且还学会了吸收开源项目或外部库,学会使用或者搭建开发框架。而这些行为模式的转变,估计还是与Web开发的特殊性有关。当笔者对Web开发了解到一定程度时,Web开发给笔者的印象是“三多”:标准多、框架多、资源多。所以,在学习和摸索的过程中,需要注重总结和积累,注意引进和复用,把更多的精力转移到业务处理。
    作为新接触的环节,在数据集成和展示方面,笔者也逐步找到适合的资源和模式。在数据集成方面,笔者曾尝试在Web后端和前端之间添加一个数据服务层,数据服务层与后端和前端页面均采用JSON格式进行交互;当前端页面通过Ajax的方式进行异步数据请求,数据服务层将Web后端获取的数据以JSON的格式反馈给请求页面,从而实现异构数据的集成。在数据展示方面,可以使用Flex等富客户端框架绘制专业性较高图表,也可以使用基于JavaScript的展示组件库来快速实现常规界面(例如:表格、树状组件等)。
    幸运地说,重新对Web开发的接触和实践,使得笔者对数据处理业务的理解更加全面和系统化,而且从开发模式上,实现两个转变:从C++时期的主要“依靠自己开发”到Web时期主要的“整合现有的来开发”的转变;实现了从使用固定的开发环境,到自己构建开发框架的转变。

第七篇 衣带渐宽终不悔

    至此,笔者对自己的技术体系稍作归纳,让读者清晰地了解笔者的技术范围,主要包括四个方面:C(C/C++)、J(Java)、E(嵌入式)和W(Web),如图1所示。其中C/C++主要是桌面开发(Windows、Linux);Java主要包括桌面开发和开源技术;嵌入式主要包括J2ME和Android;Web开发主要是基于J2EE平台的开发。



图1 个人技术体系图
    对于开发语言或环境而言,笔者自我感觉受到C++ Builder的影响,以至于刻意规避选择其他的开发环境和语言。然而,作为软件开发者,如果需要保持自己技术的先进性,就必须正视陈出不穷的技术和产品,保持学习和摸索的心态;还必须善于总结和积累当前的技术和产品,持续改进并实现模式化。一个职业的开发者如果能够做到这两点,这不会混乱于当前,不畏惧于今后。这也意味着,开发者必须花费更多的时间来关注行业动态,注入更多的心血来提炼自己的工作,所以,你需要确定编程是自己兴趣所致,则无怨无悔。
    人生如戏,岁月如歌。程序员使用IT技术造就了世界的丰富多彩,而自己的人生也被充满酸甜苦辣。回首自己的编程岁月,如同品茶一般,恐怕除了自己,没有谁能够真正体会其中的味道。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: