知乎上的一个怎么电商运营面试问题知乎iOS工程师的问题

知乎链接:
1.什么是arc?(arc是为了解决什么问题诞生的?)
首先解释ARC: automatic reference counting自动引用计数。
ARC几个要点:
在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。
程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。
MRC下内存管理的缺点:
1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
2.释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放)
3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
4.多线程操作时,不确定哪个线程最后使用完毕
2.请解释以下keywords的区别: assign vs weak, __block vs __weak
assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引用。
assign其实也可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。
首先__block是用来修饰一个变量,这个变量就可以在block中被修改(参考block实现原理)
__block:使用__block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 __weak typedof(self)weakSelf =
3.__block在arc和非arc下含义一样吗?
是不一样的。
在MRC中__block variable在block中使用是不會retain的
但是ARC中__block則是會Retain的。
取而代之的是用__weak或是__unsafe_unretained來更精確的描述weak reference的目的
其中前者只能在iOS5之後可以使用,但是比較好 (該物件release之後,此pointer會自動設成nil)
而後者是ARC的環境下為了相容4.x的解決方案。
所以上面的範例中
__block MyClass* temp = …;
// MRC環境下使用
__weak MyClass* temp = …;
// ARC但只支援iOS5.0以上的版本
__unsafe_retained MyClass* temp = …;
//ARC且可以相容4.x以後的版本
4.使用nonatomic一定是线程安全的吗?()
atomic原子操作,系统会为setter方法加锁。 具体使用 @synchronized(self){//code }
nonatomic不会为setter方法加锁。
atomic:线程安全,需要消耗大量系统资源来为属性加锁
nonatomic:非线程安全,适合内存较小的移动设备
5.描述一个你遇到过的retain cycle例子。
block中的循环引用:一个viewController
@property (nonatomic,strong)HttpRequestHandler *
@property (nonatomic,strong)NSData
_handler = [httpRequestHandler sharedManager];
[ downloadData:^(id responseData){
_data = responseD
self 拥有_handler, _handler 拥有block, block拥有self(因为使用了self的_data属性,block会copy 一份self)
解决方法:
__weak typedof(self)weakSelf = self
[ downloadData:^(id responseData){
weakSelf.data = responseD
6.+(void) +(void)initialize;有什么用处?
在Objective-C中,runtime会自动调用每个类的两个方法。+load会在类初始加载时调用,+initialize会在第一次调用类的类方法或实例方法之前被调用。这两个方法是可选的,且只有在实现了它们时才会被调用。
共同点:两个方法都只会被调用一次。
7.为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
先来看看怎么理解发送消息的含义:
曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话的深刻含义。于是[receiver message]会被编译器转化为:
objc_msgSend(receiver, selector)
如果消息含有参数,则为:
objc_msgSend(receiver, selector, arg1, arg2, ...)
如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。
现在可以看出[receiver message]真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接收者发送message这条消息,而receive将要如何响应这条消息,那就要看运行时发生的情况来决定了。
Objective-C 的 Runtime 铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个 Objc 程序员需要了解的。
Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。可以使用runtime的一系列方法实现。
顺便附上OC中一个类的数据结构 /usr/include/objc/runtime.h
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY; //isa指针指向Meta Class,因为Objc的类的本身也是一个Object,为了处理这个关系,r
untime就创造了Meta Class,当给类发送[NSObject alloc]这样消息时,实际上是把这个消息发给了Class Object
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE; // 父类
const char *name OBJC2_UNAVAILABLE; // 类名
long version OBJC2_UNAVAILABLE; // 类的版本信息,默认为0
long info OBJC2_UNAVAILABLE; // 类信息,供运行期使用的一些位标识
long instance_size OBJC2_UNAVAILABLE; // 该类的实例变量大小
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; // 该类的成员变量链表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE; // 方法定义的链表
struct objc_cache *cache OBJC2_UNAVAILABLE; // 方法缓存,对象接到一个消息会根据isa指针查找消息对象,这时会在method
Lists中遍历,如果cache了,常用的方法调用时就能够提高调用的效率。
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 协议链表
} OBJC2_UNAVAILABLE;
OC中一个类的对象实例的数据结构(/usr/include/objc/objc.h):
typedef struct objc_class *C
/// Represents an instance of a class.
struct objc_object {
OBJC_ISA_AVAILABILITY;
/// A pointer to an instance of a class.
typedef struct objc_object *
向object发送消息时,Runtime库会根据object的isa指针找到这个实例object所属于的类,然后在类的方法列表以及父类方法列表寻找对应的方法运行。id是一个objc_object结构类型的指针,这个类型的对象能够转换成任何一种对象。
然后再来看看消息发送的函数:objc_msgSend函数
在引言中已经对objc_msgSend进行了一点介绍,看起来像是objc_msgSend返回了数据,其实objc_msgSend从不返回数据而是你的方法被调用后返回了数据。下面详细叙述下消息发送步骤:
检测这个 selector 是不是要忽略的。比如 Mac OS X 开发,有了垃圾回收就不理会 retain,release 这些函数了。
检测这个 target 是不是 nil 对象。ObjC 的特性是允许对一个 nil 对象执行任何一个方法不会 Crash,因为会被忽略掉。
如果上面两个都过了,那就开始查找这个类的 IMP,先从 cache 里面找,完了找得到就跳到对应的函数去执行。
如果 cache 找不到就找一下方法分发表。
如果分发表找不到就到超类的分发表去找,一直找,直到找到NSObject类为止。
如果还找不到就要开始进入动态方法解析了,后面会提到。
后面还有:
动态方法解析resolveThisMethodDynamically
消息转发forwardingTargetForSelector
详情可参考
8.什么是method swizzling?
Method Swizzling 原理(方法搅拌?)
在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。
我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP,
我们可以利用 class_replaceMethod 来修改类,
我们可以利用 method_setImplementation 来直接设置某个方法的IMP,
归根结底,都是偷换了selector的IMP,如下图所示:
9.UIView和CALayer是啥关系?
1.UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的 (Mac下似乎不是这样)。它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。 UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等 等,实际上内部都是在访问它所包含的CALayer的相关属性。
2.UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的 类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过
- (class) layerClass {
return ([CAEAGLLayer class]);
使某个UIView的子类使用GL来进行绘制。
3.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表 示。例如下面的代码
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer: grayCover];
会在目标View上敷上一层黑色的透明薄膜。
4.UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。
逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
显示树,这棵树的内容是当前正被显示在屏幕上的内容。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。
如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
我觉得应该是使用Quartz2D直接绘制图片,得把这个看看。
  a、创建目标大小(cropWidth,cropHeight)的画布。
  b、使用UIImage的drawInRect方法进行绘制的时候,指定rect为(-x,-y,width,height)。
  c、从画布中得到裁剪后的图像。
- (UIImage*)cropImageWithRect:(CGRect)cropRect
CGRect drawRect = CGRectMake(-cropRect.origin.x , -cropRect.origin.y, self.size.width * self.scale, self.size.height * self.scale);
UIGraphicsBeginImageContext(cropRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, CGRectMake(0, 0, cropRect.size.width, cropRect.size.height));
[self drawInRect:drawRect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
使用drawRect有什么影响?(这个可深可浅,你至少得用过。。)
drawRect方法依赖Core Graphics框架来进行自定义的绘制,但这种方法主要的缺点就是它处理touch事件的方式:每次按钮被点击后,都会用setNeddsDisplay进行强制重绘;而且不止一次,每次单点事件触发两次执行。这样的话从性能的角度来说,对CPU和内存来说都是欠佳的。特别是如果在我们的界面上有多个这样的UIButton实例。
ASIHttpRequest或者SDWebImage里面给UIImageView加载图片的逻辑是什么样的?
详见SDWebImage的实现流程
麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)
图片的内存缓存,可以考虑将图片数据保存到一个数据模型中。所以在程序运行时这个模型都存在内存中。
移除策略:释放数据模型对象。
讲讲你用Instrument优化动画性能的经历吧(别问我什么是Instrument)
loadView是干嘛用的?
当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法。这个方法就会加载或者创建一个view对象,赋值给view属性。
loadView默认做的事情是:如果此ViewController存在一个对应的nib文件,那么就加载这个nib。否则,就创建一个UIView对象。
如果你用Interface Builder来创建界面,那么不应该重载这个方法。
如果你想自己创建view对象,那么可以重载这个方法。此时你需要自己给view属性赋值。你自定义的方法不应该调用super。如果你需要对view做一些其他的定制操作,在viewDidLoad里面去做。
=========================================
根据上面的文档可以知道,有两种情况:
1、如果你用了nib文件,重载这个方法就没有太大意义。因为loadView的作用就是加载nib。如果你重载了这个方法不调用super,那么nib文件就不会被加载。如果调用了super,那么view已经加载完了,你需要做的其他事情在viewDidLoad里面做更合适。
2、如果你没有用nib,这个方法默认就是创建一个空的view对象。如果你想自己控制view对象的创建,例如创建一个特殊尺寸的view,那么可以重载这个方法,自己创建一个UIView对象,然后指定 self.view = myV 但这种情况也没有必要调用super,因为反正你也不需要在super方法里面创建的view对象。如果调用了super,那么就是浪费了一些资源而已
viewWillLayoutSubView你总是知道的。
横竖屏切换的时候,系统会响应一些函数,其中 viewWillLayoutSubviews 和 viewDidLayoutSubviews。
- (void)viewWillLayoutSubviews
[self _shouldRotateToOrientation:(UIDeviceOrientation)[UIApplication sharedApplication].statusBarOrientation];
-(void)_shouldRotateToOrientation:(UIDeviceOrientation)orientation {
if (orientation == UIDeviceOrientationPortrait ||orientation ==
UIDeviceOrientationPortraitUpsideDown) {
通过上述一个函数就知道横竖屏切换的接口了。
注意:viewWillLayoutSubviews只能用在ViewController里面,在view里面没有响应。
GCD里面有哪几种Queue?你自己建立过串行queue吗?背后的线程模型是什么样的?
1.主队列 dispatch_main_queue(); 串行 ,更新UI
2.全局队列 dispatch_global_queue(); 并行,四个优先级:background,low,default,high
3.自定义队列 dispatch_queue_ 可以自定义是并行:DISPATCH_QUEUE_CONCURRENT或者串行DISPATCH_QUEUE_SERIAL
用过coredata或者sqlite吗?读写是分线程的吗?遇到过死锁没?咋解决的?
http的post和get啥区别?(区别挺多的,麻烦多说点)
1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
  POST把提交的数据则放置在是HTTP包的包体中。
2.”GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据,IIS4中最大为80KB,IIS5中为100KB”??!
  以上这句是我从其他文章转过来的,其实这样说是错误的,不准确的:
  (1).首先是”GET方式提交的数据最多只能是1024字节”,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
  注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。[见参考资料5]
  (2).理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
3.在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。在JSP中,用request.getParameter(\”XXXX\”)来获取,虽然jsp中也有request.getQueryString()方法,但使用起来比较麻烦,比如:传一个test.jsp?name=hyddd&password=hyddd,用request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以用GET和_POST分别获取GET和POST中的数据,而REQUEST则可以获取GET和POST两种请求中的数据。值得注意的是,JSP中使用request和PHP中使用_REQUEST都会有隐患,这个下次再写个文章总结。
4.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。
总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为”GET”,实质上,GET和POST只是发送机制不同,并不是一个取一个发!
我知道你大学毕业过后就没接触过算法数据结构了,但是请你一定告诉我什么是Binary search tree? search的时间复杂度是多少?
Binary search tree:二叉搜索树。
主要由四个方法:(用C语言实现或者Python)
1.search:时间复杂度为O(h),h为树的高度
2.traversal:时间复杂度为O(n),n为树的总结点数。
3.insert:时间复杂度为O(h),h为树的高度。
4.delete:最坏情况下,时间复杂度为O(h)+指针的移动开销。
可以看到,二叉搜索树的dictionary operation的时间复杂度与树的高度h相关。所以需要尽可能的降低树的高度,由此引出平衡二叉树Balanced binary tree。它要求左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这样就可以将搜索树的高度尽量减小。常用算法有红黑树、AVL、Treap、伸展树等。
1.UIImageView加上圆角
UIImage * image = [UIImage imageNamed:@"1.png"];
UIImageView * imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 328)];
imgView.contentMode = UIViewContentModeScaleAspectF
imgView.image =
// Add the imageView to your view heirarchy, UITableViewCell or otherwise
[self.view addSubview:imgView];
CAShapeLayer * shapeLayer = [CAShapeLayer layer];
//Setting the background color of the masking shape layer to clear color is key
//otherwise it would mask everything
shapeLayer.backgroundColor = [UIColor clearColor].CGC
shapeLayer.path = [UIBezierPath bezierPathWithRoundedRect:imgView.bounds byRoundingCorners: UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(100.0, 100.0)].CGP
imgView.layer.masksToBounds = YES;
imgView.layer.mask = shapeL
//Be sure to set the frame of the maskingLayer to be the bounds of the layer you want to
shapeLayer.frame = imgView.layer.
本文已收录于以下专栏:
相关文章推荐
知乎上某人的ios面试题1.什么是arc?(arc是为了解决什么问题诞生的?)首先解释ARC: automatic reference counting自动引用计数。
ARC几个要点:
知乎上的一个怎么面试iOS工程师的问题
因为要找工作,在知乎上看了一个帖子,叫做“如何面试iOS工程师”,里面有一些初级问题,我记录下来,一是分享,而是记录,方便复习,如果有不对的,请批评指正,共同进步。问题如下:
1.什么是arc?(a...
在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过。先表达一下我自己对面试的观点:     1.笔试、面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”...
初到北京,面了几家iOS开发的职位,颇有感触。
主要分为三大类问题,闲聊,技术,职业规划。
闲聊:1、为什么从上一家公司离职?
   2、简单介绍你任职的上一家公司?
                ...
面试题中有一些一般性的问题,通常是会问到的。面试iOS应聘者时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面的了解。所以下面的面试问题更多的是提...
转自:/matt123/archive//2830290.html#2586912 
昨晚正式收到支付宝的Offer,提交完离职申请,...
http://blog.csdn.net/ayocross/article/details/     url
先介绍下我的情况:通信背景,工作一年多不到两年。之前...
先介绍下我的情况:通信背景,工作一年多不到两年。之前一直在做C++的MFC软件界面开发工作。公司为某不景气的国企研究所。(喏,我的工作经验很水:1是方向不对;2是行业有偏差)。然后目前是在寻找pyth...
一个嵌入式开发者的面试之路
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)一个新手面试 Linux 运维工作至少需要知道哪些知识? - 知乎1530被浏览166231分享邀请回答1076 条评论分享收藏感谢收起8026 条评论分享收藏感谢收起查看更多回答2 个回答被折叠()面试iOS工程师常被问到的20个基础问题 - 简书
面试iOS工程师常被问到的20个基础问题
今天在逛知乎的时候,看到一个帖子,下面的回答支持最多的是一个技术总监总结的他面试工程师,常问的20个非常简单的问题,但能准确答对一半以上的人却非常少。本人看了下,感觉这些问题确实比较基础,之所以很多人很多问题答不上,归根结底还是对基础知识不够重视,掌握得不够牢靠。下面将者20个问题分享出来,大家可以来看看,你可以准确答对几个。1.什么是arc?(arc是为了解决什么问题诞生的?)2.请解释以下keywords的区别:assign vs weak, __block vs __weak3. __block在arc和非arc下含义一样吗?4.使用atomic一定是线程安全的吗?5.描述一个你遇到过的retaincycle例子。6. +(void) +(void)initialize;有什么用处?7.为什么其他语言里叫函数调用,里则是给对象发消息(或者谈下对runtime的理解)8.什么是methodswizzling?9. UIView和CALayer是啥关系?10.如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)11.使用drawRect有什么影响?(这个可深可浅,你至少得用过。。)12. ASIHttpRequest或者SDWebImage里面给UIImageView加载图片的逻辑是什么样的?(把UIImageView放到UITableViewCell里面问更赞)13.麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)14.讲讲你用Instrument优化动画性能的经历吧(别问我什么是Instrument)15. loadView是干嘛用的?16. viewWillLayoutSubView你总是知道的。。17. GCD里面有哪几种Queue?你自己建立过串行queue吗?背后的线程模型是什么样的?18.用过coredata或者sqlite吗?读写是分线程的吗?遇到过死锁没?咋解决的?19. http的post和get啥区别?(区别挺多的,麻烦多说点)20.我知道你大学毕业过后就没接触过算法数据结构了,但是请你一定告诉我什么是Binary search tree? search的时间复杂度是多少?我很想知道!以上就是iOS工程师面试常被问到的20个基础问题,如果你都能准确答上,那么恭喜你,你确实很优秀。如果你还有不清楚的地方,那就赶紧去找资料了解、学习去吧。相关文章:《》如何面试 iOS 工程师? - 知乎5511被浏览769749分享邀请回答631183 条评论分享收藏感谢收起7215 条评论分享收藏感谢收起查看更多回答5 个回答被折叠()其实之前关于面试也说了好多,知乎上我也开过一个面试的Live,也有幸被选进了知乎2016精选。不过今天我想说的是在实际过程中如果我去面试了,我会怎么进行面试,会问什么问题,会遵照哪些原则。我本身的行事风格就是比较特殊的,希望对广大应聘者和面试官有所帮助。
  只关心对方提及的内容
  这是我自己遵守的原则。所有的交流一定是基于对方简历和自我介绍中提及的。换言之,对方提及的内容回答有明显问题,那么扣大分,相反,没有提及的问题哪怕直接回答不知道,也不扣分。
  一般对方简历上肯定会提及一些领域,比如“H5,,,iOS”等等,也会提及一些工具,比如“selenium,Appium,Robotium,monkey”,自然还会提及一些测试类型,比如“,业务测试,,”等等,我会根据这些来提一些问题,而且都是比较浅的问题,例如:
  · H5和web有什么区别,为什么这两个需要同时写出来
  ·&monkey这个工具Android和iOS上分别怎么运行,有什么区别
  ·&接口测试一般用了什么框架
  ·&Robotium这个框架有什么缺点
  ·&...
  这种一般我都是当做开始的寒暄,随便聊聊的。但绝对不会去问对方不提及的内容,南辕北辙的面试我是绝对反对的。
  和思路并存
  简单来讲就是对方积累多的领域查看技术细节,相对经验少的地方看思路就可以了。没有必要再任何一个点上面都去死扣细节,每个人总有做过忘记的时候,只要思路上大致对就可以了,我认为很多技术细节都是可以通过得到的。
  无论做管理还是测试架构,对方总有自己擅长的一个领域,可以挑选一两个出来看看是否知道技术细节,其他相对的看看思路是否正确即可。不要一直去问概念,例如“我们来聊下指针吧,你怎么理解指针?”,“的设计方法具体有哪些,你说说看?”,“JVM是怎么实现的?”,除非你的公司在招聘这个人的时候有确切的定位要求是需要的,否则我觉得根本没有必要。很多公司和人这样做无非就是体现出自己的优越感,还有别的么?
  我相信很多面试官自己对于自己做过的内容很多细节也未必一定记得很清楚,但并不代表不会或者不能落地,所以我建议大家也不要太为难来面试的人。自己缺什么样的就招什么样的,我们招人是解决问题,不是炫耀自己或者自己所在公司多么牛逼的。
  注意力放在人身上
  我从来不关心这个人简历上写着什么学校毕业,我也从来不关心这个人以前所在的公司名字叫什么,BAT还是ABC都无所谓。但我会关心他去的公司的规模,因为不同规模的公司做技术和做项目的复杂程度是有很大差异的,所以我会很感兴趣同一个人在不同规模的公司下会怎么落地做事。
  行业既然浮躁了,我们就不要浮躁了。注意力放在人身上,不要关心对方是不是名校或者大公司出来的,这些都不重要。很多人非常能说,面试的时候会告诉你以前做过什么很牛*的项目,用过什么平台,达到了什么样数量级的效果,对整个公司都有着非常重大的意义。
  然后我会问,那么你们是怎么克服一些大家常见的困难的呢?
  对方还是会继续说,因为自己公司有什么厉害的平台,各种专业名词,各种术语,我相信大家和我,大多数人都是听不懂的。
  接着我就会打断他说,我不关心你们公司项目做了什么,我也不关心你们用了什么平台,你就告诉我你在其中具体做了什么,负责了什么,碰见了什么困难,怎么解决的,别的不重要。
  往往接下来你们就能够看到对方面露难色,吞吞吐吐又或者终于开始说人话了,那么恭喜你们,你们看到了这个人的本体。当然也有例外,那说明你们的确有幸找到了核心人员。
  我们招聘一个人,一般不太可能把对方公司的项目直接拿过来,也不太可能把对方公司的平台直接拿过来,那么我们就应该更关注在人本身,不要去扯有的没的,也不要被背景迷惑,没有什么意义。如果这个人没有能力却硬要看背景还能面试通过的话,要么就是为了公司的政治斗争,要么就是创业公司CEO要去拿融资,其他的我觉得就没有必要了。
  问题必须有上下文
  说实话,我个人觉得这是一个面试官应该有的基础品质。不要问出一些没有上下文的问题,对方答不上来,然后自己沾沾自喜还在心中默默扣分。比如:
  ·&说说你们公司接口测试怎么做的
  ·&说说以前性能压测怎么做的
  例如这些问题我觉得都是没有太大意义的,只是浪费时间而已。问出这样大而广并且没有上下文问题的人我本身认为是一个不合格的面试官。但并不是说我们就不用去了解了,通过这些了解对方思路是非常必要的,但每个人总有自己负责的环节。所以一般如果我想了解对方以前在公司做接口测试的情况,我会问
  请你描述下你们以前公司的业务形态,做接口测试为了达到什么样的目的,你在这个过程中负责什么,具体你做了什么,为什么这样设计等等
  当然如果你不想这样问却也想了解对方在一个方面的具体了解情况和落地能力,那么你就需要营造出一个上下文给对方,例如
  我们现在想做一个IM产品,希望一年之后达到的用户量是X,同时在线人数是Y,公司服务器架构是A,提供的硬件的能力是B,测试团队人数和能力情况是C等等,如果你需要负责这个压测,你会怎么做?
  而不是直接当头一棒来问你们怎么做的?我相信这个面试官如果被这样问,肯定也是一脸懵逼。
  关心8个小时外的
  我问这个问题我可不想得到类似于“我会写代码”,“我会看书”,“我会参加某些活动”,“我会上什么网站学习知识”等等这类答案。这类答案在我看来就是骗骗人,随便说说的。
  2017年,已经是一个飞速发展的时代了。一个人在8个小时外做什么才会真正决定这个人的潜力和对企业的价值。但上面这些答案并没有意义,我关心的不是做什么,而是为什么做。自己有什么明确的目的或者目标吗?有没有什么自己的计划?如果没有,那么我只能认为你是在面试的时候应付我说出了一些与事实不符的答案,又或者你只是跟风,别人这样做你也这样做。那么对不起,我认为你不适合这样一个快速的时代。
  不要重复劳动
  是的,我相信很多人都碰到过每个面试官都过来问一句“请你做一下自我介绍”。这就会让我感觉我其实我来到了一个每个人都不认识对方的公司,对方公司的面试官和hr根本就没有看过我简历,根本就不尊重我嘛。
  既然如此,那么我们就不要再去继承这样的“优良传统”了。
  每一轮的面试官之间都需要有交流,不要重复的去考核一些东西,更不要重复的让应聘者描述同一件事情,如果我们每个人都问一句“请你说下你以前自动化都怎么做的”,也许到那个时候你会觉得对方心不在焉,态度不好,但其实是自己面试流程垃圾,还扣屎盆子在别人头上,要你心情会好么?我真的很同情来应聘的人。
  只关心自己要关心的
  这一点很重要,自己清楚自己在所有面试中的定位,你是考核技术的,还是考核这个人性格的,还是考核管理能力的。不要盲目的去关心不应该自己关心的内容,这样只会让原本有序的面试流程在应聘者眼里变得杂乱无章,只会让你的领导和hr觉得你是一名不合适的面试官。
  感觉说着说着方向就偏了,好吧,及时打住。也许你还会关心设计思想,管理能力,技术细节等等。每家企业,每个人都有自己关心的点,自己需要招聘的人,很正常。但以上这些至少是我认为一个三观正的面试官和企业应该做到的,反正我也控制不了别人,我保证我都会做到就是了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14341次
排名:千里之外
转载:86篇
(1)(10)(22)(7)(8)(17)(38)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 面试问题 知乎 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信