前言

  每年的三月到六月,都是招聘高峰,除了大量的应届毕业生涌入社会之外,还有一些工作了一两年尚未找到稳定归属感的人,也会开始投递简历,是的,基本都是在拿了年终奖之后。作为前端技术主管,有幸,或者说是不幸,我需要在这些投递过来简历的人中,耗费大量精力来筛选符合公司要求、团队发展、技术基础三方面条件的人选来,这不是一个容易的活儿。

  我不是一个擅长技巧的面试官,尽管公司HR也给我们培训过招聘的原则、技巧,但是真正的体验和感受,却是在做了大量面试之后自然而然悟出来的。常见的招聘要求中,基本都有“工作经验”的要求,而且都是以年作为单位,HR似乎比较迷恋这个数字,但是实际情况却告诉我,工作经验往往不是以年衡量的,甚至有些时候,跟时间没有关系。

  今天想要分享的一点,是关于“为什么你的工作经验不值钱”,或者“怎么样才能让工作经验值钱”,庸俗,却能让每个人提起精神。

  [注] 以下经验分享,仅仅适用于码农相关职位,其他职位可借鉴其思想,不可照搬。

开始

从一个小小的面试题目入手:

编写一个javscript函数 fn,该函数有一个参数 n(数字类型),其返回值是一个数组,该数组内是 n 个随机且不重复的整数,且整数取值范围是 [2, 32]。

如果愿意,请先暂停阅读文章,自己动手写一下这个函数,是的,老简单了。我可以等你五分钟。

~~~~~~~~~~~~~~~ 华丽的五分钟过去了~~~~~~~~~~~~~~~

现在假设你的工作时间为 y 年,经验系数默认为 1,即工作经验是:Y = 1 * y。从现在开始,以下的错误,你要是遇到了,请自行调整经验系数。

1、可用。

作为一段需要满足需求的代码来说,它最核心的、最低的要求就是:可用。

如果你没有产出一个函数( fn ),或者产生了语法错误,那就请设置 经验系数为 0,然后去面壁思过;

请将代码在控制台运行,并执行 fn(3),看看是否输出一个数组,数组中包含了三个随机且不同且在[2,32]的整数,如果不是,请将 经验系数 * 0;

一个参考的半伪代码是:

function fn(n){    //准备一个容器保存结果var arr = [];    //循环for(var i=0; i<n; i++){        //创建一个随机数var rnd = getRand(2, 32);     //检查是否重复if( checkInArr(arr, rnd) ){i--;}else{arr.push(rnd);}}return arr;
}

其中 getRand 、checkInArr 还另有讲究,后面会提到。当然思路和方法不止一个,后面也会提到。

有相当多的面试者,包括不少工作时间为2年以内的同学,都会在这一步犯错,非常遗憾。

2、健壮。

代码是否老道,过了“可用”这一关后,就开始见分晓了。所谓“健壮”,即最基本的兼容性处理、边界处理,异常处理、用户输入校验。很多时候,需求方不会明确告诉你这些逻辑怎么处理(在实际开发中,似乎也比较常见),但并不意味着你不需要处理。健壮的程序,一定会将这些兼容性、边界、异常、输入做处理,以保证核心功能的正确输出。当然,如果你的代码没有任何输入并不考虑兼容性(可能吗?)或者仅仅是内部函数,那这一步要求可以降低,并不意味着你可以完全不做。

好,回过头看代码:
如果你没有对 n 的取值范围做校验(n必须是 1 到 31 之间的整数),请将 经验系数 * 0.3;
如果你没有对 n 是否为数字做校验,请将 经验系数 * 0.5;
如果你没有对 n 是否存在做校验,请将 经验系数 * 0.7;
如果上述校验都做了,但是没有校验对,请将 经验系数 * 0.9;你需要多练习,仔细认真的。

一个参考的半伪代码是:

function fn(n){//健壮性校验if(!isThere(n)) return;if(!typeOK(n)) return;if(!rangeOK(n, 2, 32)) return;//核心功能同上,此略  ...}

有了这些健壮性校验后,妈妈就不用担心 fn 函数死循环、语法错误以及错误的API调用了。伪代码中,校验是分为三步的,但实际代码中,完全可以合并处理,但是逻辑不能少。

3、可靠。

大多数面试者都止步于前两关,鲜有进入第三关的:可靠。javascript没有强数据类型,函数的返回值也无法强制返回的数据格式。但是作为“可靠”的要求,尽可能在任何情况下,都返回一个可靠的结果,哪怕是异常情况下。是的,这一步很简单,几乎不耗费几个字节的代码,但是会让 fn 的返回值变得可靠:

function fn(n){//健壮性校验if(!isThere(n)) return [];if(!typeOK(n)) return [];if(!rangeOK(n, 2, 32)) return [];//核心功能同上,此略
  ...
}

如果你留意到并处理可靠返回值的问题,那请将 经验系数 * 1.2;

另外,一个牵涉的话题就是:异常情况下,是否要抛出 Error,或 console.error ?关于这个话题,似乎没有定论,需要自己衡量。我的观点是:如果异常情况下不会造成太大影响的话(包括定位错误),就不用抛错或提示。但同样的,这个衡量仍然是经验性的。此处不再展开讨论。

4、宽容。

如果在你的日常开发中注意“可用”、“健壮”、“可靠”原则的话,你的工作经验就会大于你的工作时间,也就会更容易受到重视,自己所挖的坑就会少。而我近期面试的人中,甚至包括5、6年工作时间的,几乎都止步于此。

如果你要想成为一个受欢迎的技术人员,“宽容”是第一步:对需求宽容、对用户宽容、对调用者宽容、对维护者宽容

回到代码,
如果 n 是一个字符串数字,是否可以允许进入处理流程? 如果是,请将经验系数 * 1.1;
如果 n 是一个含有小数的数字,比如 3.000001,是否允许进入处理流程?如果是,请将经验系数 * 1.1;
你的代码中,是否有足够多且清晰的注释? 如果是,请将经验系数 * 1.2;
如果需求调整了 [2, 32] 的范围,你的代码是否可以快速调整,甚至不用调整? 如果是,请将经验系数 * 1.2;

一个参考的半伪代码是:

/*** 获取指定个数的随机整数,整数范围[2,32]* @param  {number}   n 需要的整数个数* @return {array}  返回包含n个整数的数组,如果n非法,则返回空数组*/
function fn(n){//将整数取值范围作为变量提取出来var min = 2, max = 32;//参数校验if(!isThere(n)) return [];if(!typeOK(n) && !isOKStr(n)) return [];n = formatInitNum(n);if(!rangeOK(n, min, max)) return [];//准备一个容器保存结果var arr = [];//循环for(var i=0; i<n; i++){//创建一个随机数var rnd = getRand(min, max);//检查是否重复if( checkInArr(arr, rnd) ){i--;}else{arr.push(rnd);}}return arr;
}

5、精益求精。

恭喜你完成了前四关,如果你在实际开发中,时时刻刻留意这些原则,这足够让你的工作经验扩大化,并给你带来更多的认可,这些认可来自于需求方(或许是那个曾经非常蛮横的产品狗)、用户以及你的同事。但,不因该包括你自己,你还需要更进一步。

宽容是宽以待人,精益求精是严以律己。内外兼修才是高手。

上文做了一点伏笔,现在讨论 getRand 、 checkInArr 到底有哪些讲究:

getRand:

如果你不知道 Math.random() 返回 [0, 1) 的小数,请自行翻阅js手册;
如果你不知道怎么将 [0, 1) 等比放大到任意区间 [min, max),请慎重考虑是否合适做一个码农;

代码是类似这样的: Math.random() * ( max - min + 1 ) + min。[*] 请留意 max-min+1 做了一个向上的扩展,即[min, max+1)
现在的问题是:如果要取整数,是向上取整,还是向下取整?

如果你不假思索,就回答:“都行”,那你需要去面壁思过;
如果你略作停顿,回答: “取整方法会影响边界设置”,那恭喜你有一些进步;
如果你认真思考后,回答:“只能向下取整”,那你已经走在了高手的路上。

是的,只能向下取整,这涉及“随机”概率的分布问题,请为边界值仔细考虑一下。这里不再细述。

checkInArr:

Array.prototype.indexOf 是优先方案,除非你考虑IE6(当然也可以用垫片函数给IE6加上这个indexOf);
用 map 来作为key查询代理,这个方法简单高效,兼容性也非常好;
最不济,自己for循环。

好了,
这些方案有性能差异吗?
差异的分水岭在循环多少次的情况下出现?
不同浏览器表现如何?
能否写一个性能测试脚本,把不同方案跑上 10000 次看看?
创建一个包含 2... 32的数组,然后乱序排序( Array.prototype.sort )后,直接取前 n 个整数,是不是更高效?

还有,
返回的数组要不要控制一下排序?
当 n 大于 31 时,是要返回空数组,还是全部31个数字?
当 n 为 30 的时候,遍历30次(或更多),是不是不如直接随机去掉一个更简单、更高效?

这些,就交给你了。

当你将这五个原则(可用、健壮、可靠、宽容、精益求精)变成你自己的开发习惯,你的工作经验就跟你的工作时间没有关系了。

6、one more thing.

乐于分享,也是一个好同学的必要素质。觉得本文还不错的,请点赞、转载,让更多人受益。
原文在这里:http://www.cnblogs.com/zjcn/p/5358059.html

转载于:https://www.cnblogs.com/zjcn/p/5358059.html

为什么你的工作经验不值钱相关推荐

  1. 你的工作经验到底值钱吗?

    由于我的公众号受众里有很多刚入门的.转行的.接近毕业的大学生等,所以,我一直致力于帮助 不知所措的"新人"开辟道路,指引方向. 由于是自媒体微信,所以一些纯技术性的文章,在这里真的 ...

  2. 为什么你的前端工作经验不值钱?

    本文转载自网易实践者社区 作者:马超(网易高级前端技术经理) 每年的三月到六月,都是招聘高峰,除了大量的应届毕业生涌入社会之外,还有一些工作了一两年尚未找到稳定归属感的人,也会开始投递简历(没错,基本 ...

  3. 【回顾九月份第一周】 为什么你的前端工作经验不值钱

    原链接:http://bluezhan.me/weekly/#/9-1 1.web前端 JavaScript 函数式编程术语大全 SegmentFault 社区访谈 | Linxz:只会写 CSS 不 ...

  4. 没有工作经验,没有的究竟是什么?

    接着前面的聊,我说:作为没有经验的求职者,到了一定的程度,缺的就是"工作经验",再继续"学习",解决不了问题. 为什么呢?为什么这么多社招的单位都要求" ...

  5. 帮公司面试了一个30岁培训班出来的程序员,没啥工作经验...

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  6. 网吧技术主管工作经验

    网吧技术主管工作经验 一般来讲,在接手一家250台电脑以下规模的网吧时,1般都在5天内把网吧各种问题及机器配置都了解好了,做到心中有底了!第6天就可以动手作新系统母盘,视网吧大小,150台以下只需3天 ...

  7. 程序员:“我有三年测试经验” “不,你只是把一年的工作经验用了三年”

    最近看到很多软件测试由于公司裁员而需要重新求职的.他们普遍具有4年甚至更长的工作经验.但求职结果往往都不太理想. 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续 ...

  8. 面试了一个34岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  9. 面试了一个32岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验....

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

最新文章

  1. Not injecting HSTS header since it did not match the requestMatcher HSTS设置问题解决
  2. 中秋节,送上一次非常有趣的SQL优化实战经历
  3. 世界人工智能大赛来了!
  4. VTK:PolyData之CopyAllArrays
  5. linux(CentOs6)下jdk安装,mysql安装,tomcat安装,及web项目部署
  6. oracle高资源消耗sql,Oracle高资源消耗SQL语句定位
  7. 容器编排技术 -- Kubernetes StatefulSets
  8. ktor框架用到了netty吗_Netty系列相关面试题汇总
  9. linux中vi编辑器(转载)
  10. 20190917:(leetcode习题)将有序数组转换为二叉搜索树
  11. 后台数据量太大传输慢_哪些因素会导致慢查询?
  12. Error: Rule can only have one resource source (provided resource and test + include + exclude)...
  13. 项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(二)
  14. 李宏毅2022《机器学习/深度学习》——学习笔记(1)
  15. 2019 最烂密码排行榜大曝光!网友:已中招
  16. oracle imp exclound,Ce este o bază de date cloud | Oracle România
  17. 互联网乱弹之毒在何方?
  18. python使用pandas中的to_json函数将dataframe数据写入json文件中
  19. 【震惊】超市不能说的N个秘密:你已在不知不觉中上当
  20. PHP系列之集成Ajax实现登录验证

热门文章

  1. linux连接小米随身wifi密码忘记了,小米wifi管理员密码忘记了怎么办?
  2. 服务器用户没有读取权限,Windows找不到文件或没有读取权限怎么办
  3. 开发log4j配置_Spring 使用 Log4J 记录日志
  4. php把单词切割成数组,PHP – 将单词分解为数组
  5. c语言相邻字符串字面量,C语言预处理#运算符的细节
  6. php偶尔500,python – 偶尔500错误
  7. mysql 生成json,结合CONCAT()和COALESCE()在MySQL中生成JSON
  8. date数据类型的正确格式_说说数据类型 上篇日期
  9. mysql timestamp 更新_[mysql] timestamp自动更新和初始化
  10. MySQL面试题 | 附答案解析(七)