第一篇:INTEL 80386 程序员参考手册(第一章)
第一章 80386介绍
80386是一款32位处理器,为多任务操作系统作了优化,为需要很高性能的应用程序而设计。32位寄存器和数据通道支持32位地址和数据原型。处理器可以寻址4G物理存储器和64T(264 字节)虚拟存储器。片上储存期管理部件包括地址转换寄存器,高级多任务固件,保护机制,以及页虚拟存储器。专用的调试寄存器即使在ROM程序中也能够提供数据和代码中断点。
1.1 该手册的组织结构
该书从5个方面阐述了80386的体系结构:
第I部分
- 应用程序 第II部分 - 系统编程 第III部分 - 兼容性 第IV部分 - 指令集 附录
上面的分类一方面取决于体系结构本身,一方面取决于使用这本书的不同方式。入下表所示,后面的2部分旨在作为参考手册来帮组那些致力于在80386上开发软件的程序员。前面的3部分则是理论说明,它们说明体系结构的用途,解释术语和概念,描述那些或与专属用途相关,或与专属体系结构相关的指令。
解释说明
第I部分
- 应用程序
第II部分 - 系统编程 第III部分 - 兼容性
参考 第IV部分 附录
- 指令集
前面的3部分陈述了80386 CPU的执行模式和保护特性。应用特性和系统特性的区别由80386的保护机制决定。保护机制的主要用意在于是操作系统免于应用的干扰;因此,处理器使得一些寄存器和和指令不能被应用程序访问。第I部分讨论的是可以被应用访问的特性;第II部分讨论的特性只能由授权的系统软件或在非保护模式下访问。
80386的处理模式同样控制着可访问的特性。80386有3种处理模式:
1. 保护模式。2. 实地址模式。3. 虚拟8086模式。保护模式是80386处理器的正常的32位环境。在这种模式下,所有的指令和特性均可使用。
上电后处理器即进入实地址模式(经常简称为“实模式”)。实地址模式下,80386看起来像是一个更快速的,增加了一些新指令的8086。大多数80386软件在实地址模式下只是进行一些初始化操作。
虚拟8086模式(也常被称作“V86模式”)是一种动态模式,在这种意思上说,处理器可以频繁,快速的在V86模式和保护模式之间切换。CPU从保护模式进入V86模式去执行8086程序,然后再离开V86模式,进入保护模式继续执行原来的80386程序。
在保护模式下可使用的任何特性在V86模式下对于所有程序来说是一样的。这些特性构成了第I部分。在保护模式下系统软件可以使用的其他一些特性组成了第II部分。第III部分阐述了实地址模式和V86模式,也包括如何执行一个32位和16位的混合程序。
所有模式下可使用
第I部分-应用程序 只能在保护模式下使用 第II部分-系统编程 兼容模式
第III部分-兼容性
1.1.1 第I部分-应用编程
这部分呈现的是通常被应用程序员使用的特性。
第2章-基本编程模型:介绍了存储器的组织结构模型。定义数据类型。列举应用程序使用的寄存器集合。介绍堆栈。说明字符串操作。定义指令的组成。解释了地址计算。介绍应用程序可能用到的阿中断和异常。
第3章-应用指令集:纵览应用程序经常使用的指令。将指令按照功能分组;例如,字符串指令被分在一组,控制-传输指令被分在另一组。解释指令的概念。关于单个指令的详细介绍被放到了第IV部分,指令集参考。
1.1.2 第II部分-系统编程
这部分阐述的特性通常被下面的人使用:写操作系统,设备驱动,调试器以及为80386保护模式下应用程序提供支持的其他软件的人。
第4章-系统架构:纵览系统程序员使用的各项特性。介绍在第I部分没有提及的寄存器和数据结构。介绍面向系统的指令以及它们支持的寄存器和数据结构上下文。指出在在哪些章节可以找到寄存器,数据结构以及指令的详细信息。
第5章-内存管理:阐述了支持虚拟存储器的数据结构,寄存器以及指令的详细结构,以及段和页的概念。解释了设计者怎样选择存储器的组织模型,从完全线性(“平坦模式”)到使用页和段。
第6章-保护:展开存储器管理特性,包括它应用与断和页时的保护。说明了特权等级,堆栈切换,指针检查以及用户和超级用户模式的实现。多任务的保护被推迟到后面的章节。
第7章-多任务:阐述了硬件如何通过上下文切换和任务间保护来支持多任务。
第8章-输入/输出:揭示I/O特性,包括I/O指令,I/O的保护,以及I/O许可映射。
第9章-异常和中断:解释了80386中断的基本运行机制。中断和异常怎样和保护相联系。讨论了所有可能的异常,列举了触发条件和需要处理的信息,以及异常的恢复。
第10章-初始化:定义了处理器在复位或上电后的状态。说明了为实地址模式和保护模式设置寄存器,标志位以及数据结构。包含一个初始化示例。
第11章-协处理和多处理:解释了支持数字协处理器和共享存储器的多CPU的指令。
第12章-调试:告诉我们怎样使用调试寄存器。
1.1.3 第III部分-兼容性
本书的其他章节基本上把处理器看作是32位机器,为了简单而省略了16操作部件。确实,80386是32位机器,但是它的设计完全支持16位的操作数和寻址。这部分通过对在32位程序中支持16位程序和16位操作数的说明完整的描述了80386的结构特性。所有的3种模式均可执行16位程序:保护模式可以直接执行80286保护模式下的16位程序,实地址模式执行8086程序和80286实地址模式程序,虚拟8086模式在多任务环境下和其他80386保护模式程序一起执行8086程序。另外,32位和16位模块可以在保护模式下与32位和16位操作混合使用。
第13章-执行80286保护模式代码:在保护模式下,80386完全可以执行80286保护模式代码,因为80286是80386的子集。
第14章-80386实地址模式:说明80386的实地址模式。在这种模式下,80386看起来更像是一个快速的实地址模式下的80286,或增加了新指令的快速8086。
第15章-虚拟8086模式:80386能够快速的在保护模式和虚拟8086模式之间切换。这使其有能力在32位“本地模式”程序之间执行8086的多道程序。
第16章-混合16位和32位编码:即使在同一个程序或任务内,80386也能够混合16位和32位编码。而且,任何给定的模块可以同时使用16位和32位操作数和地址。1.1.4 第IV部分-指令集
第I,II,III部分给出了指令和体系结构特定细节相关的总体描述,这部分用字母序列出了指令集,为汇编程序员,编写调试器,编译器,操作系统的人等提供了具体细节。指令介绍包括操作的逻辑描述,对标志位的影响,设置标志位的影响,操作数或地址长度属性的影响,处理器模式的影响以及可能产生的异常。
1.1.5 附录
附录给出了编码表和其他细节,它们被组织成了可以被汇编程序员和系统程序员快速索引的形式。
1.2 其他文献
下面的书籍包含有关80386的其他资料。
● Introduction to the 80386, order number 231252 ● 80386 Hardware Reference Manual, order number 231732 ● 80386 System Software Writer's Guide, order number 231499 ● 80386 High Performance 32-bit Microprocessor with Integrated Memory Management(Data Sheet), order number 231630
1.3 符号转换
本手册在描述数据结构,指令助记符,十六进制数以及上标和下标时用了特殊的符号。下标用{}括起来,例如10{2} = 10 以2为基。上标用()加上前面的^来表示,例如,10^(3)= 10的3次幂。复习这些符号有助于以后的阅读。
1.3.1 数据结构格式
在内存数据结构的示例图中,低位地址出现在图示的右边;地址从右至左,从下往上递增。位从右向左依次编号。图1-1举例说明了这种惯例。1.3.2 未定义位和软件兼容性
在许多寄存器和存储器的布局图中,一些位被标记为未定义。当位标记为未定义(如图1-1所示)时,将来的软件将这些位按未定义来处理对于软件兼容性非常重要。在处理未定义位时软件应该遵循下列规则:
在测试含有未定义位的寄存器时,不要依赖这些位的状态。在测试前要屏蔽掉这些未定义位。
在将寄存器的值拷贝到另一个寄存器时,不要依赖这些位。 不要依赖于保留在已写入未定义位的信息。 装载寄存器时,要始终把未定义位按0载入,或以之前存在寄存器中的值重新载入。
注意: 依赖于寄存器中的未定义位将导致软件依赖于80386在处理这些位时的未指定的处理方式。如果将来的处理器使用了未定义位,那么依赖于这些位的软件有不兼容的风险。任何软件都要避免依赖于未定义的80386寄存器位。
1.3.3 指令操作数
当用符号表示指令时,你正在使用的是80386汇编指令集。在这个集合中,指令遵循下面的格式:
标号:前缀 助记符 参数1,参数2,参数3
这里: 标号是指令的标识符,后面跟冒号。前缀是一条指令前缀的可选保留名字。
助记符暗示指令执行的操作,操作码中的一个保留字。
操作数参数1,参数2,参数3为可选项。可以有0-3个参数,取决于指令码。当含有参数时,它们或者是立即数,或者是数据项的标识符。操作数标识符可以是寄存器的保留字,或者在其他程序中声明(在例子中可能没有这种形式),指向数据项。当修改数据的指令中含有两个操作数时,右边的是源操作数,左边的是目的操作数。
例子:
LOADREG: MOV EAX, SUBTOTAL
本例中,LOADREG是标号,MOV是操作码指令助记符,EAX是目的操作数,SUBTOTAL是源操作数。
1.3.4 十六进制数
十六进制数字后面加上H的字符串表示以16为基的数字。十六进制数字从下面的集合中选取(0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F)。某些情况下,特别是在程序语法例子中,一个前导零会被加在A-F前面。例如,0FH等于十进制的15。
1.3.5 上标和下标
本手册使用特殊的符号来表示上标和下标。下标用{}括起来,例如10{2} = 10 以2为基。上标用()加上前面的^来表示,例如,10^(3)= 10的3次幂。
编者注:本手册在适当的地方用实际形式来表示上标和下标。
第二篇:程序员入门进阶手册
这篇文章,我主要是让你成为更为专业的入门程序员。请注意,此时,你可能需要读一些比较枯燥的书,但我想说,这些是非常非常重要的。你一定要坚持住。
编程技能
在系统地学习编程技能之前,我希望你能先看一下 “ The Key To Accelerating Your Coding Skills”,这篇文章会告诉你如何有效地快速提高自己的编程能力。然后接下来是下面几大块内容,但还只是入门级的。
编程技巧方面这个阶段,你可以开始了解一下 Java 语言了,我个人觉得 Java 是世界上目前为止综合排名最好的语言。你一定要学好这门语言。推荐《Java 核心技术(卷 1)》,除了让你了解 Java 的语法,它还会让你了解面向对象编程是个什么概念(如果你觉得这本书有点深,那么,你可以降低难度看更为基础的《Head First Java》)。然后,既然开始学习Java 了,那就一定要学 Spring,推荐看看《Spring in Action》或是直接从最新的 Spring Boot 开始,推荐看看《Spring Boot 实战》。关于 Spring 的这两本书,里面可能会有很多你从来没有听说过的东西,比如,IoC 和 AOP 之类的东西,能看懂多少就看懂多少,没事儿。
操作系统。这里你可以看看《鸟哥的 Linux 私房菜》,这本书会让你对计算机和操作系统,以及 Linux 有一个非常全面的了解,并能够管理或是操作好一个 Linux 系统。当然,这本书有很多比较专业的知识,你可能会看不懂,没关系,就暂时略过就好了。这本书的确并不适合初学者,你能看多少就看多少吧。
网络协议你需要系统地了解一下数据库设计中的那些东西,这里推荐慕课网的一个在线课程--“数据库设计的那些事”。每个小课程不过 5-6 分钟,全部不到 2 个小时,我相信你一定能跟下来。你需要搞清楚数据的那几个范式,还有 SQL 语句的一些用法。当然,你还要学习和使用一下数据库,这里推荐学习开源的 MySQL。你可以看官方文档,也可以看一下这本书《MySQL 必知必会》。 前端方面在你处理中文时有时会发现有乱码出现,此时需要了解 ASCII 和 Unicode 这样的字符编码。这里推荐一篇文章Character encoding。还有 Github 上的这两个 Awesome 仓库:Awesome Unicode 和 Awesome Code Points。
为什么转成 Java 语言?
相信你可能会问,为什么之前学习的 Python 和 JavaScript 不接着学,而是直接切到 Java 语言上来,这样会不会切得太快了。这是一个好问题,这里需要说明一下,为什么我会切到 Java 这个语言上来,主要是有以下几方面考虑。1.Java 是所有语言里面综合实力最强的,这也是为什么几乎所有大型的互联网或是分布式架构基本上都是 Java 技术栈。所以,这是一个工业级的编程语言(Python 和 JavaScript 还达不到这样的水准)。
2.之所以,没有用 Java 来做入门语言而是用了 Python,这是因为编程是一件比较费脑子的事,一开始学习时,兴趣的培养很重要。Python 比较简单,容易上手,能够比较容易地提起兴趣,而用 Java 则可能比较难。3.在你有了一些编程语言的基础后,有了一些代码的逻辑后,切到工业级的编程语言上来,更为专业地学习编程,是非常有帮助的。像 Python 和 JavaScript 这样的动态语言用着是很爽,但是,只有像 C、C++ 和 Java 这样的静态语言才可以让你真正地进阶。
4.对于一个合格的程序员,掌握几门语言是非常正常的事情。一方面,这会让你对不同的语言进行比较,让你有更多的思考。另一方面,这也是一种学习能力的培养,会让你对于未来的新技术学习得更快。很多时候,一些程序员只在自己熟悉的技术而不是合适的技术上工作,这其实并不好,这会让你的视野受限,而视野会决定你的高度。综上所述,这就是在入门的时候我故意让你多学几门语言的原因。
编程工具
编程工具方面,你需要开始学习使用下面这些工具了。
编程的 IDE。传统一点的,你可以使用 Eclipse。当然,我推荐你使用 Intellij IDEA。这两个工具都可以开发各种语言,但是主要用在 Java。如果你想玩得更时髦一些的话,使用 Visual Studio Code 也不错,这个工具潜力十足,用其开发 Python、JavaScript、Java、Go、C 和 C++ 都能得心应手(教程-本文发布时还基本没怎么翻译完)。
版本管理工具。版本管理工具是非常重要的编程工具。传统的有 P4、SVN、CVS 等,但都会被 Git 取代,所以,你就只用学习Git 就好了。学习Git 的教程网上有很多,这里我推荐非常系统的 Pro Git 第二版(如 果你觉得 Pro Git 比较枯燥的话,备选猴子都能懂的 Git 入门),然后你要学会使用 GitHub。关于一些 Git 环境安装和准备以及 GitHub 使用,你可以自行 Google(比如:这篇Github and Git 图文教程 或是这篇Git 图文教程及详解)。
调试前端程序。你需要学会使用 Chrome 调试前端程序,Google 一下会有很多文章,你可以看看 超完整的 Chrome 浏览器客户端调试大全。 数据库设计工具。你需要学会使用 MySQL WorkBench,这个工具很容易使用。相关的手册,你可以看一下官方文档。
实践项目
这回我们需要设计一个投票系统的项目。业务上的需求如下:
用户只有在登录后,才可以生成投票表单。投票项可以单选,可以多选。
其它用户投票后显示当前投票结果(但是不能刷票)。投票有相应的时间,页面上需要出现倒计时。
投票结果需要用不同颜色不同长度的横条,并显示百分比和人数。
技术上的需求如下:
这回要用 Java Spring Boot 来实现了,然后,后端不返回任何的 HTML,只返回 JSon 数据给前端。
由前端的 JQuery 来处理并操作相关的 HTML 动态生成在前端展示的页面。
前端的页面还要是响应式的,也就是可以在手机端和电脑端有不同的呈现。这个可以用 Bootstrap 来完成。
如果你有兴趣,还可以挑战以下这些功能。
在微信中,通过微信授权后记录用户信息,以防止刷票。 可以不用刷页面,就可以动态地看到投票结果的变化。
Google 一些画图表的 JavaScript 库,然后把图片表得风骚一些。
小结 上面那些书和知识你要看完,还要能理解并掌握,我估计你最少也要花 1-2 年左右的时间。如果你能够走到这里,把前面的那些知识都了解了,不用精通,能独立地做出上面的那些实践项目,那么,你就算是真正的入门了。
而且,你已经是一个 “ 全栈工程师 ” 的样子了,在这里我要给你一个大大的赞。如果这个时候,你对编程还有很大的热情,那么我要恭喜你了,你可能会是一个非常不错的程序员。加油啊!
上面的那些技术已经算是比较专业的了。如果你已经大致掌握了,我相信你可以找到至少年薪 20 万以上的工作了,而且你的知识面算是有不错的广度了。但是深度还不够,这个时候,是一个比较关键点了。
你可能已经沉醉在沾沾自喜的骄傲的情绪中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的开发,成为一个搬砖的码农。你也可以开始选择一个方向开始深入。
我给你的建议是选择一个方向开始深入。因为你并不知道你未来会有多大的可能性,也不知道你会成为什么样的人,所以为什么不再更努力一把呢?
后面,我们就开始非常专业的程序员之路了。这也是一般程序员和高级程序员的分水岭了,能不能过去就看你的了。
第三篇:FastReport 4程序员手册
FastReport 程序员手册
一、使用TfrxReport 组件工作
1、加载并存储报表
默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中。多数情况下,无须再操作,因而你就不必采用特殊方法加载报表。如果你决定在文件中存储报表窗体或者是数据库的Blob字段(他提供了非常大的弹性,你能够在非编译程序中修改),你必须使用“TfrxReport”提供的加载和存储方法。
function LoadFromFile(const FileName: String;ExceptionIfNotFound: Boolean = False): Boolean;从一个给定名字文件中加载报表。如果第二个参数等于“True”并且文件没找到,那么他会触发一个异常。如果文件加载成功,他返回“True”。
procedure LoadFromStream(Stream: TStream);从流中加载报表。
procedure SaveToFile(const FileName: String);用特殊名称文件存储报表。
procedure SaveToStream(Stream: TStream);把报表存在流中。
例如: Pascal: frxReport1.LoadFromFile('c:1.fr3');frxReport1.SaveToFile('c:2.fr3');C++: frxReport1->LoadFromFile(“c:1.fr3”);
frxReport1->SaveToFile(“c:2.fr3”);
2.设计报表
通过“TfrxReport.DesignReport”方法调用报表设计器。你必须在你的项目中包含报表设计器(必要条件是:要么使用“TfrxDesigner”组件,要么增加“frxDesgn”单元到uses列表)“DesigReport”方法接受两个默认参数:
procedure DesignReport(Modal: Boolean = True;MDIChild: Boolean = False);Modal参数决定设计器是否被模态,MDIChild参数允许把设计器窗体作为一个MDI子窗体。
例如:
frxReport1.DesignReport;
3.运行报表
应用下面两个“TfrxReport”方法中的一个启动报表: procedure ShowReport(ClearLastReport: Boolean = True);启动报表并在预览窗体中显示。如果“ClearLastReport”参数等于“False”,报表将会增加先前的一个报表结果,否则清除前一个报表结构。
function PrepareReport(ClearLastReport: Boolean = True): Boolean;启动报表,没有打开预览窗体,参数赋值与“ShowReport”方法同名。如果报表构造成功,他返回“True”。
多数情况下,使用第一种方法更为方便一些。在报表被构造的同时,他会立刻显示一个预览窗体。
当需要增加另一个报表到前一个报表中的时候,“ClearLastReport”参数显得方便些。(此类技术用于批量报表打印)。
例如:
frxReport1.ShowReport;
4.预览报表
使用两种途径显示一个报表是可能的:两者都是调用“TfrxReport.ShowReport”方法(先前描述过了),或者使用“TfrxReport.ShowPreparedReport”方法来帮助实现。在第二种情况下,报表构造没有被执行,但显示了一个完成的报表。也就是说,你要么在“PreparedReport”方法帮助下构造他,要么在构造前从文件中加载报表(查看“加载/存储完成的报表”)
例如:
Pascal: if frxReport1.PrepareReport then frxReport1.ShowPreparedReport;C++:
if(frxReport1->PrepareReport(true))frxReport1->ShowPreparedReport();
在这种情况下,报表构造器先被完成了,并显示在预览窗体中。构造一个庞大的报表可能要花费很多时间,那就是为什么使用“ShowReport”非等时同步方法会好于
“PrepareReport/ShowPreparedReport”方法。你可以通过“TfrxReport.PreviewOptions”属的缺省值设定预览参数值。(这句翻译的不够好,请参考原文)
原文参考:In this case, report construction is finished first, and after that it is displayed in the preview window.Construction of a large report can take
a lot of time, and that is why it is better to use the “ShowReport anisochronous” method, than the “PrepareReport/ShowPreparedReport” one.One can assign
preview settings by default via the “TfrxReport.PreviewOptions” property.[SPAN]
5、打印报表大多数情况下,你可以从预览窗体打印报表。要人工打印报表,你应该使用“TfrxReport.Print”方法,例如:
frxReport1.LoadFromFile(...);
frxReport1.PrepareReport;
frxReport1.Print;
同时,你可以在显示的打印对话框中设置打印参数,你也可以使用默认设定值。取消打印对话框,请参考“TfrxReport.PrintOptions”属性帮助
6.载入并存储报表
这个功能可以在预览窗口中执行。也可以使用手工方法执行,帮助参考“TfrxReport.PreviewPages”方法:
function LoadFromFile(const FileName: String;ExceptionIfNotFound: Boolean = False): Boolean;
procedure SaveToFile(const FileName: String);
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);赋值和参数化类似与TfrxReport相应的方法。文件包含了完成的报表,默认情况下以“FP3”为扩展名。
例如: Pascal: frxReport1.PreviewPages.LoadFromFile('c:1.fp3');frxReport1.ShowPreparedReport;
C++: frxReport1->PreviewPages->LoadFromFile(“c:1.fp3”);frxReport1->ShowPreparedReport();
注意,完成的报表加载完毕后,预览方法是通过“ShowPreparedReport” 方法执行的。
7.导出报表
他可以从预览窗口中执行。也可以手动操作,通过“FfrxReport.Export”方法,及这个方法中的参数,你可以导出你想要导出的文件类型:
frxReport1.Export(frxHTMLExport1);
导出过滤组件必须是有效的(你必须把他们放到你项目中的窗体上)并调整正确。
The export filter component must be available(you must put it on the form of your project)and be adjusted correctly.8.创建自定义预览窗体
FastReport在标准的预览窗口中显示报表。如果因为某些原因而不适合你,你可以创建一个自定义预览窗体。为了这个目的,需要设计FastReport组件面板中的“TfrxReport”组件。要显示报表,TfrxReport.Preview方法应该连接到这个组件。
在使用TfrxPreview组件的时候,有两个典型的问题。他不会处理按键(箭头,PgUp,PgDown等等)和鼠标滚轮(如果有的话)。要让TfrxPreview同按键工作,设置焦点给他(他是可以做到的,例如,在窗体的OnShow事件句柄中)
frxPreview.SetFocus;
要让TfrxPreview同鼠标滚轮工作,你必须创建OnMouseWheel事件句柄,并且调用TfrxPreview.MouseWheelScroll方法。
procedure TForm1.FormMouseWheel(Sender: TObject;Shift: TShiftState;WheelDelta: Integer;MousePos: TPoint;var Handled: Boolean);begin frxPreview1.MouseWheelScroll(WheelDelta);end;
9.建立复合报表(批量打印)
在某些情况下,需要立刻组织几个报表打印,或者在一个打印预览窗体中封装并呈现几个报表。要执行这些,在FastReport中有些工具能够允许建立一个新的报表附加在一个已经存在的报表上。“TfrxReport.PrepareReport”方法中有一个选项“ClearLasReport”布尔类型参数,默认情况下他等于True,这个参数定义了是否有必要在建立报表时清除前一个报表。下面的方法展示了如何从两个报表中建立一个批量报表: Pascal:
frxReport1.LoadFromFile('1.fr3');frxReport1.PrepareReport;frxReport1.LoadFromFile('2.fr3');frxReport1.PrepareReport(False);frxReport1.ShowPreparedReport;
C++:
frxReport1->LoadFromFile(“1.fr3”);frxReport1->PrepareReport(true);frxReport1->LoadFromFile(“2.fr3”);frxReport1->PrepareReport(false);frxReport1->ShowPreparedReport();我们加载并建立第一个报表,但并没有显示他。然后我们加载第二个报表到同一个TfrxReport对象,并使用“ClearLastReport”参数,让他等于False。这就允许第二个报表附加在先前建立的报表之后。接下来,我们在预览窗口中显示一个完成的报表。
9.1 复合报表中的页数
你可以使用“Page”,“Page#”,“TotalPages”和“TotalPages#”系统变量显示页数或总页数,在复合报表中,这些变量以下面的方式工作: Page批量报表页数
TotalPages批量报表总页数
9.2 合并符合报表页数
正如上面所说的,报表设计页中的“PrintOnPrevousPage”方法让你在打印报表的时候使用前一页的剩余空间接合报表。在复合报表中,允许你在前一个报表的最后一页的剩余空间创建一个新的报表。要执行这个,要使能每一个连续报表的第一个设计页“PrintOnPreviousePage”属性[SPAN]10.交互报表
在交互报表中,你可以在预览窗口定义任意报表对象的鼠标单击反应。例如,一个用户能够单击数据线,结果运行一个带有选择线的明细数据。
任何报表都能交互。要执行他,你仅仅需要创建TfrxReport.OnClickObject事件句柄。下面代码是这个事件句柄的示例:
Pascal:
procedure TForm1.frxReport1ClickObject(Page: TfrxPage;View: TfrxView;Button: TMouseButton;Shift: TShiftState;var Modified: Boolean);begin if View.Name = 'Memo1' then ShowMessage('Memo1 contents:' + #13#10 + TfrxMemoView(View).Text);if View.Name = 'Memo2' then begin TfrxMemoView(View).Text := InputBox('Edit', 'Edit Memo2 text:', TfrxMemoView(View).Text);Modified := True;end;end;C++: void __fastcall TForm1::frxReport1ClickObject(TfrxView *Sender, TMouseButton Button, TShiftState Shift, bool &Modified){ TfrxMemoView * Memo;if(Memo = dynamic_cast
在对象的单击事件句柄上,你可以做如下事情:
-修改一个对象或页的内容,传递句柄(结果,被修改的将被特殊标记,因此修改的内容应该引起重视);
-由于使用重构或重新建立报表,调用TfrxReport.PrepareReport方法
在此例中,点击名字为memo1对象的结果显示这个对象内容的消息。当点击memo2是显示一个对话框,这个对象的内容可能被修改。设置Modified标志为True,允许保持和显示变更。
同样的方法,单击事件可以被定义成不同的响应。例如,运行一个新报表。如下注释是必要的。在FastReport3版本中,一个报表组件可以在一个预览窗口中显示唯一的报表(不像FastReport2.x版本)。那就是为什么一个报表预览窗也会在分开的对象中运行一个报表,或者是同一个对象,但当前报表必须被抹除。
关于给终端用户一个可单击对象提示定位,在预览窗口中,鼠标经过一个可单击对象的时候,我们可以修改鼠标的光标。要做到这些,在报表设计器上选择一个要设计的对象并设置他的cursor属性为不同于crDefault的某个值。
更多的细节涉及到定义的单击对象。在简单报表中,可以依照对象的名字或他的内容来定义。然而,这就不能更多的执行可修改的事例。例如,一个明细报表应当在一个数据选择行被创建。一个用户单击了内容为12的memo1对象。数据行让这个对象参考什么?那就是为什么你应当知道主键了,主键用于明确的标识这一行。FastReport能够赋值一个字串,包含任意数据(在我们的事例主键数据中),对于每个报表对象,这个字串存储在TagStr属性中。
让我们来通过一个报表的例子来举例说明,这个报表包含在FastReportDemo.exe-'Simple list'示例中。这是一个公司的客户列表,包含诸如客户名称,地址,联系人等数据。数据源是来自DBDEMOS演示数据库的Customer.db表。这个表有一个主键,CustNO字段,他没有出现在报表中。我们的任务是终止他通过参考单击完成报表上的任意对象记录他,这就意味着要获取主键的值,要执行此项操作,就要为所有对象的TagStr属性加入值,依赖于主数据栏: [Customers.“CustNo”]
在报表建立期间,使用相同的方法计算TagStr属性内容,同时计算文本对象的内容;这就意味着变量值会替代所有变量的位置。变量细节使用方括号括起来。那就是为什么行值是'1005', '2112'等类似值了。在报表建立后,包含TagStr属性对象的类型取决与主数据栏。一个简单的从字串到整形的转换就会提供给我们一个主键的值,这也是所需记录能够找到的主键。
如果主键是复合的(包含多个字段),TagStr属性的内容可能是如下值: [Table1.“Field1”];[Table1.“Field2”]
在构造一个报表完成后,TagStr属性包含“1000;1”类型值, 此值不同比相同要好。
11.从代码中存取报表对象 报表对象(例如:report page, band, memo-object)是不能在你的代码中直接存取的。这就意味着你不能通过名字寻址对象。例如,当你在你的窗体上寻址一个按钮。要寻址一个对象,在TfrxReport.FindObject方法中找到帮助:
Pascal: var Memo1: TfrxMemoView;Memo1 := frxReport1.FindObject('Memo1')as TfrxMemoView;C++: TfrxMemoView * Memo =
dynamic_cast
Pascal: var Page1: TfrxReportPage;Page1 := frxReport1.Pages[1] as TfrxReportPage;C++: TfrxReportPage * Page1 = dynamic_cast
12.从代码中创建报表
作为一项规则,你将在设计器中创建多数报表。然而,在某些情况下(例如,当报表窗体未知的时候),使用代码手工创建一个报表是是十分必要的。想要手工创建一个报表,你需要执行下面的顺序步骤:添加数据源添加报表页-添加栏页
-设置栏属性,接着把他们同数据相连
-在每个栏上加入对象
-设置对象属性,接着把他们同数据相连
让我们来检查一下创建一个简单报表的类型列表。假设我们拥有如下组件:frxReport1: TfrxReport and frxDBDataSet1: TfrxDBDataSet(最后一个连接到DBDEMOS数据,Customer.db表)。我们的报表将包含一个带有报表标题和主数据栏的页。在报表标题栏上有一个带有“Hellow FastReport”文本的对象,主数据栏包含一个带有连接到“CustNo”字段的对象。
Pascal: var DataPage: TfrxDataPage;Page: TfrxReportPage;Band: TfrxBand;DataBand: TfrxMasterData;Memo: TfrxMemoView;
{ 清除报表 } frxReport1.Clear;{ 为报表添加数据集到可存取的列表中 } frxReport1.DataSets.Add(frxDBDataSet1);
{ 添加“Data”页 } DataPage := TfrxDataPage.Create(frxReport1);
{ 添加页 } Page := TfrxReportPage.Create(frxReport1);{ 创建唯一名称 } Page.CreateUniqueName;{ 设置默认字段大小, 纸张和打印方向 } Page.SetDefaults;{ 修改纸张方向 } Page.Orientation := poLandscape;
{ 添加一个报表标题栏 } Band := TfrxReportTitle.Create(Page);Band.CreateUniqueName;{ it is sufficient to set the ?Top? coordinate and height for a band } { both coordinates are in pixels } Band.Top := 0;Band.Height := 20;
{ 为标题栏添加一个对象 }
Memo := TfrxMemoView.Create(Band);Memo.CreateUniqueName;Memo.Text := 'Hello FastReport!';Memo.Height := 20;{ 这个对象将伸展坐标到栏的宽度 } Memo.Align := baWidth;
{ 添加主数据栏 } DataBand := TfrxMasterData.Create(Page);DataBand.CreateUniqueName;DataBand.DataSet := frxDBDataSet1;{ 顶端的调整应当比先前加入栏的顶部+高度大一些 } DataBand.Top := 100;DataBand.Height := 20;
{ 在主数据栏上添加一个对象 } Memo := TfrxMemoView.Create(DataBand);Memo.CreateUniqueName;{ 连接数据 } Memo.DataSet := frxDBDataSet1;Memo.DataField := 'CustNo';Memo.SetBounds(0, 0, 100, 20);{ 调整文本到右侧的对象边缘 } Memo.HAlign := haRight;
{ 显示报表 } frxReport1.ShowReport;
C++:
TfrxDataPage * DataPage;TfrxReportPage * Page;TfrxBand * Band;TfrxMasterData * DataBand;TfrxMemoView * Memo;
// 清除报表
frxReport1->Clear();
// 在报表上添加一个数据集到数据集存取列表 frxReport1->DataSets->Add(frxDBDataset1);
// 添加“数据”页
DataPage = new TfrxDataPage(frxReport1);// 添加一页
Page = new TfrxReportPage(frxReport1);
// 创建一个不重复的名称 Page->CreateUniqueName();
// 设置域大小, 纸张和默认的打印方向 Page->SetDefaults();
// 修改纸张的打印方向
Page->Orientation = poLandscape;
// 增加一个报表标题栏
Band = new TfrxReportTitle(Page);Band->CreateUniqueName();
// 为栏充分设置顶部坐标和高度 // 在像素上包含坐标 Band->Top = 0;Band->Height = 20;
// 在报表标题栏加入一个对象 Memo = new TfrxMemoView(Band);Memo->CreateUniqueName();Memo->Text = “Hello FastReport!”;Memo->Height = 20;
// 此对象将会被按照栏的宽度延展 Memo->Align = baWidth;
// 添加主数据栏
DataBand = new TfrxMasterData(Page);DataBand->CreateUniqueName();
DataBand->DataSet = frxDBDataset1;// 顶部坐标应该大于前边添加栏的顶部坐标+高度 DataBand->Top = 100;DataBand->Height = 20;
// 主数据上加入一个对象
Memo = new TfrxMemoView(DataBand);Memo->CreateUniqueName();// 连接到数据
Memo->DataSet = frxDBDataset1;Memo->DataField = “CustNo”;Memo->SetBounds(0, 0, 100, 20);
// 调整文本到右侧对象的空白 Memo->HAlign = haRight;// 显示报表
frxReport1->ShowReport(true);
让我们来解释一些细节:
所有在报表中使用的数据集都必须添加到数据源列表中,在我们示例中,是用frxReport1.DataSets.Add(frxDBDataSet1)这一行执行的。否则,报表就不会工作。
数据页对于插入内部数据集是必要的,例如TfrxADOTable。这些数据集只能放在数据页。
调用Page.SetDefaults不是必须的,因为在这个案例中页A4纸张设置和页边距都是0毫米。默认值设置10毫米页边距,并捕获打印机页大小和对齐方式。
在增加栏到页面的同时,你要确认他们没有互相重叠在一起。要执行他,顶部和高度的坐标是相似的。总是要在设计器中定位相同的位置的。
对象的坐标和大小是以像素为单位的,因为所有对象的left, Top, Width和Height属性都拥有扩展类型,你能够指出非整形值。下面常量用于转化像素到厘米和英寸:
fr01cm = 3.77953;fr1cm = 37.7953;fr01in = 9.6;fr1in = 96;
例如,一个栏的高度等于5毫米如下设定: Band.Height := fr01cm * 5;Band.Height := fr1cm * 0.5;
12.代码中创建对话框 我们知道,报表可以包含对话框窗体。下面的例子展示了如何创建一个带有OK按钮的对话框窗体:
Pascal:
{ for working with dialogue objects the following unit should be used }
uses frxDCtrl;var Page: TfrxDialogPage;Button: TfrxButtonControl;
{ 添加页 } Page := TfrxDialogPage.Create(frxReport1);{ 创建唯一名称 } Page.CreateUniqueName;{ 设置大小 } Page.Width := 200;Page.Height := 200;{ 设定位置 } Page.Position := poScreenCenter;
{ 添加一个按钮 } Button := TfrxButtonControl.Create(Page);Button.CreateUniqueName;Button.Caption := 'OK';Button.ModalResult := mrOk;Button.SetBounds(60, 140, 75, 25);
{ 显示报表 } frxReport1.ShowReport;C++:
//使用对话框对象工作,会用到下面的单元
#include “frxDCtrl.hpp”
TfrxDialogPage * Page;TfrxButtonControl * Button;
//添加一页
Page = new TfrxDialogPage(frxReport1);
//创建唯一名称
Page->CreateUniqueName();
//设置大小 Page->Width = 200;Page->Height = 200;
//设定位置
Page->Position = poScreenCenter;
// 添加一个按钮
Button = new TfrxButtonControl(Page);Button->CreateUniqueName();Button->Caption = “OK”;Button->ModalResult = mrOk;Button->SetBounds(60, 140, 75, 25);
//显示报表
frxReport1->ShowReport(true);
第四篇:《程序员岗前培训手册》
程序员岗前培训手册
北京应用技术大学
目录(CONTENTS)
前言
面试是双向选择
软件公司研发技术岗位扫描与岗位职责
如何快速融入技术团队(程序员入岗的注意事项)优秀程序员应具有的品质与习惯 谈谈学习方法
外包软件、商品软件、项目软件简介
前言
同学们经过在北京应用技术大学两年的学习,都满怀憧憬地向往程序人生的开始,也对即将走上的工作岗位和环境充满了期待,期待通过程序来证明自我的价值。程序员,相信在很多同学眼中是一个有趣、特别、高薪、充满艰辛而又非常神秘的职业,因为手下那一行行跳动的代码不仅实现了生动的功能,同时也表达着程序员对人生的理解和追求。当程序员实现了一个独到的创意之后准备熄灯休息时,天已蒙蒙亮…..当程序员看着用户熟练地操作自己的软件解决一个个复杂事件时,脸上那写满成就的微笑…..的确在这个行业里出现了太多的英雄人物和企业,而每一个英雄的事迹和成就都足以让我们热血沸腾、摩拳擦掌……
在同学们即将步入程序员岗位之前,需要对软件研发相关职位的职责范围与工作特点有所了解,掌握一些入职的基本技巧和注意事项,检查自己的技能与行为习惯,有的放矢,提高面试和就业的成功率。入职后能尽快地融入到技术团队,近而快速成长,成为团队技术骨干和最优秀的职员。在工作中养成积极而良好的行为习惯和职业素养,为自己的职业发展创造一个良好的开端。
本手册从面试、技术岗位职责、如何快速融入技术团队、优秀程序员的品质与习惯、学习方法、外包软件/商业软件/项目软件简介等几个方面阐述了同学们在踏入工作岗位之前应该了解的知识和注意事项。
面试是双向选择
一般同学都会误认为面试时应聘者处于弱势,要接受招聘者的挑选,从而从心理上承受很大的压力,而影响自己正常的发挥和才能展示。其实大可不必,因为面试是双向的,选人和择业是平等的。况且现在市面上的用人单位或招聘岗位也是良莠不齐,甚至还有一些骗子公司,这就要求同学们在应聘时擦亮眼睛,注意分辨。当然大多数公司都是良性的,他们要么是已具规模,各部门及岗位功能分工很明确,他们会根据业务的发展或作为人才储备而有针对性的招聘相关技术人员,而有的公司可能是刚刚成立,业务与核心技术还未形成,他们需要招聘到能为他们提供解决方案或创意的技术人员,所以对于这些类型的公司,他们对人才的渴求也都不亚于同学们对工作岗位的渴求,若是聘到一个优秀的技术人员对业务或项目的推进将会使公司获得更大的利益,或者使公司的发展少走弯路甚至能改变一个公司的命运。相反,如果招不到合适的人才或者使用一个较差的技术人才,不但不能推进项目的进展,还要花费几个月的培养时间和费用,甚至阻碍业务开拓甚至项目搁浅。所以当同学们想得到一个工作岗位的同时,也要看到企业更需要一个优秀的员工,二者是平等的。在面试时,同学们在一种非常平和的心态下,充分发挥,尽可能地展示自己已经掌握的技能,展示学习能力和发展潜能;另一方面也要尽可能地提前了解公司的背景和业务以及应聘岗位的职能,从而加以辨别和选择。一旦本次面试不能成功,表明要么岗位不适合你,要么你不适合岗位,或者因为你本次的表现不佳,这都是很正常的,一定不要有挫败感,要及时总结面试时的表现方式以及沟通技巧,若感觉自己的确能够胜任该岗位,只是因为自己的临场发挥不佳而没有展示出自己的实际水平,也可及时和招聘公司联系,经询问确认对方没有找到合适人选的情况下,表明诚意,请求复试机会。总之,若本次失败,一定不要影响下一次的面试,要积极总结,为一下次面试作准备。
正常运营的公司因业务的不断发展,人才需要不断的更新、补充和储备,所以他们一直都需要人才,况且公司每次组织招聘都会花费一大笔费用,也希望能够找到合适的人才,所以公司面试时一般不会出太吊钻的问题来为难你,同学们也不要过分担心。
另一方面,同学们在坚信“天生我才必有用”的同时,也要正确看待现在的就业形势,对第一份工作也不要过于理想化,要摆正心态,坚持从基层做起,先就业再择业,职场上“骑驴找马”也未必不是一种现实的理性选择。
总之,面试是双向性的,是招聘单位与同学们相互展示、相互认识、互相挑选的一次沟通过程。同学们 在求职的过程中,要正确看待面试,放下思想包袱,充分重视,充分准备,从容应对。
软件公司研发技术岗位扫描与岗位职责
一般中小型软件公司设置的技术岗位有:研发总监、项目经理、需求分析人员、系统架构与分析人员、数据库设计人员、程序员、项目助理与文档专员、测试人员、技术支持(售前/售后)、美工或网站前台人员等,这些职位的工作联系非常密切,根据公司规模的大小,以上职位可由一人或多人兼任,比如一个小型的软件公司可能只有一个人完成软件的总体设计、架构、编码、测试、文档等工作。这些岗位的职责范围大致是:
研发总监:全面负责研发及技术部门的整体工作。
项目经理:在整个项目开发过程中组织项目所需的各项资源,对项目的范围、项目的质量、项目时间以及项目成本进行管理与控制。根据项目范围、质量、时间与成本的综合因素的考虑,进行项目的总体规划与阶段计划,保证项目组目标明确且理解一致;在项目生命周期的各个阶段,跟踪、检查项目组成员的工作质量;保证项目在预算成本范围内按规定的质量和进度达到项目目标。
需求分析人员:项目前期与客户方打交道最多的人,对于客户来说,他可以代表整个项目组,对于项目组成员来说他的意见可以代表客户方的意见,项目组内所有与客户需求相关的事情必需得到他的认可。他的工作主要是:
1、在项目前期根据《需求调研计划》对客户进行需求调研。
2、收集整理客户需求,负责编写《用户需求说明书》。
3、代表项目组与用户沟通与项目需求有关的所有事项。
4、代表客户与项目组成员沟通项目需求有关的所有事项。
5、负责《用户需求说明书》得到用户的认可与签字。
6、负责将完成的项目模块给客户做演示,并收集对完成模块的意见。
7、完成《需求变更说明书》,并得到用户的认可与签字。
8、协助项目组有关人员对需求进行理解。
系统架构与分析人员:是项目的总体设计师,组织构建新产品的开发与集成、新技术体系等,也可以理解为技术总监。是在技术上对所有重要事情做出决定的人。系统架构在整个软件开发过程中都起着非常重要的作用,并随着开发进程的推进而其职责或关注点不断地变化。
1、在需求阶段,负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等。审查客户和市场人员所提出的需求,确认开发团队所提出的设计;组织开发团队成员和开发过程的定义;协助需求分析师完成《用户需求说明书》、《需求变更说明书》等。
2、在设计阶段,负责对整个软件架构、关键模块、接口的设计。对系统进行分析与建模,完成《系统架构说明书》、《系统概要设计说明书》、《系统详细设计说明书》。
3、编码阶段,成为程序员的顾问,负责重点代码检查,并且经常性地要举行一些技术研讨会、技术培训班等;
4、测试及实施阶段,随着软件开始测试、集成和交付,集成和测试支持将成为工作重点;
数据库设计人员:根据《系统架构说明书》负责进行数据库选型与建模。由于数据库是整个系统运行的核心,数据库设计的好差直接影响着整个系统的开发效率和系统运行的优劣。他是项目组中唯一能对数据库进行直接操作的人,对数据库结构的每一次改动都要得到他的认可。主要职责:
1、根据数据库建模结果,绘制数据库关系图。进行数据库建库以及数据库进行初始化操作。
2、对数据库进行维护、备份、恢复、同步。
3、负责客户数据的导入导出。
4、根据《系统详细设计说明书》编写对应的视图、存储过程、函数、触发器等。
5、对项目组其它成员进行SQL方面的指导。
6、为测试建立相关测试数据。
程序员:负责系统的最终代码实现。主要职责:
1、参与需求调研、项目可行性分析、技术可行性分析和需求分析。
2、协助完成《系统详细设计说明书》,并根据《系统详细设计说明书》进行编码实现;
3、对自己代码进行复查,并进行简单的测试。
4、撰写相关技术实现或功能描述文档。
5、负责向项目经理及时反馈软件开发中的情况,并根据实际情况提出改进建议。
6、参与软件开发和维护过程中重大技术问题的解决。
项目助理或文档专员:协助项目经理在项目日常管理和数据分析方面的工作,进行与项目有关的协调工作,编写项目进度报表,参与组织项目协调会,组织项目非技术文档的编写、传递与归档,以及与市场人员或其他部门的日常沟通,协助项目资源协调工作。跟踪项目进展。项目或软件包的打包、发布以及授权锁的制作等工作。
测试员:负责实施软件测试。测试是整个项目系统中非常重要的一个环节,项目质量的保证,他的主要工作就是找到项目中存在的不合理、不合格的部份,并要求项目其它成员按其给定的项目质量完成项目。保证了系统功能实现是否与功能设计和需求定义一致。主要职责:
1、根据软件项目规范编写测试计划,设计测试数据和测试用例。
2、采用合适的测试方法实施软件测试,形成各阶段的测试报告,并对软件问题进行跟踪分析和反馈,推动测试中发现问题及时合理地解决。
3、完成对产品的集成测试与系统测试,对产品的功能、性能及其他方面的测试负责。
4、协助程序员进行软件代码检查,提出对软件的进一步改进的要求。
技术支持人员:主要负责软件产品或项目在技术层面上与客户的交流,根据工作重点分为售前支持和售后支持。
售前支持:是销售人员和开发人员的桥梁,协调销售人员、用户、开发人员的关系,制作产品功能演示PPT文档或多媒体资料,将公司的技术实力向用户展示,技术标书的撰写,定期采集、分析和整理用户的需求,配合销售制订产品销售策略,从技术上支持市场销售业务等。
售后支持:负责编写《用户手册》、《操作手册》,制作系统操作视频教程等多媒体培训教材;负责系统实施(包括系统安装、用户培训、系统试运行等),协助用户进行“用户确认测试”和编写《确认测试报告》;通过电话、网络、及时通讯等多种渠道解答用户在使用中的问题,提供售后服务。收集、整理用户的建议等。
美工或网站前台人员:负责完成软件设计师安排的功能界面设计和简单网站的设计。
1、负责对项目整体色彩的调配。
2、向系统分析师提出项目美化的建议。
3、为BS 项目提供一套或几套CSS样式表及HTML结构表
4、为CS项目提供符合项目内容的静态、动态图片。
5、并为程序员提供界面指导。
如何快速融入技术团队
——程序员入岗的注意事项
同学们刚刚结束学校的集体生活,面对新的工作环境、新领导、新同事、新任务、新的制度、新的生活节奏,很多的变化需要你尽快适应,很多的事情需要你独挡一面,而又有许多事情需要你与同事通力协作来完成…… 以下是新程序员入职后尽快融入技术团队应注意的事项:
1、认真学习公司的发展背景与历程、主营业务以及规章制度。
进入公司前可能对公司已经有了一些了解,入职后,相关人力资源管理部门会组织培训,解读公司文化,介绍公司发展背景、主要职能部门以及主要业务特点,学习公司考勤、人事、办公等管理规定和规章制度。有些新入职的程序员或技术人员,认为这些不含技术成分没有必要花精力去学习,其实这种认识是错误的,公司文化及各种制度是整个公司的灵魂,是公司正常经营活动保障和员工行为的一种约定,新职员只有对公司的发展背景和经营状态有充分的了解,接受公司文化,高度认同公司的核心价值观,严格遵守各种规章制度,才能自觉地规范自己的行为习惯,在工作学习中才有主动性,遇到工作压力时也能坦然地接受,不会有抵触心理,从而能更快地推动自己的工作。
2、积极学习业务知识、类库及现有程序资源,把握学习的技术方向。
程序员入职后,若有一个成熟的开发团队,一般都会有一个老职员来带领学习,这一阶段主要有三个方面的学习任务,第一是公司业务知识,因为程序员只有对业务知识熟悉了,才能更好的理解和把握功能需求,比如做通信方面的软件,你要学习一些通信行业知识;若做财务软件,你要了解一些财务知识。第二,现有的类库是公司开发部门积累的程序资源,学习和使用它可以规范统一程序的风格,提高开发的速度,掌握并能使用这些资源,可使你尽快与老职员有程序上的共同语言。第三,学习并加强在此领域的编程技能,因为在学校学习的是通用的知识,掌握的是一种知识导入与学习的方法,那么在公司应用方面也许要求你某一个方面很精通,比如网站的前台、数据库、图形处理、多媒体、网络编程等某些方面的技能需要强化。案例:
小张(男)和小胡(女)是同一个大学毕业的应届生,在2005年4月份同时进入公司做技术支持,当时两人的工资都是每月1500元,而两年后的今天小胡已是研发部的一个程序员,工资是每月4300元,而且是公司重点培养的对象之一。小张现在还是在做技术支持,工资是每月2600元,他们两人可以说是起点相同,但两年的发展却让他们有了明显的差距,小胡比较爱学习,工作非常踏实,对业务知识也掌握得非常精通,而且在做技术支持工作的时候,业余时间学习编程,由于做技术支持与程序员交流比较多,小胡抓住了这个学习编程的机会,但她从不在公司上班时间学习程序,在做技术支持工作时,她上班时间钻研业务知识、软件需求、学习程序实现的思想,业余时间练习代码。在做技术支持一年后,她通过了研发部的考核,进入研发部开始做编程。而小张与她对比就不同了,他只是做好本质工作,没有潜心学习,对业务知识、软件知识只是一般了解,工作上很业绩平平,总体上不出色也没出大的差错。工资涨得当然也慢,小张和小胡的起点相同,但小胡比较主动学习,很明显他们两个在职场上的差距就拉开了。
3、展示进步,创新思考,体现价值。
入职之初,通过积极的学习与适应,应该说进步是非常快的,要及时的总结,并把工作学习的总结和进步程度及时向主管汇报(口头、邮件、书面),阶段工作总结应包括以下几点:已经完成的工作、技术上的进步、业务上的进步、从学生到职员心态上的转变、八小时之外的学习状态等。这样一方面可以疏理一下知识结构,把握自己的学习阶段,一方面让主管根据你的知识结构和技能状态有针对性地给你分配合适的任务。
另外在工作当中也要注重思考,对工作进行适当的改进,并提出改进意见,这样能更快是体现出你的进步和工作价值。
4、积极参加团队活动,适应团队文化,创造与团队成员友好而积极的协作氛围。
能尽快适应团队文化,与同事友好沟通是任何岗位都需要的职业素质,只是在研发团队里要显得尤为重要,由于研发工作的重要与特殊性,若在软件商品化和产品化的开发阶段,不良的沟通协作可能导致项目的流产。另外,部分程序员写程序久了都会很注重与机器或代码交流,有的不容易与新职员交流,有的他们因有大量的工作任务而顾不上,有的是因为他们有太多的思想与创意,和一个新来的职员没有共同语言,有的是人为设置“技术壁垒”(因担心新职员威胁到自己的岗位,而不愿传授一些知识)。那么新职员一定不要因为他们没有主动与你交流而放弃交流,或者认为自己被冷落而与逐渐远离团队,而是要在适当的时间与他们主动交流,主动向他们请教,积极参加团队的集体活动,创造与同事交流合作的良好氛围。要尽可能地为团队多做贡献,不要因为多干一些工作或多加一点班,就有不良的情绪,从而影响正常的沟通与交流。另外,在研发团队里的沟通与协作,还体现在代码上,自己设计的功能模块是否能为别人提供良好的说明和程序接口。总之,与同事友好愉快的协作,尽快融入研发团队,是新入职的程序员技术快速进步和稳定职位的重要因素。
5、正确面对工作压力,学会释放“厌职”情绪。
许多同学进入一个新的工作环境,面对的是很多新事物,感觉工作节奏太快,工作压力太大。其实新职员有工作压力也是正常的,从职业生涯发展的角度来看,这种工作压力是非常必要的。同学们在进入公司后,要勇于接受工作压力,把这种压力作为进入初职锻炼的良好机会,树立良好的心态,不要逃避,更不要产生“厌职”情绪,公司还正在培养你,你却选择退缩而自炒“鱿鱼”。工作中要学会积极与同学沟通,注意工作方法,释放和减轻压力。其实我发现一些新职员说工作压力大,做事不顺心,仔细分析之后可以发现他们感觉的工作压力大与“不合群”有很大的关系。有些同学到公司后,一坐下就是八小时,语言和行为与同事格格不入导致他不敢言语不敢行动,下班时间到了,其实他不是工作学习本身的累,他们感到更累的是“心”。这些新职员在工作中总是希望别人主动接近自己,自己却不会主动与人交流,时间长了,同事觉得他“不爱说话”,也就逐渐放弃了与他的交往,这时他又会感到被排挤,感到孤独,心理压力就会增大。另外技术上单打独斗,不能利用别人的资源,因此完成相同的工作,付出的努力和压力就要比其他同事大得多。所以新职员在入职之初,一定要正确看待工作上正常的工作压力,学会与团队成员友好相处,创造一种“如鱼得水”的工作氛围,那么真正技术上的压力都不会成为问题的。
如果公司还没有成熟的开发团队,需要你一个人承担开发项目,着手组建开发团队,那么就要求你充分一切时间,利用网络资源,有技术难点及时到网络上寻求帮助,同时与相关部门人员密切合作,保持动态及时的沟通,及时报告工作进度,争取尽快拟出解决方案或产品。
优秀程序员应具有的品质与习惯
善于理解与把握需求
程序员的劳动成果就是满足需求的程序,那么在动手写代码之前,只有完整地理解一个模块的需求才能做出好的程序,优秀的程序员在分析需求的基础上,应该能抓住问题的关键技术,从而能够建立合适的数据模型,尽量在代码中少走“弯路”。 善于学习与总结
当然善于学习,是对任何行业任何职业的最根本的要求,对于程序员,这种要求就更加高了。其实研发部门招聘程序员,其实并不一定注重你现在能做什么,而更注重的是你的学习能力、你的编程潜力,因为程序员是很容易被淘汰,很容易落伍的职业,一种技术可能仅仅在三两年内具有领先性,若你不能跟进新的技术,不学习新的技能,那么不断出现的新技术会使你显得非常笨拙。善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高,才能成长起来。
规范化的编码习惯
养成良好的编码习惯,比如:变量命名清晰,语句嵌套明确,函数具有独立功能,适当注释等等,因为这些不但有助于代码的移植和纠错,也有助于不同人员之间的协作。 良好的文档习惯
良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。 代码复用性,模块化思维能力
复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。 团队精神与沟通协作能力
这是程序员应该具备的最基本的,也是最重要的安身立命之本。软件或项目的各模块功能需求的理解准确,一个功能实现的修定,是否会影响其他模块等,没有充分及时的协作对一个项目来说几乎是不可想象的。我做了几年开发,感觉沟通真的太重要了,其实软件研发过程中最重要的不是技术问题,而是管理中的沟通问题,比如初级程序员或许是碍于面子或其他原因,不懂的问题也不想问,总是把问题掖着藏着,而高级程序员又不理解初级程序员的开发任务总是完不成,其实可能是高级程序员不了解初级程序员的真正困难,或者没有把要实现的逻辑和思路讲解清楚。合作起来总会有一些不透彻,要么一个问题讨论多次依然是问题没有结果,要么是有些问题根本不反映,大家都掖着藏着,报喜不报忧,待到问题暴露已无法挽回,严重的阻碍了项目的进度。所以我最好的建议就是,高级程序员应该把问题讲到明白为止,初级程序员应该把问题问到明白为止,并且不仅仅是口头上讲明白、听明白,还一定要形成文字,现在网络非常方便,公司都会有企业邮箱,把问题的讨论过程通过mail的形式记录保存,明确确认,这样障碍才能去除,项目才能得以顺利进展。
案例1:
陈某是北京某重点大学自动化专业的毕业生,编程基础知识非常扎实,在学校学习期间也有许多代码积累,从技术上说应该是很有潜力的,但他性格有点孤僻,不太容易与同事沟通,当时录用他时公司是看在他的编程基础很好,以为在研发部大家多带动他,应该会好些的。进公司有两个多月了,一次在做某油田项目中负责其中一个小模块的开发,在开发过程中我经常询问他有没什么问题,他每次都有些含糊地说没有。可当项目交付的时候,发现他做的某一功能与当初功能定义不符,客户就抓住这一点说与合同中需求描述不符,由此延期支付28万的余款,使该项目后期维护起来非常被动。而导致这一结果就是陈某在做程序时有问题自己绕过去了,没有及时与项目组成员交流,而独自采用了他熟悉的一种解决办法。项目汇报会刚结束,人事部门就通知陈某交接工作,到财务结算工资…..文摘:下面这故事《请按一下九层》我一直和我的同事们分享。是《读者》中的一篇文章: 这是全市最忙的一部电梯,上下班高峰时期,和公共汽车差不多,人挨着人。上电梯前和公司的人力资源总监相遇,说笑间,电梯来了,我们随人群一拥而进。每个人转转身子,做一小小的调整,找到了一种相对融洽的关系。这时,一只胳膊从人逢中穿过来,出现在我的鼻子前头。我扭头望去,一个小伙子隔着好几个人,伸手企图按电钮。他够得很辛苦,好几个人刚刚站踏实的身子不得不前挺后撅,发生了一阵小小的骚动。
那个人力资源总监问道:“你要去哪一层?”“九层。”有人抬起一个手指头立刻帮他按好了。没有谢谢。
下午在楼道里又碰到那个人力资源总监。“还记得早上电梯里那个要去九层的小伙子吗?”她问我。
“记得呀,是来应聘的吧?”九层,人力资源部所在地。“没错,挺好的小伙子,可我没要他。”“为什么?”
“缺少合作精神。”她露出一副专业HR的神情,“开口请求正当的帮助对他来说是件很困难的事情,得到帮助也不懂得感激。这种人很难让别人与他合作。”
我点头称是。如果那个小伙子坦然而自信地说一句“请按一下九层”,结果会怎样呢?大家不但不会反感他的打扰,而且帮助他的人还会心生助人的快乐,最后他也能得到想要的工作。
这个故事表明,良好沟通不仅仅体现在礼貌地说声“请”、“谢谢”,而是一个职员能够创造愉快、高效、和谐工作氛围的素质和习惯。
时刻修定自己的认识和行为与公司的核心价值观(短期目标、长期目标)保持一致
公司或研发团队在什么时段做什么样的项目,或者根据项目进度的计划,在什么时间做什么功能模块,作为程序员要高度地与这些目标保持一致,不要在关键时刻“掉链子”,这是最重要的。
案例:
小张是公司里的转正不久的程序员,很聪明,对新技术接受很快,缺点就是非常的贪玩,对项目组的事缺乏主动性和责任心,平时的工作中主管已经提醒过他多次要注意工作的责任心,但他都不太放在心上,对事依然是敷衍。一次在做上海铁通的项目中,小张负责项目中的一个模块,当软件架构出来以后,需要出差上海为客户现场演示和进一步确认需求,由于合同还没有正式签下来,所以此行的技术交流对公司能不能签下这个项目至关重要,公司派由我和小张在内的项目组4人出差上海,临行前我们多次开会研究方案,确保拿下这个项目,下午到了上海之后约好第二天上午与客户见面,正当大家为第二天的交流捏一把汗,积极准备的时候,小张却说是第一次到上海,要求先去外滩看夜景,在得到项目组的否定之后,小张竟一个人偷偷到外滩看夜景至到深夜才回到宾馆。第二天的技术交流会上,小张负责的模块问题最多,虽然最后整个项目的交流还算成功,公司总算签下了这个项目,但小张也被辞退了。原因很简单,小张一直没有把公司的事放在心上,项目组出差第一目标是与客户交流好,拿下项目,而小张出差上海的第一目标是看一下外滩。所以象小张这样的技术上不管有多么出色,但总在公司的关键时刻“掉链子”,被公司辞退也是早晚的事。就在写此案例的前几天,在地铁上我偶遇小张,谈话中得知他被辞退后半年内又经历了一家公司。而此刻他又在匆匆地找工作。
谈谈学习方法
说起学习的方法,其实每个人都有自己的学习方法,也许这种方法对我来说有用,但不见得就对所有的人有用。所以,不要盲目的跟着别人的学习方法学习,要思考属于自己的学习方法。但以下几个原则是要遵守的: 坚持学习。首先要有毅力,对编程的狂热也可以在一定程度上起到帮助。学习编程应该说要经历好奇——困难——容易——郁闷——成就感——困惑——轻松的几个阶段的循回,不管哪个阶段都需要天天学习,坚持每天都要进步,不能半途而废,培养一种坚持克服困难的毅力。案例: 记得开发团队里有一个基础不是太好的程序员,刚入职两个多月,表现一般,有一天早上他眉飞色舞地在讲述昨天电视中的一个情节,我听到后就说了一句:“你还好意思说你看电视?”。他立刻明白了,就没说什么。从此他的进步是可以说是突飞猛进的,代码的质量和工作效率明显上了一个台阶,对项目的推动也是有目共睹的。几个月后的一次公司庆典上,他被评为“进步最快员工奖”,奖金3000元。奖后在他给我的Mail中发现了这句话:“你说我看电视的那句话改变了我的学习状态….我现在是马桶上、公交车上都在看书或笔记。”
坚持实践。当你学到了一种新的技术或知识时,多实践是巩固学习的一种最好最有效的方法。这个实践不是照著书上的例子做一遍,而是根据自己的能力,给自己出题,然后去完成它。只有这样,你才能发现自己的不足,同时又增加了编程经验。要成为合格的程序员,光会写代码是远远不够的,更重要的是在实践中思考创新。实践的多少决定着“高手”和一般程序员界线,高手们并不是天才,他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦,但实践的过程却是无比的枯燥乏味。
掌握编程思想。学一门语言,不能仅仅是语言,还要注重语言背后的思想方法,获得提出问题,分析问题,解决问题的能力,不是为编程而学习,因为编程语言和我们日常所说的语言一样,日常所说的语言是一种思想的表达,而编程语言是一种功能的实现。要学习它是如何来解决某一问题的,为什么要这样去做,他总是要符合客观事实的,存在某种逻辑,数据的组织,信息的传递,然后看该怎么样用编程语言来表达自己的想法。
多问、多总结、多记笔记。“三人行必有我师”,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。著名的交换苹果理论说的是:“你有一个苹果,我有一个苹果,当我们互相交换苹果后,我们仍然互得一个苹果;你有一个想法,我有一个想法,当我们互相交换想法,我们则互得两个想法”。遇到问题,上网查看一些技术论坛,看看别人对同一问题的看法,会给你很大的启发。在这个网络时代,资料到处都有,无论什么先进的技术,你可以问身边的高手,问网上的同仁,只要查到资料,快的学上几天慢的一两个月也能学会,学会后总结出技术要点记下来,可写在本子上也可写在Blog上,编程技能的提高靠的是代码的积累,把所有自己的代码保存起来,并附有适当的笔记,这样,到用到时才能信手拈来,才能获得踏踏实实的进步。所以现在已没有写不出的程序了,写不出不是因为不够聪明,而是因为你没有耐心和找 BUG 的细心。
不钻“牛角尖”,只抓主要问题,一些不影响工作的难点只要会用就行,这也体现了OOP的思想,你只要知道一个技术能完成什么功能就可以,至于它是如何实现的可暂时放一放,有时回过头来再看就不是什么难点了。当你遇到技术障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
外包软件、商品软件、项目软件的操作模式简介
软件外包
就是一些发达国家的软件公司将他们的一些非核心的软件项目通过外包的形式交给人力资源成本相对较低的国家的公司开发,以达到降低软件开发成本的目的。因为软件开发的成本中70%是人力资源成本,所以,降低人力资源成本将有效地降低软件开发的成本。软件外包已经成为发达国家的软件公司降低成本的一种重要的手段。软件外包的大幅度增长为人力资源成本相对较低的印度和中国带来了新的发展机会。企业与企业之间的外包就是:企业(A)为了专注核心竞争力业务和降低软件项目成本,将软件项目中的全部或部分工作发包给提供企业(B)完成; 商业软件 商业软件(又叫“商品软件”)就是由商业公司在调研大多数行业用户的需求上开发的软件,该软件基本上能满足这些用户的需求,而且它的功能不会因个别或少数用户的要求而改动。随着互联网的兴起和软件授权销售方式的普及,商品软件的销售可软件公司直销、代理销售、专业下载网站销售等多种渠道,软件授权许可的销售模式往往是根据使用商品软件的用户数和安装该软件的计算机数来收取许可费用。项目软件 就是软件公司专门为某个客户开发的软件系统,该系统由委托开发的客户配合调研需求,“量体裁衣”,在关键阶段双方可派技术人员互相“渗透”,密切合作,共同完成系统的开发和实施以及运行。项目软件与外包软件的操作模式有相同性也有不同性。产品经理与项目经理
简单地说,产品经理是做正确的事,其所领导的产品是否符合市场的需求,是否能给公司带来利润的。而项目经理是把事情做正确,把事情作得完美,在时间,成本和资源约束的条件下完成目标。项目经理要对某个产品进行开发的管理,负责开发的进度,开发过程中的协调等有关开发方面的问题,他最大的目标是时间第一、立项目标达成第一。并不会很尊重产品本身的市场需求以及业务逻辑的问题。
而产品经理是横向管理的,也就是说他将负责某个产品或者某个产品线从商业计划市场竞争开发需求推广方案渠道策略等各个方面。产品经理一个产品线从头到尾的重要参与人。
第五篇:intel笔试题
intel笔试真题一:
intel笔试共10题,1个小时,前6题智力题,第7题为设计一个高效率的内存管理,第9题关于intel的一段中文描述写出150~200字的英 文摘要,第10题写出150~200字关于你在5~10年内对IT的一些看法和自身的发展。下面列举这次intel笔试精华:
intel笔试(1)编译中的问题:全局变量如int i=5;int*(pf)()=foo;分别在何时被初始化?设计时候如何具体的实现。
intel笔试(2)OS相关的问题,内存访问,cache等(包括cache在整个系统中的位置,画出来,并解释)
intel笔试(3)解释例如mov ax,100H 这样一条指令的cpu, os, memory等都完成了什么样的工作。
intel笔试(4)Strlen()的C语言实现,不能使用任何变量。
intel笔试(5)编译中display表的一些问题
intel笔试(6)一个hash函数,输入随机,现发生冲突,如数据集中在某几条中,问怎样处理hash函数保证高效的访问,怎样实现?
intel笔试(7)把Switch()case…语句翻译成三元组。
intel笔试(8)一个byte(用C语言实现计数其中1的个数),给出最高效的实现方法。
intel笔试(9)上海有多少个加油站?你是怎样解决这一问题?
intel笔试(10)C语言参数的入栈顺序?为什么这么实现?
intel笔试(11)C语言中字符串的翻转,最高效率(时间和空间)的实现?
intel笔试(12)你的最大的优点和缺点分别是什么?
intel笔试(13)你解决问题和分析问题的能力如何?请给出一个具体的例子来证明你的这种能力?
intel笔试总结:编译原理、操作系统和数据结构等基础知识比较重要,感触颇深,自己的基础不够扎实,一些问题没有很好的答出来,或者解释的不对,各位同学努力吧~
intel笔试真题二:
intel笔试1:概率题。x,y为随机变量,联合概率密度 f(x,y)= intig(0,1)*dx*intig(0,x)*k*d
y,k为常数,求k=? E(xy)=?注:intig(a,b)为a到b的定积分。
intel笔试2:概率题。A,B为随机事件,以下哪个正确
A.P(A U B)*p(AB)<= P(A)P(B)
B.P(A U B)*p(AB)>= P(A)P(B)
C.P(A U B)*p(AB)<= P(A)P(B)
D.P(A U B)*p(AB)>= P(A)P(B)
intel笔试3: 信道带宽200kHz,信噪比10dB,求信道波特率=?
intel笔试4:以下代码运行结果是什么int main(){int a,b,c,abc = 0;a=b=c=40;if(c){int abc;abc = a*b c;}printf(“%d,%d”, abc, c);return 0;}
intel笔试5:给出了从纽约出发和到达落山鸡的各种航班信息,写出找到一条从纽约到落山鸡的最短距离的航班组合的代码。
intel笔试6:从计算机图形上截取某个物体边缘的若干个坐标,求这个物体面积,并跟判断是方形还是圆形,为啥。(坐标不记得,大概是个圆)。
intel笔试7:离散卷机与DFT的区别与关系。快速求不满足2^N长度的离散傅立叶变换的方法有哪些 ?如何用fft求N*M点的离散卷机?
intel笔试8:给出fir和iir的优缺点。
intel笔试9:如何计算线性标量量化器的量化噪声?需要那些假设?
intel笔试真题三:
向大家介绍intel笔试分三部分,第一部分考IQ,第二部分考编程,第三部分考英语论文!
第一部分 智力题 大概5,6道
intel笔试1.有5*5表格中找规律填数字
intel笔试2.在3个飞标得99分的投法,标盘有数字
intel笔试3.三角形各角有数字,找规律填上最后一个三角形一角上的数字
intel笔试4.表格中有字母右面对应数字,找到规律(其实就是字母表位置号)填上一个字母旁的数字
第二部分 技术题
intel笔试1 给出至少两种方法实现系统存储器管理 比如虚存 ……有点忘了
intel笔试2 程序实现八个皇后问题(经典数据结构算法)觉得满bt的第三部分 翻译
intel笔试1.给一段300字icsc的介绍性e文,写sunmmary
intel笔试2.写短文表达一下如何contribute ICSC
感觉intel笔试拉不出什么档次,不过考试1个小时时间很紧,基本功需要扎实