博文

[置顶] “实现能力”与“设计能力”(2007-08-30 16:16:00)

摘要:“实现能力”与“设计能力”   原文出处:http://www.sunistudio.com/nicrosoft/
  nicrosoft@sunistudio.com Nicrosoft 2001.8.17   我见过太多的代码(我自己以前也是),只注重实现功能。国内绝大多数的程序员都以为实现了就成功了。在开始敲键盘之前,有多少人想过即将被创建的代码会有多少的可维护性?是准备创建用完就扔的代码,还是需要不断升级、改进的代码?如果是需要长期被维护、改进的代码,在最初的时候,如果只是注重实现,而忽略整体框架的设计,那么最终等待程序员的只是无数的bug和灾难。   其实,相对来说,实现是简单的。你能够实现的东西都是基于平台或者特定软硬件环境的。你所实现的,只是因为平台提供给了你这样的功能而已,这个实现并不是你创造出来的。而框架的设计就需要相当的经验。没有人可以一开始就完成一个优秀的框架。   在一次工作中,要为Delphi写几个简单组件,组件类之间有继承关系(很简单,只有两层而已)。对于这个非常微小的“框架”,在最初有了“想当然”的设计之后,就开始动手写代码了。完成父类层的组件后,在写派生类的组件时,才发现当初的“设计”存在问题。那时我奇怪自己当初怎么会有那么奇怪的想法,构建这样的框架。在写到派生类组件时,才发现有些东西是那么的理所当然,而在最初设计的时侯的想法却与之相反!于是,重新构建这些代码,幸好,代码量不大,即使重写,也没有花费多少时间。   我想说的是,即使一个那么简单的框架,我是在第三次重写后,才将其确立下来。同时,获取了宝贵的经验。设计的难处在于,人的思维习惯是从下往上,逐步抽象的。但是,在类的框架设计中,去需要从上往下的设计,也就是逐步细化。而一旦在原始类(如:VCL的TObject)的设计上存在问题的话,那么随着类层次的展开,问题将会逐步放大,最后可能会导致整个框架的崩溃。这就要求设计者具有丰富的经验!   我从不相信程序员的寿命只到35岁,也许35岁以后,实现能力(其实就是工匠能力)有下降的可能,而设计能力是随着经验的增加不降反升的。这才是最宝贵的。   国外的软件开发小组,一般的骨干都是40岁上下的人,那些才是大师级的程序员,而所谓的过了35岁就不能当程序员的程序员根本没有资格被称为程序员。   而软件工程是要将程序员变成编......

阅读全文(1552) | 评论:0

[置顶] 面对编程,请不要做浮躁的人 (2007-05-24 22:36:00)

摘要:1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想 出来再参考别人的提示,你就知道自己和别人思路的差异。
2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久 都是只对部分功能熟悉而已,不系统还是不够的。
3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册, 虽然帮助的文字有时候很难看懂,总觉得不够直观。
4.不要被对象、属性、方法等词汇所迷惑;最根本的是先了解最基础知识。
5.不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸 出很多知识点;不会举一反三你就永远学不会。
6.知道一点东西,并不能说明你会写脚本,脚本是需要经验积累的。
7.学脚本并不难,JSP、ASP、PHP等等也不过如此--难的是长期坚持实践和不遗余力的博览群书;
8.看再多的书是学不全脚本的,要多实践
9.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
10.学习脚本最好的方法之一就是多练习;
11.在任何时刻都不要认为自己手中的书已经足够了;
12.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
13.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
14.请把书上的例子亲手到电脑上实践,即使配套光盘中有源文件;
15.把在书中看到的有意义的例子扩充;并将其切实的运用到自己的工作中;
16.不要漏掉书中任何一个练习——请全部做完并记录下思路;
17.当你用脚本到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个代码的完整性,然后分析自己的错误并重新编写和工作。
18.别心急,写脚本确实不容易;水平是在不断的实践中完善和发展的;
19.每学到一个脚本难点的时候,尝试着对别人讲解这个知识点并让他理解----你能讲清楚才说明你真的理解了;
20.记录下在和别人交流时发现的自己忽视或不理解的知识点;
21.保存好你做过的所有的源文件----那是你最好的积累之一;
22.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先你要学会自己找答案,比如google、百度都是很好的......

阅读全文(1975) | 评论:6

[置顶] VC入门(2006-09-21 12:54:00)

摘要:参考一下《VC新手学堂》里的内容,应该有所帮助。声明:学.NET要比VC简单,如果是初学,建议不要学VC了,入门相当困难。但是如果真的掌握VC的话,那你就是个绝顶高手了。下面是正文:


VC入门的一条路

首先声明,我可不是什么高手,也就是刚脱贫。因为运气很好,买到了几本好书,在学习过程中几乎没走什么弯路,没费什么劲就入门了,现在一般的小程序能搞定了。看到那些因为不知从何下手而苦苦挣扎的朋友,希望我的文章能给他们一些帮助。

学编程急不得,上来就学VC肯定碰一头灰,说VC难就难在这点上了。如果硬上,意志坚强的话也许能挺过来,但也是会缺乏后劲,不得不回过头来补习基础知识。意志不坚强的话,很有可能就此放弃了,并留下一个VC难得不得了的印象。其实,只要踏踏实实一步一步来,VC也就是很简单点事。在这里我说一下,如果你还只是一个初中生,那么你就应当仔细考虑一下了。首先,限于你的知识和思维能力,学学C语言还应该没问题,但要学VC是要下相当大的功夫的。而且,你现在学到的东西将来一定会过时,所以不如把精力放在算法的研究上,毕竟这些东西永远都不会过时。

我觉着如果走对路子,入门VC,一个暑假应该够用了。

虽说学VC并不是传说的那么难,可不下些苦功夫是学不成的。在学VC前,你必须确定,你是因为热爱编程才学VC的,而不是出于炫耀或其他。否则,恐怕你坚持不到胜利的那一天。

对于首次接触编程的同学,我建议最好先学一下Quick BASIC(DOS里就有带,就是那个QBASIC.EXE),不用多学,知道什么是整型什么是浮点,以及DO...LOOP FOR...NEXT 等最基本的知识,能算个阶乘,求个积分就行了,关键要明白计算机是怎么执行命令的,对编程有个感性认识。如果你对自己有自信,也可以直接学C++,应该也不会多费太多事。不过我觉着因为有很多资料是FOR VB的,并且网页编程常用VB Script,以后你也很有可能要用到VB,所以了解一些BASIC对以后也是有帮助的。而且如果只是要算个小题用QB比VC、VB之类方便多了。(找个人教一两天应该就能搞定了吧)

之后我建议找本初高中信息学奥赛的书(有些奇怪吧)。这些书里讲解了基本的算法,写的却比较通俗,没什么高深的数学知识,容易理解。......

阅读全文(2792) | 评论:7

VC++中的头文件包含问题(2007-08-27 15:51:00)

摘要: VC++中的头文件包含问题 在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系)。也就是需要互相声明。好了,这时候会带来一些混乱。如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已的处理办法: 编码时,我们一般会尽量避免include头文件,而是采用声明 class XXX。但有时候还是必须用Include头文件,那么,两者的划分在于什么呢?

应该是很明确的,但书上好像都少有提及。 首先:
我们要明白为什么要用声明取代头文件包含:对了,是为了避免无必要的重编译(在头文件发生变更时)。工程较大,低速机,或基础类经常变更(不合理的设计吧),编译速度还是会在意的,另外,更为重要的是,采用声明可降低代码(class)之间的藕合度,这也是面向对象设计的一大原则。 二:一般原则:
a. 头文件中尽量少include, 如果可以简单申明 class clsOld; 解决,那最好。减少没有必要的include;
b. 实现文件中也要尽量少include,不要include没有用到的头文件。 三:那什么时候可以只是简单声明class clsOld呢?
简单的说:不需要知道clsOld的内存布局的用法都可以(静态成员除外),也就是讲如果是指针或引用方式的都行。
比如:
   clsOld * m_pOld;    //指针占4个字节长
   clsOld & test(clsOld * pOld) {return *pOld};
  一切OK。 四:什么时候不能简单声明class clsOld,必须include呢?
不满足三的情况下:
 比如:
         clsOld m_Objold;  //不知道占据大小,必须要通过它的具体声明来计算
原因很简单,想想你要计算sizeof(classNew),但连clsOld的size都不知道,编译器显然会无能为力。

特殊情况:
  ......

阅读全文(4900) | 评论:0

用 Java 保存位图文件(2007-08-18 14:45:00)

摘要:教程 -- 其中包括将图像对象写入位图文件的全部代码

作者 Jean-Pierre Dubé
摘要
虽然 Java 提供了几种打开图像的机制,但保存图像并不是它的强项。这篇技巧将讲述如何将图像保存在 24 位位图文件中。另外,Jean-Pierre 还提供了将图像文件写入位图文件所需的全部代码。 这篇技巧是 Java 技巧 43 的补充,那篇技巧说明了在 Java 应用程序中加载位图文件的过程。本月我再提供一篇教程,说明如何将图像保存在 24 位位图文件中,其中还包含将图像对象写入位图文件的代码片断。
如果您在 Microsoft Windows 环境中工作,那么创建位图文件的功能将为您提供许多方便。例如,在我的上一个项目中,我必须将 Java 与 Microsoft Access 对接。Java 程序允许用户在屏幕上绘图。这幅图随后被打印到 Microsoft Access 报表中。由于 Java 不支持 OLE,我的唯一选择就是创建该图的一个位图文件,并通知 Microsoft Access 报表在何处能找到这个位图文件。如果您写过向剪贴板发送图像的应用程序,则这个技巧可能对您有用 -- 尤其是当您将这个信息传递给另一个应用程序时。
位图文件的格式
位图文件格式支持 4 位 RLE(行程长度编码)以及 8 位和 24 位编码。因为我们只处理 24 位格式,所以下面我们查看一下该文件的结构。
位图文件分为三个部分。我已将它们列在下面。
第 1 部分:位图文件的标头
标头包含位图文件的类型大小信息和版面信息。结构如下(摘自 C 语言结构定义):
typedef struct tagBITMAPFILEHEADER {
   UINT bfType;
   DWORD bfSize;
   UINT bfReserved1;
   UINT bfReserved2;
   DWORD bfOffBits;
}BITMAPFILEHEADER;

下面是对这个清单中的代码元素的说明:
......

阅读全文(278) | 评论:0

Const和#define大比拼(2007-08-13 22:57:00)

摘要:  const给人的第一印象就是定义常量。 (1)const用于定义常量。       例如:const int N = 100;const int M = 200;
      这样程序中只要用到 N、M 就分别代表为整型100、200,N、M 为一常量,在程序中不可改变。
      但有人说他编程时从来不用const定义常量。我相信。但他是不懂得真正的编程艺术,用const定义常量不仅能方便我们编程而且能提高程序的清晰性。你是愿意看到程序中100、200 满天飞,还是愿意只看到简单清晰的N、M。相信有没有好处你慢慢体会。
      还有人说他不用const定义常量,他用#define宏定义常量。可以。但不知道你有没有发现有时#define宏并没有如你所愿在定义常量。下面我们比较比较const和#define。
      1。
      (a) const定义常量是有数据类型的:
      这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际效应(不如你愿处)。所谓边际效应举例如下:
            #define N 100
            #define M 200 + N
            当程序中使用 M*N 时,原本想要 100 * (200+ N )的却变成了 100......

阅读全文(3940) | 评论:0

JAVA代码编写程序的基本规范 (2007-08-13 22:37:00)

摘要:1.Java命名规范 1.1 Package 的命名 Package 的名字应该都是由一个小写单词组成,例如:net.ebseries.modules。 1.2 Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成,例如:DataFile或InfoParser。 1.3 Class 变量的命名 变量的名字可大小写混用,但首字符应小写。词由大写字母分隔,限制用下划线,限制使用美元符号($),因为这个字符对内部类有特殊的含义。如: inputFileSize。 类中的属性不能定义为public变量直接存取,而是定义成protect变量来防止继承类使用他们并编写get/set方法。 1.4 Class 属性(成员变量)使用 Class 属性(成员变量)使用一定要加前缀this或super标识对应的成员变量,以增加程序的可读性。 1.5 Static Final 变量的命名 Static Final 变量的名字应该都大写,并且指出完整含义,例如:final MAXUPLOADFILESIZE=1024。 1.6 方法的命名 方法名应该是动词,大小写可混用,但首字母应小写。在每个方法名内,大写字母将词分隔并限制使用下划线。参数的名字必须和变量的命名规范一致,问题参数名是否采用以下划线开始作为统一标识,如setCounter(int _size),以标识成员变量size和传入参数_size区别。使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字: setCounter(int size){ this.size = size; } 1.7 数组的命名 数组应该总是用下面的方式来命名:byte[] buffer;而不是:byte buffer[]; 2.代码格式 2.1 代码样式 代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行) 2.2 文档化 必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。 2.3 缩进 缩进应该是每行4个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度. 2.......

阅读全文(1678) | 评论:0

WPS软件17年发展历史(2007-08-11 17:30:00)

摘要:第一代:

  WPS 1.0:开天之作 称雄DOS时代

  1988年,中国的IT界尚处于萌芽时期,然而,5月的深圳,中国的办公软件已经开始在这个萌动的春天孕育。一个名叫求伯君的普通技术人员在一个宾馆的出租房间里凭借一台386电脑写出了WPS(Word Processing System)1.0,这几万行代码从此开创了中文字处理时代。

  1988年到1995年的7年间,WPS凭借技术的领先横扫大江南北,所向无敌。WPS几乎成了电脑的代名词。书店里摆满了《WPS使用教程》之类的书,专业、非专业报刊整版整版地刊登WPS使用技巧,社会上各种电脑培训班的主要课程除了五笔字型输入法就是WPS操作。电脑几乎全部是由企业购买,企业购买电脑几乎全部用来打字,打字几乎全部都用WPS。WPS成为中国第一代电脑使用者的启蒙软件,至今,WPS如日中天的激情年代还为许多人津津乐道。
  

国内早期接触计算机的人们一定非常熟悉这个界面


纯字符的操作系统,窗口式的办公软件


  第二代:

  盘古组件:转战Windows平台遭重创

  就在WPS日趋火爆,年销3万多套的时候,微软Windows系统在中国悄然登陆。凭借操作系统的优势,微软Office中的Word正式进军中文字处理软件市场。

  1993年,为了迎接Word的挑战,求伯君带领金山公司开发出了类似于Office套件的“盘古组件”,包括金山皓月、文字处理、双城电子表、金山英汉双向词典、名片管理、事务管理。但是,这个产品不仅没有赢得市场,而且丢掉了在Dos操作系统中的领先优势。

  后来,求伯君把盘古组件失利的原因归纳为四点:(1)“盘古”力量分散,没有发挥WPS当时在字处理领域的领先优势;(2)没有沿用WPS这个很有号召力的名称;(3)盘古自身不够完善,没有做到“所见即所得”,完全是DOS版的照搬;(4)刚刚独立的珠海金山公司缺少销售经验。
  

“盘古组件”标志着WPS向windows平台的过渡


  第三代:

  WPS 97:所见即所得 凤凰涅磐

  盘古的失利使金山......

阅读全文(2884) | 评论:1

c语言中命令行参数argc,argv(2007-08-10 21:50:00)

摘要:c语言中命令行参数argc,argv关键词: argc,argv                                           main(int argc,char **argv)
argv为指针的指针
argc为整数
char **argv or: char *argv[] or: char argv[][]
main()括号内是固定的写法。

下面给出一个例子来理解这两个参数的用法:

假设程序的名称为prog,

当只输入prog,则由操作系统传来的参数为:

argc=1,表示只有一程序名称。
argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog

当输入prog para_1,有一个参数,则由操作系统传来的参数为:

argc=2,表示除了程序名外还有一个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。

当输入prog para_1 para_2 有2个参数,则由操作系统传来的参数为:

argc=3,表示除了程序名外还有2个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。
argv[2]指向参数para_2字符串。



......

阅读全文(4749) | 评论:0

雷军:接任金山CEO时曾经挣扎了3天(2007-08-08 22:54:00)

摘要: 也许仅仅依靠学习,雷军永远不是人们心目中的天才,但是,加上一点点不死心,就足以让他在中国IT界留下自己的名字了   “天才之所以是天才,绝不是我雷军这样的凡夫俗子靠勤奋所能达得到的,但是我仍然有一点点不死心。”雷军不是一个天才,但是,他总是在追赶跑在前面的天才们。这一点点的不死心,让雷军付出了更加多的精力和时间。   接任金山CEO的时候,雷军有过挣扎,前后辗转反侧3天,他始终觉得自己很难成为心目中的偶像柳传志这样的管理型人才。毕竟,雷军曾经的梦想是成为中国最好的程序员。然而,依靠着那一点点不死心,雷军接任金山CEO的9年,逐渐带领金山走出了10年前遭遇微软惨败的阴影。   如今,金山毒霸、WPS OFFICE已经成功打入日本及东南亚市场,金山的网络游戏也做出了口碑,雷军作为毒霸、WPS、游戏三驾马车的掌舵人,未来还要带领着这三驾马车继续走国际化道路,走融资上市的道路。   书生意气   雷军身上有一种书生气,不少认识雷军的人这样评价。从他过去的经历看,他确实是一个“书生”。小学升初中、初中升高中直至高中升大学,雷军的成绩始终名列前茅。走进大学的第一个晚上雷军就去上自习。   “在我的印象中,闻一多等很多名人都是在大学成名的,我当时也想利用大学的机会证明我的优秀。”雷军每天早上七点钟去教室占座位,总要坐在最好的位置上听课;周末他喜欢看电影,但经常要自习到九、十点钟后看晚间场。   回忆那段学生生涯,雷军把最后的结果归于最初的不自信。他说:“我特别害怕落后,怕一旦落后,我就追不上,我不是一个善于在逆境中生存的人。我会先把一个事情想得非常透彻,目的是不让自己陷入逆境,我是首先让自己立于不败之地,然后再出发的人。”为了不落后于人,雷军戒掉了午睡的习惯,把时间分割成以半小时为单位,为自己制定好每半小时的学习计划,最终,雷军大一写的程序,等他上大二的时候,已经被编进大一教材里了。他用两年的时间学完了大学四年的课程。   创业初体验   学业的成功让雷军有了自己的梦想,他希望可以成为中国最好的程序员。也正是由于能写出好的程序,雷军误打误撞加入了最早一批在大学就开始创业的人群当中。然而,这次学校中的创业最终不了了之,在发布了几个不赚钱的程序后,雷军意识到了自己的不足。“我们那时候都不懂做生意,以为会写程序就行了,还是太嫩了。”   雷军至今依然记得结束创业回......

阅读全文(1565) | 评论:0