Web前端开发十日谈一直想写这篇“十日谈”,聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘。我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要。我一直认为自己是“初级”前端开发工程师,一方面我入道尚浅,只有短短几年,另一方面我自知对技术的钻研并不深入,可能是由于环境的原因,当然最重要的是,我幸运的参与到互联网崛起的浪潮之巅。时势造就了一批技能薄弱但备受追捧的“弄潮者”,这在很大程度上影响我们对“技术本质”的洞察力,多年来也一直未有成体系的“前端技术”布道佳作,以至于当下多数人对前端技术的了解,盖始于表述并不严谨的岗位招聘描述,而这正恰恰反映了Web前端开发对自身的模糊定位。对于很多Web前端工程师来说,初尝禁果的快感无法持续很久,就陷入一轮又一轮的迷惘,思索自己的职业规划,试图寻找到适合自己的成长道路、看清自身技能的瓶颈,寻找突破。但遗憾的是,Web前端技术被广泛接纳时日尚短,没有多少励志的成功样板可供遵循。然而情况不总是这么糟,毕竟Web前端技术是一门“技术”,和计算机科学系出同门,只是因为互联网的高速崛起而被蒙上了迷雾,遮住了双眼,让我们傻傻看不清时局。
那么,如何定义Web前端技术岗位边界?Web前端技术的价值体现在何处?前端工程师的价值仅仅体现在物以稀为贵吗?前端工程师的初级、中级、高级和专家之间到底如何界定?当前“我”处在什么位置?接下来的路子应当怎样走?何谓前端技术之“道”?我想多数人都思考过这些问题,本篇“十日谈”里的观点可能有些偏激,但抛砖引玉,读者权且把这些言论当作一个引子吧。
第一日:初尝禁果
万物生灵、阳光雨露盖源于造物之初的工开物,我们无法想象上帝创造光明之前的世界模样。但幸运的是,前端开发没有神祗般的诡魅。这个技术工种的孕育、定型、发展自有轨迹,也颇有渊源,当然,这非常容易理解。不严格的讲,在杨致远和费罗在斯坦福大学的机房里撺掇出Yahoo!时,Web前端技术就已经开始进入公众视野,只不过当时没有一个响亮的名字。从那时起,“基于浏览器端的开发”就成了软件开发的新的分支,这也是Web前端技术的核心,即不论何时何地何种系统以及怎样的设备,但凡基于浏览器,都是Web前端开发的范畴(当然,这个定义很狭隘,下文会提到)。
在20xx年之后浏览器技术渐渐成熟,Web产品也越来越丰富,中国有大批年轻人开始接触互联网,有一点需要注意,大部分人接触互联网不是始于对浏览器功能的好奇,而是被浏览器窗口内的丰富内容所吸引,我们的思维模式从一开始就被限制在一个小窗口之内,
以至于很长时间内我们将“视觉”认为是一种“功能”,Web产品无非是用来展现信息之用。起初的入行者无一例外对“视觉”的关注超过了对“内容”的重视,先让页面看起来漂亮,去关注html/css,沿着“视觉呈现”的思路,继续深入下去。因此,这类人是被“视觉”所吸引,从切页面入行,着迷于结构化的html和书写工整的css,喜欢简洁优雅的UI和工整的页面设计,之后开始接触视觉特效,并使用jQuery来实现视觉特效,以此为线索,开始深入研究Dom、Bom和浏览器的渲染机制等,html/css在这些人手中就像进攻兵器,而java script则更如防守的盾牌。
还有另外一群人从另一条道路接触Web前端,即工程师转行做前端,他们有较多的后台语言开发背景,从读写数据开始,渐渐触及浏览器端,接触java script库,起初是在html代码上加js逻辑,后来开始涉及html和css,他们喜欢OO、逻辑清晰、结构悦目的代码,更关注界面背后的“程序语言”和数据逻辑。html/css在这些人手中则更像盾牌,而java script更如进攻的兵器。
应当说这两类人是互补的,他们各自了解浏览器本质的一部分,一拨人对渲染引擎了如指掌,另一拨人则将JS引擎奉为至宝,其实任何一部分的优势发挥出来都能做出精品。大部分前端工程师都能从这两条渊源中找到自己的影子。但,这两类人的思维模式和观点是如此不同,以至于形成了一些不必要的对抗,比如在某些公司,干脆将Web前端技术一分为二,“切页面的”和“写js的”。这样做看上去明确了分工提高了效率,但他对员工的职业发展带来巨大伤害。在第二日“科班秀才”中会有进一步讨论。
我应该属于第二类,即在学校正儿八经的学习C/Java和C#之类,以为大学毕业后能去做ERP软件、桌面软件或者进某些通信公司写TCP/IP相关的程序。校园招聘时选择了中国雅虎,因为当年(08年)雅虎还是有一点儿名气,而且我听说雅虎比较算技术流的公司……自此就上了贼船,一发不可收拾。
在雅虎的这段时间,我有幸接触到一股正气凛然的技术流派,也形成了我对前端技术的一些基本看法,这些基本观点一直影响我至今。
【优雅的学院派】
当年雅虎的技术流派正如日中天,拥有众多“之父”级的高人,所营造出的Hack氛围实在让人陶醉的无法自拔,那段时间我甚至宁愿加班到深夜阅读海量的文档和源代码,感觉真的很舒服,我深深的被雅虎工程师这种低调务实、精工细琢的“服务精神”所打动,而这种不起眼的优秀品质很大程度的影响雅虎产品的用户体验和高质量的技术输出。那么,何谓“服务精神”?即你所做的东西是服务于人的,要么是产品客户、要么是接手你项目的人、要么是使用你开发的功能的人,所以技术文档成为伴随代码的标配。因此,工程师之间通过代码就能做到心有灵犀的沟通。这是工程师的一项基本素质,即,思路清晰的完成项目,且配备
了有价值的技术文档,如果你的程序是给其他程序员用的,则更要如此,就好比你制造一款家电都要配备说明书一样。因此,YDN成了当时最受全球程序员最喜爱的技术文档库,这种优雅务实的“学院气息”让人感觉独具魅力。
让人感觉奇怪的是,在中文社区始终未见这种学院派。甚至在具有先天开源优势的Web前端技术社区里也是波澜不惊,可见写一篇好的技术文案真的比登天还难。我所见到的大部分所谓文档索性把代码里输出数据的语句块拷贝粘贴出来,至于为什么数据格式要设计成这样、如果字段有修改怎么做、编码解码要求如何等等关键信息只字不提,或者开发者也没想过这些问题呢。因此,我们一直在强调代码的质量和可维护性,但一直以来都未见效,盖源于缺少这种“服务”意识的灌输。这种意识在下文中还会多次提到,因为它能影响你做事的每个细节,是最应当首先突破的思想纠结。
除了意识问题,另一方面是技术问题,即文笔。这也是工程师最瞧不上眼的问题,难以置信这竟然是阻碍工程师突破瓶颈的关键所在。我已看到过数不清的人在晋升这道关卡吃了大亏,很多工程师技术实力很强,但就是表达不出来,要么罗列一大堆信息毫无重点、要么毫无趣味的讲代码细节,不知云云。除非你走狗屎运碰到一个懂技术的老板,否则真的没办法逃脱码农的宿命。但大部分人还振振有词不以为然。而在Web前端开发领域情况更甚。前端工程师是最喜欢搞重构的,但在快节奏的需求面前,你很难用“提高了可维护性”、“提升了性能”这类虚无缥缈的词藻为自己争取到时间来搞重构,说的露骨一点,可能你真的对某次重构带来的实际价值无法量化,只是“感觉代码更整洁了”而已。我会在下文的“伪架构”中会展开分析前端工程师的这种浮躁献媚的技术情结。而这正是前端工程师最欠缺的`素质之一:用数据说话,用严谨科学的论据来支撑你的观点,老板不傻,有价值的东西当然会让你去做。
当然,情况不总是这么糟糕,我们看到中文社区中已经锻炼出了很多写手,他们在用高质量的文字推销自己的技术理念,这是一个好兆头,好的文笔是可以锻炼出来的。而在职场,特别是对前端工程师这个特殊职位来讲,这种基本技能可以帮你反思梳理需求的轻重缓急,从凌乱的需求中把握七寸所在。因为当你开始认真写一封邮件的时候,这种思考已经包含其中了。
所以,雅虎技术的推销是相对成功和远播的。关键在于两方面,扎实的技术功底和高超的写手。而真正的技术大牛一定是集两者与一身,不仅钻研剑道,还能产出秘籍。这也是Yahoo!优雅的学院派气息的动力源泉。国内很多技术团体想在这方面有所建树,应当首先想清楚这一点。
【规范的破与立 1】
雅虎的技术运作非常规范,刚才已经提到,包括技术、组织、文化,一切看起来有模有样,也堪称标杆,自然成了国内很多技术团队和社区的效仿对象。一时间各种“规范“成风、各色“标准“大行其道,结果是质量参差不齐。
我们到底需要什么样的规范?雅虎的技术规范到底有何种魔力?以何种思路构建的规范才是货真价实的?规范有着怎样的生命周期?想清楚这些问题,能很大程度减轻很多Web前端工程师的思想负担,看清一部分技术本质,避免盲目跟风。
我们的确需要规范,但好的规范一定是务实的,一定是“解决问题“的。比如针对项目构建的DPL可以收纳公用的视觉元件以减少重复开发、规定某OPOA项目的事件分发原则以确立增量开发的代码惯性。反之,糟糕的规范却显得过于“抽象“,比如页面性能指标、响应式设计原则。另外,尽管他山之石可以攻玉,但拿来主义有一个大前提,就是你了解你的项目的关键问题,你要优先解决的是些关键问题,而外来规范正好能解决你的问题。因此规范是一本案头手册,是一揽子问题的解决方案,应当是“字典”,而不是“教程“。可见规范的源头是“问题”。所以,当你想用CoffeeScript重构你的项目时、当你想引入CommonJS规范时、当你想在页面中揉进Bootstrap时、当你打算重复造轮子搞一套JS库时、当你想重写一套assets打包工具时,想想这些东东解决了你的什么问题?会不会带来新的问题、把事情搞复杂了?还是为了尝鲜?或者为了在简历中堂而皇之的写上使用并精通各种新技术?
规范之立应当有动因,动因来源于项目需求,项目需求则来自对产品的理解和把握,这是Web前端初级工程师走向中级甚至高级的一次重要蜕变,软件工程领域早就有“架构师”角色,而架构师往往存在于项目需求分析和概设、详设阶段。我看到的情况是,Web前端工程师的思维过多的限制在“界面”之内,向前和产品需求离的太远(认为这是视觉设计师的事)、向后和数据逻辑又隔离开来(认为这是后台工程师该干的事),因此前端规范也大都泛泛,无关项目痛痒,成了玩具。
雅虎技术规范的优秀之初在于它们解决问题。所以,学习使用规范应当多问一句,“他们为什么这样做?”其实,想清楚这些问题时,脑海中自然形成了一种“遇山开山”的创造性思维。
如果说新技术的尝鲜缺少针对性,但至少满足程序员的某种洁癖和快感,那么“负担”从何而来呢?对于初学者来说,有价值学习资料可能只有这些规范,如果说规范价值不大,那又当从何入手呢?
刚才我说的不是依赖于规范,而是对规范的反思,摆脱规范灌输给我们的思维定势。新人们大概是看了Wiki中的很多指标、结论、实践,在做项目之初就附加了不少“八股式”的负担,甚至影响我们对项目关键需求和关键问题的洞察力和判断力,负担过重就无法轻装上阵,Wiki中提到的这些指标和规范是结论性的,是大量的实践之后得出的,也只有经历过大量实践才会真正理解这些结论,比如DomReady时间和http请求数是否有因果关系,http请求数增加是否真的会导致页面性能下降,什么条件下会导致性能下降?我们从那些条文和结论中无法找到答案。
举个具体的例子,Kissy刚刚出了DPL,也是一大堆结论,比如他的布局就采用了经典的双飞翼,使用容器浮动来实现,那么,这种做法就是不可撼动的“标准”吗?看看淘宝车险首页,布局容器齐刷刷的inline-block,只要顶层容器去掉宽度,布局容器自身就能根据浏览器宽度调整自然水平/垂直排列,轻易的适应终端宽度了。
再比如,淘宝旅行计划项目中的部署方式,也没有完全使用Loader管理依赖,而是将依赖层级做的很少,业务逻辑使用脚本来合并,这样就可以更容易在build环节加入语法检查和代码风格检查。
类似这种摆脱原有编程思维,有针对性的用新思路新方法解决问题的做法显然让人感觉更加清爽,编程的乐趣也正体现在打破常规的快感之中,小马曾经说过:“制造规范是为了打破规范”,万不要因为这些规范标准加重负担,导致开始做一个简单页面时也显得缩手缩脚,无法放开身手。大胆的动手实践,才能真正得出属于自己的“结论 “和“标准“,才会真正深刻理解那些“结论”的意义所在。代码写的多了,自然熟能生巧,也容易形成成熟的技术观点。
在这个过程中,我们唯一的对手是懒惰,惰于思考,就无法真正发现问题,自然形不成自己的观点。还是那句话,任何规范、方法、结论、实践都是为了解决项目中的问题的,所以,我们所接触到那些看似“八股文”式的规范标准也是为了解决某些问题而提出的,想清楚这些问题,理解方法论背后的“因“,内心自然有“果”。
因此,“着眼当下、对症下药”的品质就显得弥足珍贵了,比如,双飞翼布局方法是为了解决一套(html)代码适应多种布局设计,这里的布局相对于固定的产品来说也是固定的,而无针对终端的自适应(适用于移动端的榻榻米布局似乎还没有最佳实践)。这是双飞翼产生的背景,如今终端环境较之5年前已经翻天覆地,问题早已不在“多种布局”上,而在“终端适应“上,这才是我们面临的问题,需要我们给出新的技术方案。
所以,勤于思考,轻装上阵,大胆实践,勇于创新,发掘问题所在,实打实的解决(潜在)问题,这才是我们真正需要的能力。放下思维定势枷锁,也会有一种豁然开朗的感觉。
中国古代伟大的教育家孔子说过:“凡事预则立,不预则废”行之有效的学习计划是学习成功的第一步。
常常看到有些同学在做完作业后,不是东走走,西转转,就是东看看,西翻翻,似乎作业完成了,就万事大吉,没事可干了。这实际上是一种随遇而安的学习态度。这样做的原因,除了学习态度不够端正以外,很大程度上是没有为自己订个规划,学习缺乏计划性。
科学合理的学习计划对于中学生来说,具有如下几个方面的作用:
促进学习目标的实现
每一个同学都有自己长远的学习目标,而要实现目标,就必须脚踏实地,有计划有步骤地去学习,要从实际出发,安排好学习时间和学习内容。学习计划可以使自己的学习行动和学习目标有机地结合起来,每一项近期任务的完成都会使自己受到鼓舞,从而对学习产生一种潜在的动力,增强实现下一个目标的信心。这些在执行计划中受到的鼓舞和鞭策比来自家长和教师的表扬更及时,更有效。所以制定一个切实可行的学习计划,可以促进学习目标的实现。
可以磨炼意志
学习计划使学生的各项学习活动目标明确。在努力争取让自己的行动按计划进行时,由于学习生活的千变万化,常会出现一些意想不到的情况,影响着计划的执行,如临时性的集体活动、作业增多、考试临近等。这时不能急躁,不能呆板的照计划进行,而要及时调整自己的学习计划以适应变化了的情况。有时在计划实施过程中会出现困难,这时就要通过意志力去努力克服,排除诱惑,不断调整自己的行动,不偏离计划中既定的学习目标和任务,直到目标达成为止。在实施计划中,每克服一个困难,完成一个任务,就会在享受胜利喜悦的同时增强克服困难的信心和勇气。若由于计划的不周而暂时没有完成,要及时总结经验教训,修改计划,争取新的胜利。在成功和失败的交替过程中,意志力会得到锻炼和提高。
有助于养成良好的学习习惯
长期按学习计划办事,就会逐渐养成良好的学习习惯,使学习生活有规律。这种习惯平时表现在每天的时间安排和学习方法的运用上。
时间安排上一旦形成习惯,到时间起床,到时间就睡觉,该学习时就安心学习,到了锻炼时间就自觉的去锻炼,学习生活就会达到“自动”进行的境界。到了时间不去休息或锻炼,身上就不好受;到了时间不学习,心中就感到缺了点什么。
学习方法上一旦养成习惯,就会感到不预习就无法听好课,不复习就不能做好作业。这种良好的学习习惯会大大提高学习效率,提高学习质量。而这种良好的学习习惯是长期按照学习计划进行学习的结果。所以说,良好的学习习惯是学习计划和顽强意志的产物。
可以提高效率,减少时间浪费
好的学习计划把学习、休息和活动的时间进行了科学的具体安排。如果自己在学习的时间多玩了一会儿,就会是计划中的任务玩不成,而且由于学习顺序的渐进性,从而使计划中后面的多项任务受到影响。为了完成学习计划,一个用功的学生,不但不轻易浪费时间,而且在学习中十分注意效率。
由于学习计划有必要又大有好处,所以有计划的学习成为优秀学生的共同特点。学习好和学习不好的差别当中有一条就是有没有学习计划。这一点会慢慢显露出来的。
我的学习计划是:
一、进行自我分析:我们每天都在学习,可能有的同学没有想过我是怎样学习的这个问题,因此首先要自我分析。
1、分析自己学习的特点,可以仔细回顾一下自己的学习情况,找出特点。
2、分析自己的学习现状,一是和大家比,二是和自己以前过去比。
二、确定学习目标:1、每天每科各做10道练习题,并读书各15分钟。
三、科学安排时间:
1、早上6点起床并快速预习当天要讲的课;
2、回到学校在早、午读之前也要读书、看书、预习;
3、课间尽量复习上堂课老师讲的内容;
4、放学后要尽快回家,在吃晚饭前要尽量做适量的作业;
5、晚饭后一会儿必须重新开始学习;
6、睡觉前读一次数或背一次书。
以上是我的学习计划,我相信坚持不懈地走下去,终有一天会成功的!“相信自己,你将赢得胜利创造奇迹。相信自己,梦想在你手中这是你的天地。
目标不是什么花瓶,你需要制定计划,脚踏实地、有步骤地去实现它。通过计划合理安排时间和任务,使自己达到目标,也使自己明确每一个任务的目的。
促使自己实行计划
学习生活是千变万化的,它总是在引诱你去偷懒。制定学习计划,可以促使你按照计划实行任务,排除困难和干扰。实行计划是意志力的体现。坚持实行计划可以磨练你的意志力,而意志力经过磨练,你的学习收获又会更一步提升。这些进步只会能使你更有自信心,取得更好的成功。
有利于学习习惯的形成
按照计划行事,能使自己的学习生活节奏分明。从而,该学习时能安心学习,玩的时候能开心地玩。久而久之,所有这些都会形成自觉行动,成为好的学习习惯。提高学习效率,减少时间浪费。合理的计划安排使你更有效的利用时间。你会知道多玩一个小时就会有哪项任务不能完成,这会给你带来多大的影响。有了计划,每一步行动都很明确,也不要总是花费心思考虑等下该学什么。
如何制定编辑计划要考虑全面
学习计划不是除了学习,还是学习。学习有时,休憩有时,娱乐也有时,所有这些都要考虑到计划中。计划要兼顾多个方面,学习时不能废寝忘食,这对身体不好,这样的计划也是不科学的。
长远计划和短期安排
在一个比较长的时间内,比方说一个学期或一个学年,你应当有个大致计划。因为实际中学习生活变化很多,又往往无法预测,所有这个长远的计划不需要很具体。但是你应该对必须要做的事情心中有数。而更近一点,比如下一个星期的学习计划,就应该尽量具体些,把较大的任务分配到每周、每天去完成,使长远计划中的任务逐步得到解决。
有长远计划,却没有短期安排,目标是很难达到的。所以两者缺一不可,长远计划是明确学习目标和进行大致安排;而短期安排则是具体的行动计划。
安排好学习时间
常规学习时间指按学校规定的学习时间,主要用来完成老师布置的学习任务,消化当天所学的知识。而自由学习时间指除常规学习时间外的归自己支配的时间,你可以用来弥补自己学习中欠缺的、或者提高自己对某一学科的优势和特长、或者深入钻研一件有意义的事情。
自由学习时间的安排是制定学习计划的重点。抓住了和合理利用的自由学习时间,对自己的学习和成长都会有极大的好处。所以我们应该提高常规学习时间的效率,增加和正确利用自由学习时间,掌握自己的学习主动权。
对重点突出学习
学习时间是有限的,你的精力也是有限的,所以学习要有重点。在这里,重点一是指你学习中的弱科,二是指知识体系中的重点内容。只有抓住重点,兼顾一般才能取得更好的学习效率。
从实际出发来制定计划
制定计划,不要脱离学习实际,要符合自己现在的学习压力和水平。有些同学制定计划时,满腔热情,计划得非常完美,可执行起来却寸步难行。这便是因为目标定得太高,计划定得太死,脱离实际的缘故。
第 周计划 周一 周二 周三 周四 周五 周六 周日 6:00—6:40 6:0—8:00 第一节 第二节 11:25—13:30 第三节 第四节 第五节 第六节 20:55—22:30 22:30—23:00 23:00—01:00 计划完成情况 学习情况 社会工作 体育锻炼 生活状态 修养品行 一天总结