1. 数据结构初体验
在大学期间学习数据结构时觉得很优美,因为选择一个好的数据结构可以让代码更加简短、容易阅读。并且很快也有了一个实践机会,就是自己决定做一个LISP 解释器。这个软件的代码总共花了3周写完,但是设计时间很长。实际上,其中的LISP的语法非常简单,而实现的时候主要涉及到数据结构中广义表,概念很多,但是在数据结构的书中介绍不多,只有自己逐步去理解,可以说,LISP解释器程序的编写中,自己的思考占了大部分。完成后的结论是,只要充分理解广义表,并且把这个理解结合到LISP解释器程序中,要花费几个月,但是很值得,因为整个程序的实现代码就变得很简洁、容易扩展,看这样的代码让人感到很享受。
2. 不甚乐观的现实
我在负责公司技术人员招聘的时候,其中有不少人是刚刚毕业的学生,他们没有工作经验,因此,数据结构是主要考查的内容,可是我发现这样的基础课程有很多人并不了解。一次“成都软件技术沙龙”交流,一个朋友提出的真实的招聘也印证了这一点。
这个朋友给我讲了一次典型的招聘后,他认识到数据结构课程中非常基础实用的内容对很多学生来说也并不了解。当时招聘来了约100个学生,他提了一个问题,就是谁会写冒泡排序算法,让知道的人举手,大约有10个人举手,然后请他们来做,发现只有两三个人做对。其实,数据结构中最基础的就是排序和查找,而冒泡排序是基础中的基础,只要10行左右的代码,逐个比较,两层循环,大的向上浮动,所以叫做冒泡排序。为什么做不对呢?这不是简单的智力问题,而是不知轻重和权衡。
有些人认为只要会IDE和语言就行,基础知识不重要了,我不以为然。这些年来,看惯了很多程序中大量嵌套的if else,大量的嵌套,混淆的语义,也看多了大量的重复代码。因此,更加觉得有抽象思维能力、基础扎实的可贵。
3. 可以有更多应用的状况
控件代码常常需要用到数据结构。有机会看了国内一个人写的一个report控件,该控件基于GPL协议发布,其中的代码完全是他自己写的,包括一个个的线、一个inplace的小edit、鼠标移动cell线等。原始的ereport共5000行,其中的注释也比较有意思,比如
“今天早晨有一个大艳阳天,我的打印...”,
“又是一个不眠夜”,
记载了这个人开发过程的酸甜苦辣。
ereport内给人印象最深的是,当用户的数据以dataset方式进来后,所有的排序、分组的累计都是通过for循环来做的。为什么不使用现成的呢?可能是因为Delphi过于庞大,没有提供这样的一套算法。decal是Delphi的一套Third Party 算法库,但是并不是所有的人都知道。随后的分组也由自己来写。这样,ereport内就有大量的排序算法、分组算法,以及和它们伴生的数据结构。
稍微复杂的算法也需要数据结构。我们接到了一个产品,叫做报表精灵,其实就是一个类似desisioncube的数据分析控件,其中涉及对数据钻取、切片、分组和排序等操作,可是现成的控件都不能满足我们的要求,要自己做,再一次涉及基本的数据结构。
要写出漂亮的代码,不能不了解数据结构。代码总是有控制结构和数据结构构成的,这就是Niklus Wirth所说的“程序=数据结构+算法”的含义。可是很多人只知道大量善用控制结构如if ,while等,却不知道善用数据结构,比如Array,List ,Collection,HashTable 。控制结构可以表达分支、循环的流程,数据结构因为它本身的设计可以隐含分支、循环,因此同样可以表达这样的流程。不同的是,用精巧的数据结构来表达分支、循环的意图,常常会比用控制结构来表达更加容易阅读和理解。一般程序员认为产品开发的技术要求不高,只要搞清楚业务就可以,就是就有大量的简单堆积、大量嵌套的代码布局——这就是为什么很多人认为数据结构不重要,总觉得没有用武之地的原因吧。
4. 现实的MIS编程
我们常说,IT工程师的技术常常很久不更新,原因是现在IT业对他们的要求都不高。简单地说,对做软件系统的人来说,只要要能够使用SQL,能够连接上数据库,然后绘制界面,把数据改一改,挂接到界面上,这个基本功就够了。因为这样的低要求,也因为缺乏代码评审,重复的代码、大量的嵌套就会出现。
IT新人在头一年做项目时,要做的就是反复操练这样的技术,在不同的场景下用少量的变通,然后学习如何侦查到错误并且修正它。如果确实有自己技术上搞不定的问题,知道如何得到解答,然后反复练习,直到熟练。这一段时间是最难熬的日子。
简单的使用TStringList.sort,复杂的使用SQL数据库,排序、分组都可以的。数据库SQL更加无所不能,一个子句就可以完成一个排序,一个子句就可以完成一次分组。让程序员不再重视数据结构,进而不重视抽象思维,这里说的是一般编程。说到优化,难免要阅读他人代码、分析结构;说到设计,也是如此,程序员的抽象能力是跨越台阶的必要条件。
分享到:
相关推荐
BeautifulNotes - 优美的代码注释
欣赏优美的代码
Glider-JS创建优美的页面滑动块效果
Glider-JS创建优美的页面滑动块效果.rar
SuperLoadingProgress 一款优美的加载器,根据进度设置加载效果 动画效果如下: 希望了解这款加载器的实现方式,可以参考博文http://blog.csdn.net/crazy__chen/article/details/50270281
素材积累:关于-青春的优美段落.doc
6.3.3 CLSID关键字结构 91 6.3.4 关于注册表的其他细节 92 6.3.5 ProjID 93 6.3.6 自注册 95 6.3.7 组件类别 96 6.3.8 OleView 97 6.4 COM库函数 98 6.4.1 COM库的初始化 98 6.4.2 内存管理 98 6.4.3 将...
《藏谜》-一幅优美灿烂的藏族风情画卷.docx
基于C++的界面优美的播放器源代码;基于C++的界面优美的播放器源代码
涵盖了JavaSE的所有源代码例子 所有的代码都十分优美,十分有价值 这是一款很有用的代码,对学习Java有很大用处
如何写出优美的c代码,c语言的面向对象,结构体
5. 详细的文档说明:为了帮助开发者更好地理解和使用该项目,我们提供了详细的文档说明,包括项目结构、接口调用、数据存储等方面的内容。 总之,微信小程序Demo-Xiaoxiazhihu(知乎日报)是一个功能丰富、易于扩展...
优美句子-幸福优美句子48条.docx
前台设置页面经常要设置不同页面之间实现滑动的效果,这段代码可以完美实现滑动效果,简单方便使用,测试好用,分享给大家。
一朵玫瑰。简洁优美的代码!总共不超过10行。却能随意画出美丽的图形,可以送给程序猿的女朋友!!!
如果你正在为数据结构课程的期末考试而苦恼,那么我的整理的数据结构复习试题绝对可以帮到你!这份复习试题集是由我花费大量时间和精力所...相信这份完善的数据结构复习试题集一定会成为你在考试中取得优美成绩的助力!
如何写出优美的C代码 介绍在写Linux时用到的C语言技巧 非常实用