项目地址:https://github.com/mvj3/oracle_interview_calculation
简单来说,我想通过这个作品来向社区呼吁,雇主应该少让弱势应聘者浪费时间去做这些无聊的面试题,因为每个人的时间都很宝贵。
为什么我要无偿做 Oracle 的这个编码面试?
首先感谢 Oracle 给正在找工作的 Ruby 程序员提供了机会,但是我看到了我认为的不尊重应聘者的一条招聘说明 --- 做一个编码测试。以下是我对这一做法的反对声明:
从这个招聘描述 (见下方我从招聘贴里拷贝过来的,我去掉了邮箱地址) 的薪资待遇中一条"高于行业的薪资水平,15-25K"说明看来,TA 们要招的应该是一个中高级的 Ruby 工程师。
我相信,对于一个中高级的 Ruby 工程师来说,应该有一个善于活用开源软件库的能力,所以怎么说至少得有个 Github 账户等一些可以显露技术能力的互联网上的公开证明吧, 如果对方已经有一些开源作品 (当然没开源的也可以了),做这个"投递简历前请确保你能给出如下问题的一个优雅的解决方案"恰恰是对应聘者的一个 不尊重。
我建议是可以让应聘者发一个 TA 得意的编码作品,从这个作品里,应聘者应该可以确保雇主得到如下信息:
如果非要应聘者做编码面试的话,那么请考虑这个编码是对应聘者是有损失的,TA 不需要靠这个测试来证明或提升自己 (真正优秀的工程师都会善于在日常工作中发现和解决问题,TA 会发现自己在哪些方面应该去提高),所以建议付给用心完成任务的工程师 TA 当前待遇标准下的时薪。
请尊重相对弱势的应聘者,因为每个人的时间都很宝贵。
问: 神马???我有没有看错? Oracle也开始用Ruby了,那Java兄肿么办?
答: 是的!这世界变化快,哦也没有办法 :-1 谁让那些创业公司都用ruby呢?甲骨文云社交平台是通过收购美国本土成功的创业公司(如Vitrue, Involver, Collective Intellect, BlueKai)来组建的,所以抹油办法了,只好用Ruby喽!!(不过话说Ruby还挺好用的说。。。)
问: 甲骨文。。。大公司。。。很沉闷死板了喽?
答: 错!说实在话,俺们现在很纠结的啦,500强的名头,创业公司的文化(但不是加班文化哦)。俺们团队平均年龄相当低,俺30出头,已经是“老当益壮”, “老奸巨猾”,“发挥余热”了。。。。(另,由于团队太活跃,已然被其他组投诉好多次了。。。)
问: 产品干嘛的?
答: 官方的那些销售语言俺就不说了。简单来讲: Oracle的社交云平台(SRM,社交关系管理)目的要整合地球(注意,是地球)上主流的社交关系网络,来实现商业公司与消费者社交关系通道的统一配置与管理。Oracle社交关系管理(SRM)平台是业内第一个统一的集成平台,它为客户提供了从内容创建,协作化管理,消息响应到语义分析的整体解决方案。目前SRM已在全球和众多知名社交网站及应用展开战略合作,包括Facebook, Twitter, Google+, Instagram, Weibo等等,未来Oracle会继续加大对亚洲区市场的扩展和投入。此外,利用Oracle强大的背书,SRM正在和多个Oracle CRM系统开展对接,无疑SRM将成为众多企业参与下一代互联网竞争所必不可少的决定性工具。
产品官网看这里:http://www.oracle.com/cn/solutions/social/overview/index.html
问: 那你们的优势捏?
答: 俺们不逗比,不画饼。那些该有的(比如神马弹性工作制啊,优越办公环境啊,双休啊,无限量零食啊,聚餐啊)必须有! 还有神马美女帅哥啊,那也不是事,关键是俺们的美女帅哥都是神马耶鲁啊,MIT啊,宾大啊,清华啊,北大的。。。还有还有,俺们有安全感,俺们不加班(真的不加那种)。。。
问: 你们会不会跟“啊倒闭”那家公司一样,搞几年中国team就over了呢?
答: 不好意思,俺们老大中国人。。。
好了,言归正传!
基本要求
1. 三年以上互联网应用开发经验,优秀毕业生亦可(但目前不接受实习)
2. 熟练掌握Ruby语言,熟悉Rails,有ROR项目开发经验
3. 熟悉基本的Linux命令,熟练操作Linux,有Linux下开发经验
4. 熟悉流行数据库(SQL Server/MySQL/Oracle)
5. 有一定算法基础,良好的面向对象思维
6. 优秀的学习能力,优秀的沟通能力,勇于承担责任,易于合作并帮助团队成功
加分项
1. 熟悉HTML/CSS或熟练掌握Javascript
2. 熟悉Shell脚本编写
3. 熟悉流行前端框架,如:Backbone, AngularJS
4. 熟悉TDD/BDD,熟悉RSpec,Jasmine等测试框架
5. 有数据库设计或优化经验
6. 熟悉社交网络集成开发
7. 良好的英语读写听说能力
薪资待遇
1. 高于行业的薪资水平,15-25K
2. 年终奖金
3. 弹性工作制
4. 优厚福利,如:公司级及团队TB活动,无限量供应的零食,TEDTalk分享会,加班餐,网费报销
5. 硅谷出差机会
工作地点
海淀区西二旗中关村软件园
我们的优势
1. 保持快速增长的崭新团队
2. 打造引领行业并帮助世界最顶尖公司走向成功的社交产品
3. 与世界领先的Rails技术团队零距离沟通
4. 轻松高效的团队氛围
5. 工作与生活的平衡
又有新的HC放出来,欢迎投递简历。
*******补充要求********
投递简历前请确保你能给出如下问题的一个优雅的解决方案:
http://www.codewars.com/kata/525f3eda17c7cd9f9e000b39
# encoding: UTF-8
# Run tests
# ruby oracle_interview_calculation.rb
REQUIREMENTS=<<REQUIREMENTS
References:
[1] https://ruby-china.org/topics/25179 [北京] 甲骨文社交云平台团队招聘 Ruby 软件开发工程师 - 继续招聘
[2] http://www.codewars.com/kata/calculating-with-functions/ruby
Description:
This time we want to write calculations using functions and get the results. Let's have a look at some examples:
seven(times(five())); // must return 35
four(plus(nine())); // must return 13
eight(minus(three())); // must return 5
six(dividedBy(two())); // must return 3
Requirements:
There must be a function for each number from 0 ("zero") to 9 ("nine")
There must be a function for each of the following mathematical operations: plus, minus, times, dividedBy (divided_by in Ruby)
Each calculation consist of exactly one operation and two numbers
The most outer function represents the left operand, the most inner function represents the right operand
REQUIREMENTS
module Calculation
# We use `method_missing` and `define_method` to define number and operator methods lazily, and with cached.
class NumberValue < Struct.new(:number)
alias to_ary number
alias inspect number
end
class OperationValue < Struct.new(:operation)
alias to_ary operation
alias inspect operation
end
class MiddleRightExpression < Struct.new(:operation, :number)
end
Numbers = "zero one two three four five six seven eight nine".split(" ").map(&:to_sym)
NumMap = Hash[Numbers.map.with_index {|num, idx| [num.to_sym, NumberValue.new(idx)] }]
OperationsMap = {
plus: OperationValue.new(:+),
minus: OperationValue.new(:-),
times: OperationValue.new(:*),
divided_by: OperationValue.new(:/),
}
def method_missing(name, *args, &block)
#0. Check name is valid
if not NumMap.include?(name) and not OperationsMap.include?(name)
raise "Can't find `#{name}` method in current scope."
end
#1. Define a number method lazily
expression_num = NumMap.fetch(name, false)
if expression_num.is_a?(NumberValue)
Kernel.send(:define_method, name) do |arg=nil|
if arg
if arg.is_a?(MiddleRightExpression)
return expression_num.number.__send__(arg.operation, arg.number)
else
raise "`#{arg}` should be a MiddleRightExpression"
end
else
return expression_num.number
end
end
end
#2. Define a operation method lazily
expression_opr = OperationsMap.fetch(name, false)
if expression_opr.is_a?(OperationValue)
Kernel.send(:define_method, name) do |number|
return MiddleRightExpression.new(expression_opr.operation, number)
end
end
return self.__send__(name, *args, &block)
end
end
require "test/unit"
class TestCalculation < Test::Unit::TestCase
include Calculation
puts "Welcome to do some calculations!"
puts "Avaiable numbers are: #{Calculation::Numbers.join(", ")}."
puts "Avaiable operators are: #{Calculation::OperationsMap.keys().join(", ")}."
puts
puts "Usage:"
puts " seven(times(five())) # => 35"
puts
puts "Note:"
puts "This DSL is limited, can't support operator precedence, it's done by single nested parentheses."
puts
puts "*"*100
puts
puts REQUIREMENTS
puts
def test_simple
#1. some test cases from requirement
assert_equal(5, five())
assert_equal(35, seven(times(five())))
assert_equal(13, four(plus(nine())))
assert_equal(5, eight(minus(three())))
assert_equal(3, six(divided_by(two())))
#2. more complex test cases
assert_equal(6, one(plus(two(plus(three)))))
assert_equal(6, one(times(two(times(three)))))
assert_equal(7, one(plus(two(times(three)))))
end
end