by zkback
如果你想找到一份软件开发者的工作,那么你不得不通过一个白板面试。我们像个勤奋的工程师一样把这些作为清晨仪式的一部分,与遍及精神星空的未知地的美丽网格一起,情不自禁地跑一遍旁边的目录以防我们存放“旧拖拉机、螺丝刀”的厨房在晚上有什么东西移动了,还有那些特定的垃圾数据:附属品、那些内向的让人感到陌生的家庭(器具)成员,他们现在已经忘记了初心,可能从来都不知道,但却是我们多关心的。我像让你搞明白一个面试中的普遍问题:反转链表。
首先,我们需要一个链表。清空你的不需要的工作空间,在受保护的表格里用两条递归和插入语填一些数据。
(defn cons [h t] #(if % h t))
“那不是个链表,”面试官说,“那是个‘if’的条件声明。”
“还有什么是链表,”你回答,你的眼睛开始发光,“或者可替代的?”
user=> (def x (cons 1 (cons 2 nil)))
#'user/x user=> (x true)
1
user=> ((x false) true)
2
“x 的值到底是多少呢?”面试官变得友好以来。在 REPL 回答,但不能被立刻欺骗。他们不是朋友。你的协议书禁止了这么做。
user=> x
#object[user$cons$cell__4431 0x3b89cc1c "user$cons$cell__4431@3b89cc1c"]
“认识一件事物的最好方式是去命名它,”你提议道。真实的命名有它自身的力量。K语言被勒恩坡发明,是一种最经典和简洁的一种。用你名字的一部分去灌输一种语言就是放弃你自身的某种元素。你记忆中的自身的最初的疼痛。
“嗯,OK,所以你怎么从这个表里获取一个元素?”
你头脑中的表达式如此美丽,就像在你脚踝边展开的一个红色地毯,就像昨晚的奥斯卡,你渴望着众多明星的亲吻;就像你在山峰漫步,呼唤你的爱人——月亮。
(defn nth [l n]
(when l (if (= 0 n)
(l true)
(recur (l false) (dec n)))))
“你能展示一个规则的列表吗?就想用 Python?”
你把自己的牙齿咬得嘎嘎响,双足在地板上跳舞,搞通了一台印刷机。现在你的双手布满了老茧,你的眼睑全是眼屎、黑眼圈和昏昏欲睡的困倦。每个行为都有代价,当然,对于功能函数而言,只会有单方面的影响。
(defn prn-list [l]
(print "(")
(loop [l l]
(if (nil? l)
(print ")\n")
(do (print (l true))
(when (l false)
(print " "))
(recur (l false))))))
没时间在这里描述变量、示例、文档字符串。在白板面试中,时间是核心。假设你是一个Haskell程序员, 像你的外祖母一样,继续她的工作。
user=> (prn-list (cons 1 (cons 2 (cons 3 nil))))
(1 2 3)
这时,面试官笑了,开始重新评价。我们之间至少很熟悉了,“因此,为了撤销掉,你可以……”
你抓住他的手,他的头脑像一个慌乱的松开的机械装置,轻柔地解开股票绦虫,四处瞥的心不适得其所,用古老的口音朗诵一首短诗。
(defn reverse [l]
(loop [r nil, l l]
(if l
(recur (cons (l true) r) (l false))
r)))
user=> (prn-list (reverse (cons 1 (cons 2 (cons 3 nil)))))
(3 2 1)
当你松开你的手时,他口吃却又礼貌地说起一些事情,紧接着拉紧风衣帽的拉链来保护冰霜的侵害。那里有另外的会面,但你不需要参与,以自己的名义发送一个十分金币。
他们当然会拒绝,从没有这样羞耻过,把缺少适合的文化作为原因。你消瘦的脸庞重新焕发出新机,随后消逝于窗户。这片地方从来不能限制你。