zoukankan      html  css  js  c++  java
  • 【转】为什么你的前端工作经验不值钱?

    转自:http://www.weidu8.net/wx/1000148883336536

    前言

    每年的三月到六月,都是招聘高峰,除了大量的应届毕业生涌入社会之外,还有一些工作了一两年尚未找到稳定归属感的人,也会开始投递简历(没错,基本都是在拿了年终奖之后)。

    作为前端技术主管,有幸,或者说是不幸,我需要在这些投递过来简历的人中,耗费大量精力来筛选符合公司要求、团队发展、技术基础三方面条件的人选。

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

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


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

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

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

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

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


    可用

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

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

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

    一个参考的半伪代码是:

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

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


    健壮

    代码是否老道,过了“可用”这一关后,就开始见分晓了。

    所谓“健壮”,即最基本的兼容性处理、边界处理,异常处理、用户输入校验。很多时候,需求方不会明确告诉你这些逻辑怎么处理,但并不意味着你不需要处理。

    健壮的程序,一定会将这些兼容性、边界、异常、输入做处理,以保证核心功能的正确输出。当然,如果你的代码没有任何输入并不考虑兼容性(可能吗?)或者仅仅是内部函数,那这一步要求可以降低,并不意味着你可以完全不做。

    好,回过头看代码:

    • 如果你没有对 n 的取值范围做校验(n必须是 1 到 31 之间的整数),请将 经验系数 * 0.3;

    • 如果你没有对 n 是否为数字做校验,请将 经验系数 * 0.5;

    • 如果你没有对 n 是否存在做校验,请将 经验系数 * 0.7;

    • 如果上述校验都做了,但是没有校验对,请将 经验系数 * 0.9;你需要多练习,仔细认真的。


    可靠

    大多数面试者都止步于前两关,鲜有进入第三关的:可靠。

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

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

    另外,一个牵涉的话题就是:异常情况下,是否要抛出 Error,或 console.error ?

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

    宽容

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

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

    回到代码:

    • 如果 n 是一个字符串数字,是否可以允许进入处理流程? 如果是,请将经验系数 * 1.1;

    • 如果 n 是一个含有小数的数字,比如 3.000001,是否允许进入处理流程?如果是,请将经验系数 * 1.1;

    • 你的代码中,是否有足够多且清晰的注释? 如果是,请将经验系数 * 1.2;

    • 如果需求调整了 [2, 32] 的范围,你的代码是否可以快速调整,甚至不用调整? 如果是,请将经验系数 * 1.2;

    一个参考的半伪代码是:


    精益求精

    恭喜你完成了前四关!

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

    宽容是宽以待人,精益求精是严以律己。内外兼修才是高手。当你将这五个原则(可用、健壮、可靠、宽容、精益求精)变成你自己的开发习惯,你的工作经验就跟你的工作时间没有关系了。


    后续(自己的话)

    看了这篇文章真的是自惭形愧,将五个原则(可用、健壮、可靠、宽容、精益求精)用于开发习惯中,不是件易事。将自己的代码依据五个原则改后贴上,以此警示自己。(如果代码中有不好的地方欢迎提出来,指教一下。)

    文章中涉及到的去重的算法,可以 点击这里

    /*
    		* 返回一个指定大小,指定范围的数组
    		* @param {num}: 返回数组的大小
    		* @parma {rage}:(可选)返回数组的范围【要求传入由两个元素组合而成的数组】
    		* @return {array} 返回包含num个证书的数组,如果不符合要求,返回空数组
    		*/
    		function returnArr(num,rage){ 
    			// 如果没有指定返回数组的大小,默认[2,32]
    			var rages = rage || [2,32]; 
    			var n = parseInt(n);
    
    			// 判断n是否存在||n是否大于0||n是否是数字(字符串数字可通过)
    			if(!n || n <= 0 || isNaN(n)){
    				console.log("请输入正确的返回数组个数!");
    				return [];
    			}
    
    			// 判断范围是否是数组||是否存在范围||是否为两个元素||元素是否为数字(字符串数字可以通过)
    			if(!rages instanceof Array || !rages || rages.length !== 2 || isNaN(parseInt(rages[0])) || isNaN(parseInt(rages[1])) ){
    				console.log("请输入正确的范围(必须是由数字组合的有两个元素的数组)");
    				return [];
    			}
    
    			//返回数组的最大限度
    			var maxLen = rages[1]-rages[0] + 1;
    			if(n > maxLen){
    				console.log("返回数组个数不能大于"+maxLen);
    				return [];
    			}
    
    			// 临时对象,存储已存在结果数组的标识
    			var temp = {};
    			var result = [];
    
    			for(var i =0;i<n;i++){
    				// 获取限定范围的随机数
    				do{
    					var ans = getRanNum(rages);
    				}
                                 while(!!temp[ans])
    
    				temp[ans] = true;
    				result.push(ans);
    			}
    			
    			return result;
    		}
    
    		/* 
    		* 获取一个随机数
    		* rage:随机数的范围
    		*/
    		function getRanNum(rage){
    			var rageFrom = parseInt(rage[0]); 
    			var rageTo = parseInt(rage[1]); 
    			var ranRage = rageTo-rageFrom; 
    			return Math.round(Math.random()*ranRage + rageFrom );
    		}
    

    以上内容,如有错误请指出,不甚感激。

  • 相关阅读:
    Codeforces Round #696 (Div. 2) A
    软件体系结构期末复习
    LINUX 下配置 redis
    2020-09-30 刷题记录
    2020-09-29 刷题记录
    Codeforces Round #673 (Div. 2) A
    2020-09-26 刷题记录
    2020-09-25 刷题记录
    C++ 类虚函数实现原理的验证(指向包含类虚函数地址的数组的指针)
    Saleae8 与 SaleaeLogic、PulseView上位机的使用
  • 原文地址:https://www.cnblogs.com/adelina-blog/p/7497594.html
Copyright © 2011-2022 走看看