从WEB前端编程来说,通过2年左右的努力,很多人能够达到这个水平,但是,很大一部分人的编程能力也就止步于此。或限于产品的需求单一性,或限于需求开发的时间紧迫性,或限于人的惰性,能够完美地解决当前的需求就够了。
由于长期处于技术平台期,技术上得不到提高,通常这个级别的工程师会比较燥。技术上小有所成;或追求个人的突破;或追求产品差异性带来的新鲜感;或者只是想换个心情;因此很多此级别的工程师会经常换公司。
戒骄戒躁:
切勿以为自己能写一手漂亮的代码而自满;
切莫以为别人“尊称”你一声“大侠”你就以 “大侠”自居;
切莫以为自己积累了一些得意的代码就成了框架式开发。
细节决定成败,优秀的方案并不能保证最终的成功。还以“删除指定字符串”为例,原始字符串从格式上来看应该是了个URL链接,在去除“pn=0”之后,最末尾处留了一个尾巴“?”;如果原始字符串是“?pn=0&a=1”,去除“pn=0”之后 ? 和 & 两个符号紧贴一起,这更是明显的bug。
【进阶之路】
此阶段进阶之路就是:切勿心浮气躁;你不再被需求牵着走,而是你牵着需求走。注重细节,注意那些当前需求里没有明文给出的细节:代码性能的差异、运行平台(浏览器)的差异、需求的隐性扩展、代码的向后兼容等等。
再通读几遍HTML/CSS/JavaScript帮助文档。
我建议这个级别的工程师做一做WebTreeView控件,要求总节点量一万左右操作流畅,你的晋升之路就在这个控件的编码过程中。
四.【入微】
最强解决方案。你能够走在需求的前面,将当前需求里有的、没有直接提出来的、现在暂时没有但将来可能有的等等,及前端编程潜规则等各个方方面面都综合考虑,给出最优方案。以一招胜万招。
var str = "http://www.xxx.com/?pn=0"; // 删除指定字符 pn=0 // 我将这个字符串里所可能想到的各种情况都列举出来 var a = [ "http://www.xxx.com/VMpn=?pn=0"// pn= 可能出现在 ? 前 , "http://www.xxx.com/VMpn=?pn="// URL里允许pn 值为空 , "http://www.xxx.com/VMpn=?pn=0&a=1"// URL 里可有多个字段 , "http://www.xxx.com/VMpn=?a=1&pn=0"// 可能排在最后 , "http://www.xxx.com/VMpn=?a=1&pn=0&pn=1"// 可能有多个 pn 字段 , "http://www.xxx.com/VMpn=?a=1&pn=0&b=2"// 可能在中间 , "http://www.xxx.com/VMpn=?a=1&pn=0&pn=1&b=1" // 可能在中间成组 , "http://www.xxx.com/VMpn=?a=1&pn=0&b=1&pn=1" // 可能零星分布 ]; /* 需求的不言之秘: ? 若出现在字符串最尾则要去之 ? & 两个符号不可重叠 */ var reg = /((\?)(pn=[^&]*&)+(?!pn=))|(((\?|&)pn=[^&]*)+$)|(&pn=[^&]*)/g; for (var i = 0; i < a.length; i++) { alert(a[i] + "\n" + a[i].replace(reg, "$2")); }这个阶段已经不再追求一招一式,对你来说不是使用什么创新绝招解决需求,而是给出成熟稳重的方案,从根上解决问题。针对某个当前需求你的代码可能不是最优,但是针对此类的需求你的代码却是最优秀的代码。
【进阶之路】
很多WEB前端研发工程师在做了3-4年之后就会进入一个瓶颈期:产品开发需求是小菜一碟,没有新鲜的可以挑战的东西;代码开发中的稀奇的解题方法都已经尝试过。没有了可挑战的难题,失去了探索的激情,也就没有了再上升的动力,好不容易走过“入室”级别的人又会有八九成止步于此。或转做技术领导人,或转到其它的领域,或换公司。
这些人的上升之路在哪里呢?
这个阶段单单依靠技巧和数量的累积已经没有什么效果了,突破之路在第5层《化蝶》里会详细说明,我建议你在这个阶段末尾着重关注编程理论:面向对象/过程、代码组织形式、编译、代码规范、其它的框架设计等等。
我建议这个级别的工程师做一做WebEditor控件,不要求完整功能,但是该控件里的模块划分、代码组织、编程思想做到位,给出一个系统的解决方案。
五.【化蝶】
破茧重生,这个层次关注的是编程语言本身,而不再关心产品需求。什么是茧?产品需求就是茧。当你一招胜万招,打遍天下需求之时,你如果还拘泥于需求开发,那就是你限于茧中而不自知。要么就在这个茧里默默地老去,要么就破开茧获得新生。
还是以那个“字符串剪裁”的老例子:
/** * 在拼接正则表达式字符串时,消除原字符串中特殊字符对正则表达式的干扰 * @author:meizz * @version: 2010/12/16 * @param {String} str 被正则表达式字符串保护编码的字符串 * @return {String} 被保护处理过后的字符串 */ function escapeReg(str) { return str.replace(new RegExp("([.*+?^=!:\x24{}()|[\\]\/\\\\])", "g"), "\\\x241"); } /** * 删除URL字符串中指定的 Query * @author:meizz * @version:2010/12/16 * @param {String} url URL字符串 * @param {String} key 被删除的Query名 * @return {String} 被删除指定 query 后的URL字符串 */ function delUrlQuery(url, key) { key = escapeReg(key); var reg = new RegExp("((\\?)("+ key +"=[^&]*&)+(?!"+ key + "=))|(((\\?|&)"+ key +"=[^&]*)+$)|(&"+ key +"=[^&]*)", "g"); return url.replace(reg, "\x241") } // 应用实例 var str = "http://www.xxx.com/?pn=0"; // 删除指定字符 pn=0 delUrlQuery(str, "pn");