两个月前,开始招聘Delphi程序员,招聘前随手写了几道题,用来笔试。
到现在还没有招到人,很无奈,标准甚至降到只要能做第1、3、5题就录用的水平。结果竟然没有人能够将这3题都答对。很多人连string和WideString的区别都不知道。
近几年,Delphi的从业环境逐年下降,在网路上看到无数人在唱衰歌、转语言。想来原因有:
1、行业开发方向往网络、嵌入式、分布式发展;而Delphi被大家当成做数据库开发的工具(甚至之前宝兰都这么宣传)。
2、用Delphi的公司大都是做MIS的中小公司,产品附加值差,一味压低产品门槛和开发人员素质。
3、开发人员大多只会拖拖控件,碰到点小问题就到处找控件,看看大富翁、CSDN Delphi的问题,一个个白痴得不行。
4、关于Delphi的教材也是全篇一律的数据库开发,不亦乐乎地玩弄些数据读写的小技巧。
我想说的开发人员的问题。过来面试的人,从77年到88年的都有,年龄跨度上较有代表意义。多数人的简历上都写着精通这个、熟悉那个,却只能做上3、4题,还未能全对,有写上名字交来白卷的,更有2个80年前后的应聘人,看了会题目后直接走了。我觉得题目还是比较容易的,而是很多人的开发能力差,从来没有想过理解开发环境、操作系统提供的能力,提高算法设计能力。因此,给人的印象用Delphi的都是些水平低下的人,公司没法提高开发质量、产品质量,也就无法开出有竞争力的薪资,最后是整个Delphi生态链的质量下降。
说这些话,一来期望得到些共鸣;二是希望借此招聘,我对英才网上泛滥的简历几近绝望了。我姓李,联系方式是:×××××@163.com,北京×××××科技发展有限公司。
笔试题目如下:
Delphi工程师笔试题
北京金钻石科技发展有限公司
答题人:_______________一、 Delphi基础
1、Delphi 内置类型 string 和 WideString 的区别。
2、简要描述Delphi代码单元中,以下关键字的作用。
interface:
implementation:
initialization:
finalization:
3、将一周七天声明成枚举类型。
4、现有Integer 变量 A、B,在不声明其它变量的情况下,将它们的值交换。
如,A := 1; B := 2; 交换之后 A = 2; B = 1。
5、现有以下类:
type
TBase = class
function GetValue: Integer; virtual;
end;
TChild1 = class(TBase)
function GetValue: Integer; override;
end;
TChild2 = class(TBase)
function GetValue: Integer; override;
end;
function TBase.GetValue: Integer;
begin
Result := 1;
end;
function TChild2.GetValue: Integer;
begin
Result := 2;
Result := inherited GetValue;
end;
function TChild1.GetValue: Integer;
begin
Result := inherited GetValue;
Result := 3;
end;
用以下方法创建对象o1, o2: TBase:
o1 := TChild1.Create;
o2 := TChild2.Create;
那么调用以下方法的返回值是
o1.GetValue返回:
o2.GetValue返回:
6、如何模块内部获得自身路径?
Exe程序:
DLL程序:
7、描述一下TEidt和TListView的类派生顺序,并说明它们的来源区别。
8、用pascal 写一个双向链表。
9、设计模式中的单件模式,在Delphi中可以用什么方式创建。
10、Delphi快捷键
快速搜索添加控件:
打开工程属性对话框:
切换编辑中的代码窗体:
删除一行代码:
二、 Win32基础
1、写出Delphi声明Win32类型的库及其对应的Win32 Dll库(至少3个)。
2、如何在Delphi中完成多线程的内存保护。
三、 数据库
1、现有MS SQL Server 数据库 UserLibs 列举出所有用户表及其字段。
2、现有数据库A,数据库B和A相对应,在数据A中表增加时,或字段增加时,将结构同步到数据库B中,该过程不能损害数据。(上机题)
到现在还没有招到人,很无奈,标准甚至降到只要能做第1、3、5题就录用的水平。结果竟然没有人能够将这3题都答对。很多人连string和WideString的区别都不知道。
近几年,Delphi的从业环境逐年下降,在网路上看到无数人在唱衰歌、转语言。想来原因有:
1、行业开发方向往网络、嵌入式、分布式发展;而Delphi被大家当成做数据库开发的工具(甚至之前宝兰都这么宣传)。
2、用Delphi的公司大都是做MIS的中小公司,产品附加值差,一味压低产品门槛和开发人员素质。
3、开发人员大多只会拖拖控件,碰到点小问题就到处找控件,看看大富翁、CSDN Delphi的问题,一个个白痴得不行。
4、关于Delphi的教材也是全篇一律的数据库开发,不亦乐乎地玩弄些数据读写的小技巧。
我想说的开发人员的问题。过来面试的人,从77年到88年的都有,年龄跨度上较有代表意义。多数人的简历上都写着精通这个、熟悉那个,却只能做上3、4题,还未能全对,有写上名字交来白卷的,更有2个80年前后的应聘人,看了会题目后直接走了。我觉得题目还是比较容易的,而是很多人的开发能力差,从来没有想过理解开发环境、操作系统提供的能力,提高算法设计能力。因此,给人的印象用Delphi的都是些水平低下的人,公司没法提高开发质量、产品质量,也就无法开出有竞争力的薪资,最后是整个Delphi生态链的质量下降。
说这些话,一来期望得到些共鸣;二是希望借此招聘,我对英才网上泛滥的简历几近绝望了。我姓李,联系方式是:×××××@163.com,北京×××××科技发展有限公司。
笔试题目如下:
Delphi工程师笔试题
北京金钻石科技发展有限公司
答题人:_______________一、 Delphi基础
1、Delphi 内置类型 string 和 WideString 的区别。
2、简要描述Delphi代码单元中,以下关键字的作用。
interface:
implementation:
initialization:
finalization:
3、将一周七天声明成枚举类型。
4、现有Integer 变量 A、B,在不声明其它变量的情况下,将它们的值交换。
如,A := 1; B := 2; 交换之后 A = 2; B = 1。
5、现有以下类:
type
TBase = class
function GetValue: Integer; virtual;
end;
TChild1 = class(TBase)
function GetValue: Integer; override;
end;
TChild2 = class(TBase)
function GetValue: Integer; override;
end;
function TBase.GetValue: Integer;
begin
Result := 1;
end;
function TChild2.GetValue: Integer;
begin
Result := 2;
Result := inherited GetValue;
end;
function TChild1.GetValue: Integer;
begin
Result := inherited GetValue;
Result := 3;
end;
用以下方法创建对象o1, o2: TBase:
o1 := TChild1.Create;
o2 := TChild2.Create;
那么调用以下方法的返回值是
o1.GetValue返回:
o2.GetValue返回:
6、如何模块内部获得自身路径?
Exe程序:
DLL程序:
7、描述一下TEidt和TListView的类派生顺序,并说明它们的来源区别。
8、用pascal 写一个双向链表。
9、设计模式中的单件模式,在Delphi中可以用什么方式创建。
10、Delphi快捷键
快速搜索添加控件:
打开工程属性对话框:
切换编辑中的代码窗体:
删除一行代码:
二、 Win32基础
1、写出Delphi声明Win32类型的库及其对应的Win32 Dll库(至少3个)。
2、如何在Delphi中完成多线程的内存保护。
三、 数据库
1、现有MS SQL Server 数据库 UserLibs 列举出所有用户表及其字段。
2、现有数据库A,数据库B和A相对应,在数据A中表增加时,或字段增加时,将结构同步到数据库B中,该过程不能损害数据。(上机题)
-----------------------------------------
有点夸张了吧,大概扫了几眼,不是很难,不过错个2-3个小题是正常的
b=a+b
a=b-a
偶一般不用枚举,多是写点小工具或数据库相关,呵呵
提供帮助文件是合理要求,个人感觉
asm
push a
push b
pop a
pop b
end;
就觉得 用pascal 写一个双向链表 这题目好点
5题还可以
其他题目不怎么样
a:= a xor b
b:= b xor a
a:= a xor b
a, b: Integer;
begin
a := 1;
b := 2; a := a+b;
b := a-b;
a := a-b;
ShowMessage(Format('%d, %d', [a, b]));
end;
只对第4题感兴趣.无奈上边两位都用光了.我也硬来show一把.不过只有LS的和.
a=a-b
b=a+b
a=b-
算是达意了的.push pop都没达意.因为用到了栈那也算第三变量了.不过此题没啥实际意思.
我也show一把错误的.procedure TForm1.btn1Click(Sender: TObject);
var a,b:Integer;
begin
//
a:=10;
b:=3;
asm
mov eax,a
XCHG eax,b
xchg a,eax
end;
ShowMessage(IntTostr(a));
ShowMessage(IntTostr(b));
end;
这道题确实不能答上来,因为Delphi中根本就没有TEidt类,是笔误还是有意设置?
如果DELPHI不好,为什么开发应用程序比VC快捷?不光快捷,学习成本也低不少。而且,VC能做的,DELPHI基本都能做。从这个角度,DELPHI不应该不好。
原因:DELPHI的产品销售战略有问题。我个人认为,就是单价太高。
对于公司用户,主导者大都是C系的,如果D容忍甚至放纵普通用户使用D,将D价格从天上降到人间,甚至低于MS系的开发工具,从现在起,像MDL一样培养客户,也许有机会。
个人感想:即使我从开始到现在都一直用D(用过三个月的VB),而且现在用它开发英文共享软件,但因为一直在用D版,心里有一种不大干净的感觉。买吧,太贵了,像MS系的价格就比较有吸引力。
最后一点:国内的DELPHI资料太少了,国外的多一些,但确实远不如MS系的。看MSDN就知道。
你说的也不尽然,只能说 宝蓝 输给了ms Delphi与ms谁好不好评价,但是有如下事实:
现在ms开发工具的某某曾经是Delphi的...
从他进入微软,你会发现,VS特别是VC++的编译速度...,如果你用过VC++6开发过大型系统,你会对编译速度很有感受。
.NET使宝蓝(Enterprise)失去了正确的方向。希望codegear 能给Delphi新的生命力。
答: String 和WideString的区别是指每个字符所占字节的大小.(STRING字符占一个节节,WIDESTRING内字符占二个字节)2、简要描述Delphi代码单元中,以下关键字的作用。
interface: 内部接口描述
implementation: 程序开始的地方
initialization: 初始化(好像是全局初始化描述的地方)
finalization: 完成(好像是全局完成后,将做什么描述的地方)3、将一周七天声明成枚举类型。 //意思明白,不会定义了.呵呵
ENXV OneWeekOfDay:={'周一','周二','周三','周四','周五','周六','周日'}
4、现有Integer 变量 A、B,在不声明其它变量的情况下,将它们的值交换。
如,A := 1; B := 2; 交换之后 A = 2; B = 1。
A^B //不知道,估计是异或或啥的,用寄存器存一下5、现有以下类:
type
TBase = class
function GetValue: Integer; virtual;
end;
TChild1 = class(TBase)
function GetValue: Integer; override;
end;
TChild2 = class(TBase)
function GetValue: Integer; override;
end;
function TBase.GetValue: Integer;
begin
Result := 1;
end;
function TChild2.GetValue: Integer;
begin
Result := 2;
Result := inherited GetValue;
end;
function TChild1.GetValue: Integer;
begin
Result := inherited GetValue;
Result := 3;
end;
用以下方法创建对象o1, o2: TBase:
o1 := TChild1.Create;
o2 := TChild2.Create;
那么调用以下方法的返回值是 //inherited GetValue 这个应该是祖先继承吧
o1.GetValue返回: 3
o2.GetValue返回: 1
6、如何模块内部获得自身路径? //映像中GETDIRXXXX这个函数好像可以是文件,都可以提取的.
Exe程序: GetDirXXXtroy(exe程序) //不知道是不是,函数名忘记了
DLL程序: GetDirXXXtroy(DLL程序) 7、描述一下TEidt和TListView的类派生顺序,并说明它们的来源区别。
元件-> ... 不知道.
8、用pascal 写一个双向链表。
汗,不会.(只会抄)9、设计模式中的单件模式,在Delphi中可以用什么方式创建。
不会.(要命啊)10、Delphi快捷键 //也不熟悉,只是凭感觉填
快速搜索添加控件: CTRL+F
打开工程属性对话框: CTRL+O
切换编辑中的代码窗体: CTRL+TAB
删除一行代码: CTRL+T二、 Win32基础 //不会,只会抄写
1、写出Delphi声明Win32类型的库及其对应的Win32 Dll库(至少3个)。
2、如何在Delphi中完成多线程的内存保护。
三、 数据库
1、现有MS SQL Server 数据库 UserLibs 列举出所有用户表及其字段。
不太理解,为什么要默写.好像名字很长的样子.
select * from sysobject //天知道,这题也太偏了吧,虽然大家都明白在哪里找表
//但表名不太会去记啊.2、现有数据库A,数据库B和A相对应,在数据A中表增加时,或字段增加时,将结构同步到数据库B中,该过程不能损害数据。(上机题)
会写,但要看着别人的例子写,呵呵.
在系统中的SYSOBJECT中好像还有SYSDATABASE吧,写一个触发器.=================================================================
混饭不容易啊.唉! 为什么不给人家做一个你们需要的程序呢,让他回家做.呵呵
initialization: 初始化(好像是全局初始化描述的地方)
finalization: 完成(好像是全局完成后,将做什么描述的地方)
用英文直接翻译就可以了,
没用用过,跟踪过执行过程?
第一个是单元构造
第二个是单元析构
具体执行顺序,自己写一个调试下,断点设置到 工程文件的 Begin 处唉!
DLL程序: GetDirXXXtroy(DLL程序)
你基本功很不扎实
exe Application.ExeName 如果不引用forms单元 , 可以 用ParamStr(0)
dll ParamStr(0)其实方法很多,以上是我以前习惯用的。
a:= a xor b
b:= b xor a
a:= a xor b
这个速度最快,如果能写出来,我觉得基本可以录用了
55555555555555555555555555555555555555555555555555555555555555
其实我还是挺喜欢Delphi的。
我以前的领导说过,聪明的人用delphi
快速搜索添加控件: 这个呢?我用cnpack 用的我退化了,以为delphi本身没提供快速搜索添加控件的
{直接来了:不查答案}
1:String和WideString的区别{答:没这个概念,一般都用String,常用PChar.String是两字节,WideString是四字节(?)}2:简要描述Delphi代码单元中,以下关键字的作用
interface:
implementation:
initialization:
finalization:{答:interface:接口声明的区域
implementation:接口实现区域
initialization:加载该单元时会初始化的区域
finalization:卸载单元(程序结束时)会调用的区域
}3、将一周七天声明成枚举类型。
{答:WEEK_ENUM={SUN,MON,TUE,WED,THU,FRI,SAT}4、现有Integer 变量 A、B,在不声明其它变量的情况下,将它们的值交换。
如,A := 1; B := 2; 交换之后 A = 2; B = 1。
{答:
ASM
PUSH A
PUSH B
POP A
POP B
END;
}5 : 调用返回值是:
{答:1 , 3}6、如何模块内部获得自身路径?
{答:exe GetModuleFileName
dll (没尝试过,不知道)
}7、描述一下TEidt和TListView的类派生顺序,并说明它们的来源区别
{答:不知}8、用pascal 写一个双向链表。 {答:PASS,俺会}9、设计模式中的单件模式,在Delphi中可以用什么方式创建。
{答:不知}10、Delphi快捷键
{答:免了,俺不知,鼠标常点}11:win32基础
- Windows(USER32,GDI32,KERNEL32),TLHelp32,WinSock(W32_SOCK?),
= 内存保护不知,同步?略了
前几天招C#的人,也一个个都是只会用控件的。
这几个问题也并不能反映实际的水平。楼主公司主要是做什么业务,想招一定要了解那些方面的人啊。
这对那种开发语言都是一样的,并不是DELPHI才这样。只是最近几年B/S的应用多了,C/S的应用比较少,所以
DELPHI才看起来没落了。
思路比知道些方法更重要。
push a
push b
pop a
pop b
end;
还有人用这种方式,我没有想到!用这种方法的人很聪明,效率应该比Xor或xchg更高
a:= a xor b
b:= b xor a
a:= a xor b
A := A + B;
B := A - B;
A := A - B;
{这样行了吧!}
二、Delphi只是个工具,你想用什么功能和怎么用随你需要,它不是炫耀技能或限制人活性的东西。就像中国人学英语,这个试那个证考的全民都神经衰弱,其实实际需要的只是日常交流会话,对于这个,将人放到英语坏境中,三岁小孩都不学而会;
三、各人有各人的使用习惯,一把剑有十种剑法,工具也是一样,如果总是以己度人,以自己的想法要求别人,那么这世界上除了你是人才,恐怕没有别人了。
四、我学习使用Delphi少说也有十年了,做的各种小程序大系统加调试工具有多少连我都不记得,但看到你出的这些题时,还是有好些题让我直发愣,实话说连看都不想看。甚至有些愤怒,你这是什么意思?找茬吗??
1:string 单字节字符串 widestring 双字节字符串
2:
interface://接口
implementation://实例化方法
initialization://初始化
finalization //销毁执行
3:week =[md,tud,wd,thd,fd,std,sd]
4:var
A,B:integer;
begin
A:=1;B:=2;
//start
A:= a*b
b:= a/b;
a:= a/b;
end;
5: o1.GetValue返回:3
o2.GetValue返回:1
6: exe:application.filepath;??下面有的属性 在ide 里面可以找出 还有就是 parater(0);
dll: parater(0);//单词忘记了结合ide就知道了
7:Tobject->Tp...->Tcontrol->Twincontrol->tcustermedit->Eidt
Tobject->Tp...->Tcontrol->Twincontrol->tcustermeListView->TListView
8:
9:
10:ide主菜单[程序]还是[工程]里有的 ,具体结合ide;反正知道怎么找到;还有就是装cnpack后找控件更快,在控件栏右下角处有个小箭头,点下就可以模糊搜索了,更方便!
二
1:liabray?
2:
三
1:唉 做过 没记住
2:
var a,b:integer;
begin
a := 8;
b := 1;
a := b - a;//7-4 = 3
b := b - a; //7 - 3 = 4
a := b + a;
ShowMessage(inttostr(a));
ShowMessage(inttostr(b));
end;哇X,这题方法好多啊,毕业后我也遇到过这题……当时以为很难……