两个月前,开始招聘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.   

    到现在还没有招到人,很无奈,标准甚至降到只要能做第1、3、5题就录用的水平。结果竟然没有人能够将这3题都答对。很多人连string和WideString的区别都不知道。
    -----------------------------------------
    有点夸张了吧,大概扫了几眼,不是很难,不过错个2-3个小题是正常的 
      

  2.   

    a=a-b  
    b=a+b  
    a=b-a  
      

  3.   

    你应该给个delphi的帮助文件在那 让别人查下
      

  4.   

    是很基础,若稍有点工作经验,就不会PASS
    偶一般不用枚举,多是写点小工具或数据库相关,呵呵
    提供帮助文件是合理要求,个人感觉
      

  5.   

    我学了两周delphi,看来可以应聘你的职位了^_^,135应该初学者会噻。不过楼主对只会写数据库程序有偏见,为啥还是搞了个数据库的题。而且列出所有表,好像数据库中用处并不大,不过好像书都用这个例子,还不如循环访问一个记录集的程序实用。
      

  6.   

    第四题
    asm
      push a
      push b
      pop a
      pop b
    end;
      

  7.   

    题目不难,
    就觉得 用pascal 写一个双向链表 这题目好点
    5题还可以
    其他题目不怎么样
      

  8.   

    第四题
    a:= a xor b
    b:= b xor a
    a:= a xor b
      

  9.   

    第四题是网上流传的一个面视题,楼上的复杂化了。var
      a, b: Integer;
    begin
      a := 1;
      b := 2;  a := a+b;
      b := a-b;
      a := a-b;
      ShowMessage(Format('%d, %d', [a, b]));
    end;
      

  10.   

    这几天刚学delphi.因为烦了vc的近于api sdk方式的开发.
    只对第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;
      

  11.   

    不过Delphi的确用的人越来越少.估计某天也不适合初学者了.没资料.前天我到成都的两个书城.一个春熙路.一个市中心.没找到一本Delphi的.这个工具的确优秀.不知为啥用的人越来越少.愿意太多了..我看最主要的还是资料.要不是我以前学过c++ c#的话.估计也用不了Delphi了...希望有人出书......
      

  12.   

    7、描述一下TEidt和TListView的类派生顺序,并说明它们的来源区别。
    这道题确实不能答上来,因为Delphi中根本就没有TEidt类,是笔误还是有意设置?
      

  13.   

    如果DELPHI真的好,那么公司用户会多,公司用户多了,产生的需求会诱使优秀人才学用DELPHI。从这个角度看,DELPHI不够好,因为公司是逐利的。
    如果DELPHI不好,为什么开发应用程序比VC快捷?不光快捷,学习成本也低不少。而且,VC能做的,DELPHI基本都能做。从这个角度,DELPHI不应该不好。
    原因:DELPHI的产品销售战略有问题。我个人认为,就是单价太高。
    对于公司用户,主导者大都是C系的,如果D容忍甚至放纵普通用户使用D,将D价格从天上降到人间,甚至低于MS系的开发工具,从现在起,像MDL一样培养客户,也许有机会。
    个人感想:即使我从开始到现在都一直用D(用过三个月的VB),而且现在用它开发英文共享软件,但因为一直在用D版,心里有一种不大干净的感觉。买吧,太贵了,像MS系的价格就比较有吸引力。
    最后一点:国内的DELPHI资料太少了,国外的多一些,但确实远不如MS系的。看MSDN就知道。
      

  14.   

    to:iseekcode
    你说的也不尽然,只能说 宝蓝 输给了ms Delphi与ms谁好不好评价,但是有如下事实:
    现在ms开发工具的某某曾经是Delphi的...
    从他进入微软,你会发现,VS特别是VC++的编译速度...,如果你用过VC++6开发过大型系统,你会对编译速度很有感受。
    .NET使宝蓝(Enterprise)失去了正确的方向。希望codegear 能给Delphi新的生命力。
      

  15.   

    看看我直接做是否合格....呵呵.1、Delphi 内置类型 string 和 WideString 的区别。 
    答:  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吧,写一个触发器.=================================================================
    混饭不容易啊.唉!        为什么不给人家做一个你们需要的程序呢,让他回家做.呵呵
       
      

  16.   

    没看完
      initialization:      初始化(好像是全局初始化描述的地方) 
      finalization:        完成(好像是全局完成后,将做什么描述的地方) 
    用英文直接翻译就可以了,
      没用用过,跟踪过执行过程?
      第一个是单元构造
      第二个是单元析构
      
      具体执行顺序,自己写一个调试下,断点设置到 工程文件的 Begin 处唉!
      

  17.   

     Exe程序:        GetDirXXXtroy(exe程序)          //不知道是不是,函数名忘记了 
     DLL程序:        GetDirXXXtroy(DLL程序) 
     你基本功很不扎实
    exe  Application.ExeName 如果不引用forms单元 , 可以 用ParamStr(0)
    dll  ParamStr(0)其实方法很多,以上是我以前习惯用的。
      

  18.   

    汗,这下DELPHI兄弟的脸让我全丢了.(我串门来的,叫精通的兄弟来做吧)
      

  19.   

    第四题 
    a:= a xor b 
    b:= b xor a 
    a:= a xor b
    这个速度最快,如果能写出来,我觉得基本可以录用了
      

  20.   

    面试题,似乎大部分都懂一点,不过,真落实到纸上,就。只会做一道题。
    55555555555555555555555555555555555555555555555555555555555555
    其实我还是挺喜欢Delphi的。
    我以前的领导说过,聪明的人用delphi
      

  21.   

    10、Delphi快捷键 
      快速搜索添加控件: 这个呢?我用cnpack 用的我退化了,以为delphi本身没提供快速搜索添加控件的
      

  22.   


    {直接来了:不查答案}
    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?),
     = 内存保护不知,同步?略了
      

  23.   

    大部了分的应用都是对准数据库的。
    前几天招C#的人,也一个个都是只会用控件的。
    这几个问题也并不能反映实际的水平。楼主公司主要是做什么业务,想招一定要了解那些方面的人啊。
    这对那种开发语言都是一样的,并不是DELPHI才这样。只是最近几年B/S的应用多了,C/S的应用比较少,所以
    DELPHI才看起来没落了。
    思路比知道些方法更重要。
      

  24.   

    asm 
      push a 
      push b 
      pop a 
      pop b 
    end;
    还有人用这种方式,我没有想到!用这种方法的人很聪明,效率应该比Xor或xchg更高
      

  25.   

    我用那个xchg 是错的.呵呵.只是show一把而已
      

  26.   

    呵呵,你还抠得蛮严格的,不错,这点我没有注意到.那就这样了,才算效率最高:
    a:= a xor b
    b:= b xor a
    a:= a xor b
      

  27.   


    A := A + B;
    B := A - B;
    A := A - B;
    {这样行了吧!}
      

  28.   

    一、其实什么都不用记,需要用的时候翻书或找Delphi Help就行了;
    二、Delphi只是个工具,你想用什么功能和怎么用随你需要,它不是炫耀技能或限制人活性的东西。就像中国人学英语,这个试那个证考的全民都神经衰弱,其实实际需要的只是日常交流会话,对于这个,将人放到英语坏境中,三岁小孩都不学而会;
    三、各人有各人的使用习惯,一把剑有十种剑法,工具也是一样,如果总是以己度人,以自己的想法要求别人,那么这世界上除了你是人才,恐怕没有别人了。
    四、我学习使用Delphi少说也有十年了,做的各种小程序大系统加调试工具有多少连我都不记得,但看到你出的这些题时,还是有好些题让我直发愣,实话说连看都不想看。甚至有些愤怒,你这是什么意思?找茬吗??
      

  29.   

    现在delphi给的待遇太低了,招不到人正常!
      

  30.   


    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:
      

  31.   

    procedure TForm1.FormCreate(Sender: TObject);
    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,这题方法好多啊,毕业后我也遇到过这题……当时以为很难……