开发人员应该知道的一些东西〈转〉

 鉴于经常看到很多傻傻的问题,比如xx语言干什么用的,xxx语言是不是落伍了?(不过说实在的,这些问题初学者都会有.)
  我在这里说说开发人员应该知道的一些东西。但是这些只是我在平日里看到和想到的。难免有所偏差,请见谅.
 
软件开发,是一个综合性的活计。软件开发,并不仅仅是编写代码.学会了用c这些编程语言进行编程只是第一步,一个最最基本要求。其他要的东西还多着呢。在
我看来,程序员大致可以分为两类.当一个工作任务分配到程序员身上时,一种程序员知道为什么要这样去做.另外一种则知道怎么去做完这个工作.
  
而这个区别就大了.如果你知道为什么要这样去实现,这个至少说明你能把握住你的任务在软件工程里面的位置.如果你只是仅仅知道怎么去完成他.那只是说明你
能做完这个工作而已.想做好就不一定能行了.而第一种程序员一定能做好.做的最优.看看下面的条条,希望对大家都有所帮助.

  第一要说的,编程的关键是什么?
  编程不是实现了代码就可以了.引用我的友人的一句话,“编程讲究是一个整体的平衡性。”
 
 对于这个他是这样解释的。“平衡性,是软件的很重要的部分,从平衡性的角度去考虑编程,就会抑制你想要用最新技术,最新系统等等一些想法。因为从平衡性
的角度考虑,只要你的软件有一个瓶颈出现,你的程序就是失败。你首先要考虑的是怎么消除程序中可能存在的一些瓶颈。在这个基础上你才有权利去考虑提高你程
序的性能”.就算你拥有最新的技术,最好系统,如果你的代码不行。只要你的程序有性能瓶颈存在,等于什么都没有做。
   
  在这里我想说的就是程序是人写的。如果你的水平不行,再好的现成的技术也是用不起来的。就算用起来了,你可能没有办法说清楚,为什么这样用?

  第二要说的,怎么编程?
 
 我想很多人看到这个问题,一定会在心里把我骂的体无完肤的。心想这小子活腻了。骂也无妨。暂且听我说。我说的怎么编程不是要说怎么写详细的代码,而是你
的程序最终是怎么形成的。我想写到这里又有人把我给陵迟了一次了。但实际上编写代码是在软件的生产过程中占有时间比较少的一块。

  我个人觉得要包含以下的几个部分:
  1。市场潜力分析
  分析你要写的软件能不能卖出去,或者说我要编写什么样的软件?
  2。同类产品竞争分析
  看看你的同类产品的优缺点,设计你的软件的卖点.(如果没有卖点,就没有必要继续了)
  3。软件设计
  写出详细的软件流程,数据流程。主要算法。软件架构等
  4。编写代码
  不用说了吧
  5。bug测试和试运行
  6。卖

  这些事,有的是市场的事,有的是系统分析员的事,还有的是编程的事。但是在很多小公司,本着小公司事必亲恭的办事原则。大家多了解一点是不会有错的。
   
  举个具体的例子来说。假如我要编写一个共享软件。我要怎么做呢?
   
  1。要好好想想我要写的软件有没有“钱”途。时间在15天-30天左右。在这段时间里面一定要好好的做一下市场考察.这个可是最关键的一步.
  2。好,我已经决定要写xxx软件了。
  3。在网上找几个对xxx最有威胁的同类软件,分析它们优缺点。要它们的优点,不要他们的缺点。设计出自己软件的卖点.
  4。根据前面分析的结果,大概的列出xxx软件应该具有的功能表
  5。写出1.0版的基本功能表,写出1.x的功能表。不要一次就做完全部的功能,这样的话,你的软件永远都没有出世的机会  
  6。选择编程语言 (看看,编程语言到这里才出来)
  7。上网找类似的源代码,算法。RFC标准文档。吃透.软件代码和算法的良好重用,会让你事半功倍的.
  8。根据你选定语言,算法,标准文档,写出xxx的详细设计文档。文档一定要用,不然你的计划性就不强.计划性不强,随意性就大.随意性大了,软件很容易失败的.
  9。按照设计文档编写代码
  10。测试和卖

  第三,哪里有资料,标准文档
  
 
 代码的世界是千变万化的,
在开始一个新的项目之前,完全可以找一个类似功能的代码来看看。这样可以更好的改进你的程序。有时还可以加快进度。还有当新的技术出来时,你要看看相关的
文档。虽然不要完全了解它的功能,好处。但是你至少要知道新的技术能用在什么地方。怎么用。配合什么其他的技术用能更好的发挥它的作用。编写软件不是全部
的东西都是自己写的。有很多的功能是一种标准,也许是标准算法。像图形的,多媒体的,加密解密的算法。有的是一个标准的文件格式,像各种图像文件,多媒体
文件。还有的是一种标准的约定。像email,telnet等常见的网络工具。

  所以你要知道你可以从哪里找你要的资料。我把我知道的都写在这里

  源代码和技术资料站点
  www.vchelp.net gb
  www.csdn.net gb
  www.codeguru.com en
  www.codetools.com en
  www.dexv.com en
  msdn.microsoft.com en
  www.programmerheaven.com en
  www.freshmeat.net en
  www.sourceforge.net en
  www-900.ibm.com/developerWorks/ gb
  
  论坛和标准,组织
  www.linuxaid.com.cn gb
  www.linuxbyte.com gb
  www.aka.org.cn gb
  www.rfc.org en gb

  第四,要掌握的工具和知识
  工具,可以让你的工作更加的有效率和不易出错。
  
  下面的工具也许你用过,也许你没有用过。不过没有关系的。同行的老鸟会教我们怎么用的。(我想到哪个就写哪个。没有顺序问题)
  1。数据库工具
   建数据库工具,代表 powerdesigner
   数据库分析工具。很多大型的数据库都会带的。
  2。流程图设计 代表 visio 2000 , smartdraw
  3。case工具 代表 rose
  4。代码分析工具 
   代表 bounderchecker(for vc delphi),smartcheck(for vb) ….
  5。编辑器 
   代表 vi,vic,Ultra Edit
  6。源代码管理
   代表 vss ,cvs
  7。编程工具,不要我多说了吧
  8。其他的,我没有用过的,但是也许在某个行业用的很多的工具。(废话 :))  

  知识的话,因为每一个人的发展方向不一样,所以大部分人的知识结构都不一样。但是有几点应该是一样的。

  1。英语能力
 
  主要的新的技术,文档资料都是用英语来作为首发的。如果要学到更好更新的知识,技巧。不懂点英语也是不行的。也不要指望有人给你翻译出来。一般来说,
这些资料,看的懂的人不需要翻译,看不懂的人没有办法翻译。半懂不懂的人翻译出来的文章我想你也不敢看。所以大部分的资料还是英语原文的。当然也有很多的
人在翻译这些文章,但是对于这么多的资料来说,翻译过来的只是很小很小的一部分。求人不如求己。多学点英语没有错的。

  2。设计能力
 
 虽然一般来说,正规的公司有系统分析员做设计(我猜的)。但是70%-80%的小公司,可就不一定了。知道一点软件工程的知识,知道一些文档设计工具怎
么用。或者知道应该有哪些设计文档。也是很有好处的。比较这些东西如果你学到了,就是你自己的了。而且这些可是加工资的好东西。很有钱途的。:)

  3。语文写作能力
   作为一个程序员,大部分时间是都是在写代码。但是代码的注释,各种文档,测试报告,说明文档,使用手册编写,这些都需要文字功底的。 还有用email,bbs,qq这些工具与人交流的时候,如果话都说不清楚,那交流就更谈不上了。水平提高进步也就有点问题了。

  4。学习能力
 
  没有几个人是全部学会了再去工作的。这个不是很现实。目前社会也不太允许这样做。一边工作一边学习是很常见的。也许很多人是在工作之中才学会做某些事
情的。很多技能也是这样会的。此外,很多新的项目的到来。很新的技术的到来都要求我们能适应新的工作环境,新的工作要求。如果没有好好的学习是很容易被一
个项目踢掉的。呵呵。
另外有一点,当上司让你做你不会的东西时,你要告诉他,你不会,但是会在XX天内把他搞定。不会没有关系,会学习也是会上进的一种好表现。

  5。知道自己要做什么,要学什么,要发展什么。
   世界上软件技术是多的像9个牛上的毛一样多,也许还要多很多。如果我们什么都要知道。哦,天哪,我不想活了。
   作为一个软件人员也好,作为一个初学者也好。知道自己要往那个方向走是很重要的。不然很容易的就饿死在软件技术迷宫里的。最后只好不干这一行了。这个可不太好。

般来说,作为一个软件人员,掌握一到两个语言的开发能力就可以了。另外除非你是想做软件技术的研发(这些工作最有钱,在大型的公司是最受欢迎)。如果不是
做软件技术的研发,只是一般的应用程序编写的话,不用太关注今天出来什么新的技术,明天又出来什么新的技术。这些东西只要知道就行了。知道有这么回事就可
以了。以后有用的到的地方再去认真的关注也是不迟的。自己选择一个发展的方向,努力的向前走。不要被各种各样的新技术诱惑过去。说句实话,很多的所谓新技
术的怎么怎么好,怎么怎么优异,很多时候都是有商业行为在里面的。要自己会判断才行。如果不能判断怎么办,看下面的一条。

  第六:知道的更多
 
  很多初学者最麻烦的事是怎么在这么多的软件技术里面选择一种又好学,又有前途(钱途),又能做点什么伟大的事情的技术来开拓软件开发这个他们未知的领
域。对于这个麻烦的问题,很少有解。如果你能遇到一个很好的老师,那就是你的福气,千万要抓住这个机会。如果你不得不一人做出这个决定,那只能是小心翼翼
地来了。不过一般来说学c和c++都是一个不错的选择。
  初学者的另外一个麻烦的问题是,当我选择之后,在学习过程中出现的很多这个和那个的新
技术,新的变化。我该怎么办。这个也基本无解。只能是你自己慢慢慢慢积累。积累到你能理解这些新技术的出现是为了什么,这些新变化的发生是为知道的更
多……,这些新变化的发生是为了什么之后。你就会不怕这些的新的东西。
  我一向坚持,如果我知道的更多,我的力量就会更大。我就更不会怕出现变化。如果因为你的信息不足,而无法对某件事情进行判断时,千万不要强行进行判断。对你没有好处的。

转自http://topic.csdn.net/u/20110308/19/01ead01d-787f-44e5-bf30-b2795efc4c00.html

关于《orange‘s一个操作系统的实现》中调用门部分的补充和纠正

在《orange‘s一个操作系统的实现》中书对调用门中参数复制一点一略而过,并没有对参数大小等做出解释!上网找了很久发现并没有太多这方面的描述于是自已动手实验了一下并查了80386指令手册得出如下结论:

经过实验发现:如果调用门是向32位代码段跳转时,那么调用门在用param count复制时以一个参数为双字大小进得复制,也是就要复制的参数大小为(param count)*4字节,如果调用门是向16位代码段跳转时,那么调用门在用param count复制时以一个参数为单字大小进得复制,也是就要复制的参数大小为(param count)*2字节。那么什么时候向32位代码段中跳转,什么时候向16位代码段中跳呢?这关系到门描述符中TYPE字段中的内容,如果TYPE字段的值为4则为16位门描述符用来向16位代码跳转,如果TYPE字段的值为c时则为32位门描述符,用来向32位代码段跳转!

在指令返回时本书中那副堆栈示意图旁边那段代码疑似有错误,因为RET 中的参数应与调用门中的(param count)就该是对应关系,也就是说如果是16位调用门跳转时返回时应用retf/ret  (param count)*2来返回,如果是32位调用门跳转时返回时就用retf/ret  (param count)*4,这样堆栈才能平衡!但那一小段代码竟用ret 3!

以下为参考资料和实验代码:


Changing Size of Call
When adding 32-bit gates to 16-bit procedures, it is important to consider
the number of parameters. The count field of the gate descriptor specifies
the size of the parameter string to copy from the current stack to the stack
of the more privileged procedure. The count field of a 16-bit gate specifies
the number of words to be copied, whereas the count field of a 32-bit gate
specifies the number of doublewords to be copied; therefore, the 16-bit
procedure must use an even number of words as parameters.

There are three ways to cause a 16-bit procedure to execute a 32-bit call:
1. Use a 16-bit call to a 32-bit interface procedure that then uses a
  32-bit call to invoke the intended target.
2. Bind the 16-bit call to a 32-bit call gate.
3. Modify the 16-bit procedure, inserting an operand-size prefix before
  the call, thereby changing it to a 32-bit call.
Likewise, there are three ways to cause a 32-bit procedure to execute a
16-bit call:
1.
Use a 32-bit call to a 32-bit interface procedure that then uses a
16-bit call to invoke the intended target.

 

2. Bind the 32-bit call to a 16-bit call gate.
3. Modify the 32-bit procedure, inserting an operand-size prefix before
  the call, thereby changing it to a 16-bit call. (Be certain that the
 return offset does not exceed 64K.)
Programmers can utilize any of the preceding methods to make a CALL in a
USE16 segment match the corresponding RET in a USE32 segment, or to make a
CALL in a USE32 segment match the corresponding RET in a USE16 segment.


以下为代码:

代码: 


 

Win7中IE8中二级链接打不开

我朋友最近老是吵着IE坏了,今天抽空去看了一下,发现症状如下,打开IE后可以打开百度,但搜索后打不开二级链接,上网搜索发现网上有很多和这种情况一样的朋友,也有很多网友提供了很多方法,但大都不太管用!在这里贴出自己的经验,希望给有和我一样情况的朋友一点帮助!

 


思路是这样的,既然IE坏了,肯定是某个DLL文件失效或是某些文件损坏最省事的方法就是重装一下IE。能基本解决大部分IE问题。

 

1.打开控制面板 —> 程序

出现如下界面

然后单击“打开或关闭Windows功能

出现如下界面

2.将其中“Internet Explorer 8″勾选掉,然后单击确定。

然后根据提示重启电脑,在重启过程中会出现类似更新补丁的界面。

3.重启后再按前面步骤把



中的”Internet Explorer 8″勾中,然后再根据提示重启电脑,重启后发现IE的问题已经消失了。这种方法可以解决绝大部分IE问题,缺点是稍嫌麻烦!