从一道面试题谈起,大厂到底看重程序员的什么能力?
架构师之路
共 2373字,需浏览 5分钟
· 2020-06-29
唐磊,他谦逊的自我介绍,是“在阿里云打工的清华学渣”。
上周的一篇《字符串比较,居然暗藏玄机》,我最早是在唐磊《这10行比较字符串相等的代码给我整懵了》里看到的,我用通俗的语言,展开了“密码破解”案例。文末却没有提引用的出处,这里和唐磊道个歉。
看了唐磊的其他一些文章,源于一线,深入细节,不禁想起了4-5年前提笔写技术文字的自己。
希望他的好文被更多热爱技术的小伙伴看到,这里转一篇唐磊的好文。
文章:《从一道面试题谈起,大厂到底看重程序员的什么能力?》
这是我在面试过程中,经常问的一道题。一起看看,一起动笔试试吧。
实现一个函数,完成开根号的操作:
double sqrt(int v, double t)
要求:(1)不能调用系统库函数,例如 Math.sqrt(v);(2)假设计算出的结果为 r,要求满足这个条件: ,其中 是真实的值, t 为给定的一个误差范围,例如0.1等,即你计算出的值要在给定的误差范围内; 画外音:例如,调用你的接口 sqrt(9, 0.21) 返回值属于 [2.79, 3.21] 这个区间就行。你可以拿出笔和纸,尝试解答一下。画外音:leetcode上遇见过类似的也没问题。
面试官:有什么思路吗?可能候选人内心在骂你:出这样的题目是不是有病啊,明明有 lib 函数可以直接用的。
求职者:没有啊。
我想说的是,面试,并不在于题目本身,而是以题目为抓手,考察候选人在分析问题和解决问题的能力,以及在交流过程中,所体现的理解能力,逻辑能力和思维方式,当然,也会从 Code 中考察候选人的编程习惯与编程风格。
此时,我会引导候选人:
面试官:根号10等于多少?这里是希望提醒候选人,要先解决,再优化。在实际工作场景也一样,先思考解决问题的方法,再考虑优化。
求职者:3点几吧。
面试官:你怎么知道是3点几?求职者:9开根号是3,明白了,我再想想……
暴力搜索法面试过程中,很多人能回答到这一步:先用一个循环找到 r,使得 r^2 是离给定 v 最近的平方数,即你希望算根号10 ,先找到3,因为3^2=9 。然后再用一个循环, 每次 r+=t ,直到 r^2 > v 为止。
面试官:这是一个可行的方案,但如果精度要求很高,v 也很大,如 sqrt(v = 10000000, t = 0.000001) 之类的,效率不会很低么?其实,在与候选人的不断交流中,可以看出候选人的理解能力,与解决问题的能力,这本身也是面试过程中的一部分。
求职者:可以这样优化,比如设置一个步长,一次迭代后,如果没有达到预期,可以不断修改这个步长来增大逼近真实值的速度,比如10倍误差,100倍误差等。
面试官:恩,这样做确实可以优化。但从本质上讲,该题目其实是在一个有序的列表里,去搜索满足条件的特定的值。除了你说的线性搜索,还有其它方法吗?
求职者:二分搜索?
面试官:借助二分的意思就是,比如算 根号10,搜索范围是 [0, 10]:
- 因为5^2 = 25 > 10 , 所以 r 属于[0, 5)
- 因为(5/2) ^2 = 6.25 < 10 , 所以 r 属于 (2.5, 5)
- 因为(3.75^2 = 14.0625 > 10) ,所以 r 属于 (2.5, 3.75)
- ...
求职者:明白了。
能写出二分,作为一线开发者基本就不成问题了。
但很多人都喜欢用递归写,却容易遗漏递归里的结束条件。所以一般情况下,代码写完后,我会让候选人自己写测试用例。
面试官:假设这个接口是别人写的,应该从哪几个角度去测试?为什么要别人提示要测试用例,才去 check 自己写的代码的正确性呢。
求职者:sqrt(-4, 0.21),哎呀,我这里忘了判断了。改一下代码。
求职者:sqrt(0, 0.21),sqrt(4, 0.21) 还有问题,再改改。
面试官:……
能够到达这一个步骤的人已经较少了,如果你有较全测试用例和边界条件的判断,再加上后面的结束条件能够正确,基本上这道题目就算满意了。
关于结束条件本质上讲,这个算法就是一个迭代逼近的过程,用二分的思路后,关键就在于什么时候结束。 题目中已经给了误差条件 ,难点在于其中的不知道,不太方便直接进行计算判断。不少人用一个另外的结束条件来进行了判断即: ,额,这一样吗?
其他解法当然本题还有一些其他的数学解法,例如用牛顿迭代法,梯度下降法,泰勒公式展开等等。如果候选人能想到这些,说明他还是有一定数学基础的,可以让他讲讲。
结语其实,上面大部分内容只谈到了这道题目本身,也穿插了一些对这道题目的分析和理解,这样的题目考察校招的同学会比较合适。 但类似的题目,社招完全不适用吗?社招的的同学,写不出来就有很充分的理由吗?
或许你在工作场景中不会遇到实际这种题目,但我其实想表达的是,作为一线的工程师,在面试官讲解了二分算法,并且自己也能理解的情况下,写出相关的 Code ,真的很过分吗?
在日常有些场景下,“复制粘贴”工程师貌似也够用,遇到问题,叫更高水平的人来帮你,这样的话,你的核心竞争力在哪里?
我建议一线的程序员们,应该对基本的数据结构和算法有所了解,对常见的算法复杂度有所了解。这样的要求,不高吧。
之前遇到过一些候选人,Java 开发七八年经验了,却不清楚 ArrayList, HashMap 内部是怎么做的。还有些候选人,口头表达头头是道,结果落实到写代码就根本下不了笔。
希望我们不要抛弃一些基础的东西,多培养一下我们的编程素养,在用编程语言,利用各种工具来实现我们想要达到的目的的时候,能做到“知其然,知其所以然”。
==全文完==程序猿石头
希望大家有收获,欢迎扫码,关注这个“在阿里云打工的清华学渣”。
评论
了解加密货币到加密货币的互换
1、什么是加密货币互换?加密货币到加密货币的互换是指以现行市场汇率将一种加密货币直接兑换为另一种加密货币。与需要法定货币存款和较长流程的传统交易所不同,加密货币到加密货币的互换可以无缝地促进交换。掉期在提高加密货币的流动性和效率方面发挥着重要作用。该功能使用户能够将他们的加密货币与钱包中的其他代币进
区块链头条
0
李彦宏:开源大模型不如闭源,后者会持续领先;周鸿祎:“开源不如闭源” 的言论是胡说八道
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁0、李彦宏:开源大模型不如闭源,后者会持续领先当今
源码共读
0
【第129期】程序员的新宠:三款终端工具,让你告别Xshell!
概述 WindTerm:跨平台的SSH利器 首先介绍的是WindTerm,这是一款使用C语言开发的跨平台SSH客户端。它不仅完全免费,而且没有商业使用的限制。WindTerm支持SSH v2、Telnet、Raw Tcp等协议,而且性能出色,甚至超过了FinalShell和Electerm。功能
前端微服务
0
字节员工:35岁以后被裁员的,后来都走了哪条路?现在2-2,要不要利用最后一年拼命上个岸。
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁在当今竞争激烈的职场环境中,年龄并不总是一个决定性
源码共读
0
美国司法部重判币安创始人CZ,他到底做错了什么?
注:4月24日,美国司法部表示币安创始人兼前首席执行官赵长鹏应在监狱服刑三年(36个月),根据给出的理由显示,美国司法部律师认为赵长鹏帮助币安违反联邦制裁和洗钱法,并称其必须付出更大的代价,所以应该提高刑期。就在审判前,CZ在写给负责此案件的法官理查德· A · 琼斯的一封信中,为自己的「错误决定」
区块链头条
3
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0
上班的时候,有一群摸鱼搭子非常重要...
上班的时候,有一群摸鱼搭子非常重要!一到上班时间,他们就从四面八方涌进群里冒泡...从八卦聊到股市、从职场聊到乌X兰局势,偶尔还会复读、相亲、battle...然后,下午6点钟准时消失不见...所以你要不要加入我们一起摸鱼?我们有北京、上海、深圳、广州、杭州、武汉、成都、南京等8个城市的摸鱼群,还有
产品经理日记
0
周四002 瑞超:同样落寞的境遇——北雪平vs埃尔夫斯堡
上赛季最终排名联赛第9的北雪平本赛季伊始表现不佳,4轮战罢他们仅以1胜1平2负的战绩排在倒数第三,这支历史上曾夺得13次联赛冠军、6次杯赛冠军老牌劲旅,正如英格兰赛场上的一众百年俱乐部,在低谷中不断探索着出路。球队主教练安德烈亚斯·阿尔姆曾是AIK索尔纳及赫根队的主教练,他于今年年初刚刚拿起球队教鞭
产品与体验
0