面试引发的high level abstration of OO language books named "Objects Unencapsulated: Java, Eiffel, and C++?" --正反全面分析编程语言

一、提问之前的准备

首先,最重要的是,你自己一开始就应该想清楚:

1. 需要新员工完成什么样的任务?less-skilled coding and testing task or high level design and impelmentation or management

2. 怎样的人能完成这样的任务?  characteristic owned/abiliby seized/experience of past works

3. 哪些途径和方法可以发现这样的人?

只有明确这些根本性的问题,才能正确高效地完成面试。

 

二、提问的原则

假定你对上一节的三个问题,已经有了清晰的想法,那么接下来就可以设计如何提问了。

有一些提问的原则,是你应该遵循的:

每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。

多提一些开放性(Open-ended)的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。

不要问宗教、家庭、健康、个人隐私等方面的问题。

不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。

三、考察专业能力

为了确认面试者是胜任的,你可以问一些与职位相关的专业方面的问题。(不过通常来说,一次面试不足以看出一个人的专业能力。)

比如,你的招聘职位是系统管理员,你可以问"如何快速地在50台机器上部署Linux?"(提示:正确答案不是刻录50张安装光盘。)

另外,你还应该向面试者了解他的过去,因为过去是未来的最好预测依据。不过,提问的重点不要仅仅是他过去的成果,更要关注在当时的环境中,他是如何决策和实施的。

 

四、考察综合素质

因为人是会发展的,所以某种程度上,面试者的综合素质要比他的专业能力更重要。

所以,具体的技术问题(如何调用API、什么是设计模式、编程语言的语法等等)可以少问一些,更应该关注面试者的事业心、对工作的热情、进取心、自律能力、毅力等方面。

下面是一些典型问题:

Why did you get into development?

你为什么开发软件?

How many technical books did you read in the past year?

去年你读了几本技术书籍?

What was your favorite technical book in the past year? What did you learn from it?

去年你最喜欢的技术书籍是哪本?你从中学到了什么?

What websites do you read regularly, related to development?

平时你经常访问哪些编程类网站?

Do you maintain any open-source projects?

你有自己的开源项目吗?

Do you code in your spare-time?

业余时间你编程吗?

Do you love programming, or do you do it for the money?

对于你来说,编程是一种爱好,还是一种谋生手段?

Have you accomplished anything important in your career yet? Do you want to?

你的职业生涯之中有什么重要的成就?它是你主导的吗?

What would make you feel that you have done something important?

什么事情会让你很有成就感?

五、考察理性思维

某些情况下,你可能需要了解面试者的分析判断能力,看他能否全面地思考问题、客观地评价自己。

那么,你可以依次提出这样三个问题:

What's your favorite programming language? Why?

你最喜欢的编程语言是哪种?为什么?

If you could add one feature to your favorite language, what would it be? Why?

// this is good to test interviewee's technical level of programming language and also the logical and reversed thinking.

 

如果允许你为这种语言加一种功能,你会加什么功能?为什么?

If you could remove one feature from it, what would it be? Why?

如果允许你取消一种功能,会是什么功能?为什么?

这里的重点是,让面试者从正反两方面评价一件自己熟悉的东西,看看他的思维是否片面。答案无所谓对错,只要面试者有一个明确的立场,能够从正反两方面说出令人信服的理由,就可以了。比如,某个软件的口碑不好,但是面试者说他很喜欢,而且说得出一大堆理由,清楚地解释了这种软件的优点和缺点在哪里,这样就很好。

你还可以把这些问题,套用在其他东西上面,比如操作系统、文字编辑器等等

 

 

C++ 不足之处:

http://wenku.baidu.com/view/d208b665783e0912a2162a27.html   英文原版

http://wenku.baidu.com/view/d208b665783e0912a2162a27.html   中文摘要

 

 C++泛型思想

从语言层面上来说,现代的编程语言为复用提供了三种主要的基本途径。结构化、面向对象(OO)以及泛型(GP)。  
结构化程序设计当中,提供复用性的语言特性主要是函数,在软件工程当中,函数可以被当成黑箱,实现一个或一组相关的功能(functionality),而用户不用关心函数内部的具体实现,只要负责将参数送入,然后接受返回值就可以了,C库函数就是极好的例子。  
但是结构化程序设计有它本质上的缺点,这个缺点主要体现在代码的阻止上面,进而影响了可维护性。结构化程序设计的一个主导思想就是著名的“程序=操作+数据”,这里操作其实就意味着函数。虽然该论断一言道破了软件开发或程序设计的本质,但真正落实到实际开发当中,在成本控制方面,开发者还需要更强大的手段。譬如,结构化程序设计的一个严重问题就是,与一组数据相关的一组操作不能很好的被封装到一块去,例如,在C语言里面,我们要表达一个动物以及该动物的行为,我们只能采用一个接口,外加一组函数来表示。这种松散的组织方式就造成了理解和维护上的困难。而且,由于没有类的机制,函数的名字只能通过加上其对应类型的名字作为前缀来避免名字冲突。这不但增加了出错的机会,从某种程度上也增加了系统的混乱。所以说结构化程序虽然提供了过程/函数级别的复用,但是这种复用能力在当今软件开发当中是远远不够的。而且由于数据跟操作之间松散的组织方式,所以结构化程序并不是很适合大型而复杂的应用开发。之所以以前的一些操作系统,如UNIX/LINUX系列全是以C来编写,个人觉得,主要跟一些历史遗留因素有关,另一个因素是当时C++尚未发展得像今天这般成熟。至于效率方面,C++标准委员会提交的一则技术报告[TR]很直观的表示出,C++中的类机制跟用C来实现类似的封装能力不但效率不打折扣,甚至有过之而无不及。另外,一些大型的效率相关的应用使用C++来实现也正实现了这一点。譬如.NET整个的基层架构全是C++编写。而且开发大型的3D游戏,C++几乎是唯一的选择。可见在效率方面,并非像许多人一贯以为的那样,

 

Objects Unencapsulated:

http://web.me.com/ianjoyner/Ian_Joyner/Writings.html


Object technology appears to be a bewildering field in constant turmoil. But the core concepts of object-oriented programming endure as a paradigm for advanced programming methodology. By analyzing and comparing three different object-oriented languages, Objects Unencapsulated probes the core of object technology to examine how various language features affect software productivity. Objects Unencapsulated examines and compares the strengths and weaknesses of Java, Eiffel, and C++. Topics covered include:

  • Objects, classes, modules, and types.
  • Features and interfaces.
  • Inheritance and genericity.
  • Concurrency and garbage collection.

Grounded by his belief that true innovation demands constant re-evaluation, Ian Joyner strips away the superficial distinctions between these languages to find the essence of object-oriented programming. He explains the facts behind the many controversies that an object-oriented practitioner constantly faces. By explaining some essential theory in practical terms, Objects Unencapsulated exposes the principles of the object-oriented paradigm.

 

Ian Joyner is a member to the Object Technology Group at the Microsoft Research Institute at Macquarie University in Australia. He has been practicing-and critiquing-object-oriented software since 1979.  

  •  

    • Programming. Communication, Abstraction, and Precision. Notation. Tool Integration. Correctness. Types. Flexibility, Correctness, and Reuse. Redundancy and Checking. Encapsulation and Implementation Hiding. Safety and Courtesy Concerns. Implementation and Deployment Concerns. Why OO? On Programming Language Evolution. The Usefulness of Mathematics. Legacy Systems.

    • From Bits to Semantics. Basic Structures: The Class. Usefulness of Grammars. Classes and Types. Structs (C++). Typedefs (C++). Global Environments. Class Metadata. Obsolete (Eiffel). Invariants (Eiffel). Components.

    • Namespaces (C++). Clusters (Eiffel). Packages (Java). Header Files (C++). Import (Java). ACE Specification (Eiffel). Separate or Integrate?

    • Basic Structures. Members (C++ and Java). Anonymous Parameters in Class Definitions (C++). Default Arguments (C++). Local Entity Declarations (Java and C++). Inlines (C++). Pointers and References (C++). Declarations and Definitions (C++). Scope. Constants. Static (C++). Once Routines. Class Variables and Redefinition.

    • Basic Structures: Inheritance and Derived Classes. The Nature of Inheritance. Multiple Inheritance. Virtual Classes (C++). Nested Classes (Java and C++). Polymorphism and Inheritance. Union. Enumeration Types. Name Overloading. Virtual Functions (C++). Pure Virtual Functions (C++). Function Overloading (C++ and Java). Virtuals and Inlining.

    • Basic Structures. C++ Syntax. Constrained Genericity. Genericity and Code Bloat. An Alternative Form of Genericity. Java and Genericity. Some Theory on Genericity. Genericity and Covariance.

    • Basic Structures. Friends (C++). Controlled Exports vs. Friends. Multiple Interfaces. External Assignment (C++ and Java). Export Controls and Nesting. Mutable Const (C++). Generalization.

    • Nameless Constructors (C++). Default Constructors (C++ and Java). Constructor Inheritance. Expanded Initialization (Eiffel). Constructor Initialization (C++). Destructors (C++). Dispose (Eiffel). Operator = (C++). and -> (C++). Delete and Delete [] (C++). Prefix and Postfix Operators (C++). || and && (C++). Operator Overloading (C++ and Eiffel). Implicit Conversions and Overloading (C++). Calling Parent Features. Calling Descendant Features. Conditional Expressions.

    • Type Casts (C++). RTTI and Type Casts (C++). New Type Casts (C++). Type Inference. Java and Casts. Signature Variance (Eiffel).

    • Global Analysis. Type-Safe Linkage (C++). Class Interfaces.

    • Concurrency - It's about Time! Garbage Collection. Constructors and Temporaries (C++). Bad Deletions (C++). Slicing (C++). Program Execution. Dynamic Linking. Exception Handling. LinkageError (Java).

    • Comments. Hexadecimal Literals (Eiffel). Double, Double Toil and Trouble. Class Header Declarations (C++).

    • Design by Contract. Preconditions, Types, and Invariants. The Software Life Cycle. CASE Tools. Reusability and Communication. Reusability and Trust. Reusability and Compatibility. Reusability and Portability. Reusability and Size. Idiomatic Programming. Low-Level Coding. Knowing the Correct Construct. Efficiency and Optimization. Standardization, Stability, and Maturity. Complexity. C++: The Overwhelming OOL of Choice?

    • Pointers. Booleans. Logical and Bitwise Operators. Arrays. Function Arguments. void and void*. NULL vs. 0. char; signed and unsigned. void fn () 340. fn (). fn (void). return. Switch Statements. Metadata in Strings. ++, --. Assignment Operator. Assignment Expressions. Defines. Case Sensitivity. Semicolons. Comments. Cpaghe++i.
  • Preface.
    Structure of the Book.
    About C++ Code Examples.
    Acknowledgments.
    Why Should We Be Concerned?
    1. Language Principles.
    2. Entities and Types.
    3. Modules and Imports.
    4. Members and Features.
    5. Type Extension: Inheritance and Virtuals.
    6. Type Extension: Generics and Templates.
    7. Interfaces and Access Control.
    8. Constructors, Destructors, and Other Operators.
    9. Casts.
    10. Compile Time.
    11. Run Time.
    12. Other Details.
    13. Projects, Design, and Other Factors.
    14. General Issues.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值