引用:
引言:
我现在的工作首先是一个Coder,接着是一个小小的DM。为什么这么说?我所在的私企,技术部的管理者并不是全做管理的,也要承担很多的实际开发工作。我并不是什么技术大牛儿(但我并不放弃成为大牛儿的梦想,嘿嘿~~),我只希望把我工作中的学习成长体会与大家分享。
本人06年毕业,做了半年的Coder之后,07年1月走上部门管理岗位,给自己的感觉是走得太快,这对我来说这不一定是什么好事。可当我这一年多的管理走下来,无论在技术上还是管理理念上都有一个质的飞跃,正要做的是实行。首先作为一个技术人员先不妄谈管理,只说一下自己在工作中的成长理念:以点带面,体系成才。
大学毕业将近两年了,是在忙碌开发中度过的两年。在IT技术突飞猛进的今天,两年算是一个很长的时间。回头看看,我们的耳边出现了多少新词汇:web2.0、AJAX、RIA、重构、多核心CPU、IPOD、IPHONE……;我们又接受了多少新观念,用户体验、深入研究“小白”的需求、网络社交群体…..
当我们把这些新名词儿挂在嘴边的时候,当我们投身于忙碌的工作中的时候,不知道大家心里的感觉如何?是下面这些吗?
感觉落后于时代而心里发虚?
怀念校园宁静的学习时光?
感觉青春短暂而期待转行?
满腹牢骚抱怨,感觉英雄无用武之地?
无限迷茫,不知路在何方?
感觉刚从一个围城里出来,又进入了另一个围城?
如果是这样,我们不禁要问:你刚开始的激情和干劲儿哪去了?难道岁月和生活磨练的结果是一支老油条吗?难道我们就不能跳出围城怪圈吗?
问题的答案需要从自身找,问问自己:应该如何评价学生时代?什么叫学习?兴趣在哪里?我能创造多少价值?我要成为什么样的人?
在课本里我们接触最多的先决条件是:“在理想状况下……”,而学生时代本身就是实际生活的理想状况。理想状况让我们学会了做梦,让我们结识了许多会做梦的人,给了我们发挥的基础框架和平台。简单一点儿说:学生时代学到的知识、结识的人是将来走向社会的基础,就像Microsoft开发了windows平台,我们可以在其平台的基础上开发自己的软件一样。贴切一点儿说,我们自身就像OOP中的一个类,在学校里被添加了X个属性Y个方法(技能),完工之后被贴上一个标签扔进了社会的大机器中。看看表现吧,按照理想的蓝图实例化出一个对象来。一运行,结果如何?不兼容、耗费资源过大、死循环、宕机……表现完美?那是不可能的。
尽管会遇到这样那样始料未及的问题,由于看不惯这样那样的现象而被认为清高自大,但是我们不能因此把原因归咎于学校教育,不能低估学生时代的价值,至少有两点值得肯定:你敢做梦了也会做梦了;为你搭了一个简陋的舞台还送给你一张出场证。我深信在社会的汪洋里灌够了水之后,你会怀念学生时代。
一旦进入社会,就要靠你自己登台表演了。当你被矿泉水瓶子易拉罐砸下台来的时候,当你听到全场嘘声的时候……(呵呵~~现实情况也许不会这么糟^_^),希望你不要沮丧不要迷茫,想想一个毛儿都没长全小屁孩儿是怎么学会走路的吧,虽然那不在你的记忆里,但是那确实是曾经的自己。一切,才刚刚开始……历史和传奇会不断的在生活中重演。
对还在角落里默默爬代码的我们来说,需要学习的更多,日复一日的工作并不是毫无意义,而我们也无时无刻不在学习之中。与其因重复的工作而厌倦,莫如让每日的生活与众不同;与其为工作而工作,莫如把它变成自己的工作;满腹的抱怨只会让这段路程毫无收获,并把老本儿赔得精光。有一份求知的心态,一份实践的心态,因为社会是让我们在体验中成长的大课堂。
我现在的工作首先是一个Coder,接着是一个小小的DM。为什么这么说?我所在的私企,技术部的管理者并不是全做管理的,也要承担很多的实际开发工作。我并不是什么技术大牛儿(但我并不放弃成为大牛儿的梦想,嘿嘿~~),我只希望把我工作中的学习成长体会与大家分享。
本人06年毕业,做了半年的Coder之后,07年1月走上部门管理岗位,给自己的感觉是走得太快,这对我来说不一定是什么好事。可当我这一年多的管理走下来,无论在技术上还是管理理念上都有一个质的飞跃,正要做的是实行。作为一个技术人员首先不妄谈管理,只说一下自己在工作中的成长理念:
以点带面,体系成才。什么意思?
以点带面
不要奢望工作中还有让你静下心来天天学习的环境,要做的是:天天捡珠子捡贝壳,合适的时机,把它们用线穿起来做成一条精美的项链。
珠子是什么样的珠子?首先你要识别,别说菜到连自己需要什么都不知道。
线是什么样的线?可能是自己的实践、可能是一本书、也可能是一个项目。
比如:网站重构
在06年年初做兼职时接触到网站重构的概念,我看到它的优点(当然是有基础的,在大学,由于经济原因做过很多开发网站的兼职工作),开始有意识的在实际工作中留意相关知识并研究它们。在实践中不断的检验应用自己的成果,让自己不断获得鼓励与信心。经过一年相关知识的学习和实践,我的重构相关技术已经相当纯熟。
再如:深入研究Javascript
当用JS写的程序越来越像大程序的时候,我们应该能够看到它的未来:根据我的判断,它将是未来富媒体应用的一个重要组成,整体架构上会越来越趋向于支持更多的面向对象的特性。
实际工作中,当需要封装一个JS类(姑且这么说)的时候,你会为一些具体问题和概念苦恼:如何不破坏封装性又能够为HTML对象注册事件?如何在对象内部获得对象本身的引用?闭包是个什么东西?prototype?
想象遇到这样一个注册事件的问题:
熟悉的传统方法是这样的:
复制内容到剪贴板
代码:
<img id=”image” src=”” onclick=”test()” />但是有个问题,不能实现结构与逻辑分离,怎么办?找到了下面这种解决方式:
复制内容到剪贴板
代码:
window.onload = function(){
document.getElementById(“image”).onclick = test;
}可是这样不能注册多个监听器,怎么办?又找到了第三种解决方式:
复制内容到剪贴板
代码:
window.onload = function(){
document.getElementById(“image”).attachEvent(“onclick”,test);
}问题又来了,你发现第三种方式在firefox无法运行,你意识到代码的平台兼容性问题。那在firefox下是如何像第三种方法一样注册事件的呢?
addEventListener,对,就是它!于是有了第三种方式的改进版本:
复制内容到剪贴板
代码:
window.onload = function(){
var element = document.getElementById(“image”);
If(element.addEventListener){
element.addEventListener(“click”,test,false);
} else {
element.attachEvent(“onclick”,test);
}
}好了,现在第三种方法已经有了比较完美的解决方案.可怎么样才能让它更具有通用性和可移植性呢?研究之后,这样来做:
复制内容到剪贴板
代码:
function addListener(element,e,fn){
If(element.addEventListener){
element.addEventListener(e,fn,false);
} else {
element.attachEvent(“on” + e,fn);
}
}
window.onload = function(){
var element = document.getElementById(“image”);
addListener(element,”click”,test);
}这样,addListener函数就可以挪到别的地方用了,可是又遇到这样的问题:你要在事件处理函数内部获得EVENT对象与img对象,并处理它们,怎么办?
你开始意识到给test函数传参,那么如何做?改写test函数?
YES!可是你发现给事件处理函数传参是很困难的事情。
怎么办?
灵活运用以上三种事件绑定手段,并找到它们的特性。
对于第一种方式,直接传参就可以了。
复制内容到剪贴板
代码:
<script type=”text/javascript”>
function $(element){
if(typeof(element) == “string”){
return document.getElementById(element);
} else {
return element;
}
}
function test(e,which){
alert(e.type + “\n” + which.tagName);
}
</script>
<img id=”image” src=”” onclick=”test(event,this)” />第二种方式可以在事件处理函数内部通过this指针获得img对象的引用,可以通过全局的window.event和隐含参数arguments[0](Firefox)获取EVENT对象。
复制内容到剪贴板
代码:
<script type=”text/javascript”>
function $(element){
if(typeof(element) == “string”){
return document.getElementById(element);
} else {
return element;
}
}
function test(e){
e = e || window.event;
alert(e.type + “\n” + this.tagName);
}
window.onload = function(){
var Img = $(“image”);
Img.onclick = test;
}
</script>
<img id=”image” src=”” onclick=”test(event,this)” />第三种方式,EVENT对象是通过一个隐含的参数arguments[0](IE+Firefox)传递进事件处理函数的。在IE下无法通过this指针获取img的引用,在Firefox下可以。
写到这里,我们看看捡到了多少珠子和贝壳:代码分离、注册多个监听器、为事件处理函数传参、可移植性。随着捡到的珠子和贝壳越来越多,你会发现疑问没有减少,而是越来越多,这说明你已经似懂非懂了。这正是学习普遍的规律:你知识的外延越大,你的未知领域越大。这时,我们需要一条线把这些珠子串起来。这条线是什么?一些关于JS事件机制和事件对象的详细介绍。推荐大家去阅读:
http://bbs.blueidea.com/thread-2810877-1-1.html
也可以阅读我在博客里的注释版本:
http://hgx127.blog.163.com/blog/static/11066082008213104527721/
当我们将事件机制和EVENT对象搞清楚之后,我们可以写出下面的代码:
复制内容到剪贴板
代码:
<script type=”text/javascript”>
function $(element){
if(typeof(element) == “string”){
return document.getElementById(element);
} else {
return element;
}
}
function $E(e){
return e || window.event;
//跨浏览器和方便应用的考虑,我们可以在这里重写EVENT对象的许多属性。
//比如:
//事件目标对象的获取
//事件发生时鼠标的位置及相对位置
//鼠标键(左中右滚轮)等
}
function addListener(element,e,fn){
if(element.addEventListener){
element.addEventListener(e,fn,false);
} else {
element.attachEvent(“on” + e,fn);
}
}
function test(e){
e = $(e);
var element = e.srcElement || e.target;
alert(e.type + “\n” + element.tagName);
}
window.onload = function(){
var Img = $(“image”);
addListener (Img,”click”,test);
}
</script>
<img id=”image” src=”” onclick=”test(event,this)” />这样我们的“项链”具备了雏形,可以应付日常的事件处理需要。但是,我们应该满足吗?不,绝不是!我们还有相当多的问题没有解决,比如:
为什么在IE下第三种方式无法通过this指针引用事件目标对象?
如果我们需要向事件处理函数传递更多的参数应该怎么办?
如果我们要将上述代码封装进入一个类应该如何做?
如何让我们的代码具有更广泛的平台适应性?
……
搞懂了那些珠子和贝壳并简单连接之后,我们还可以做得更好吗?答案是肯定的。
但是该怎么做呢?保持上面的研究精神,现在我们需要借鉴:
对,去研究成熟的JS框架!看看大牛儿们是怎么处理事件的。比如:EXT、Prototype、Dojo、Mootools、Spry、Jquery…130多种呢,够研究一阵子的。(呵呵,不用研究那么多,这些框架之间都是有共性的,建议深入研究一两个就够了,其他的参考)
需要多说一点儿的是:不要清高得烟火不进,原创不是这么干的。什么是知识?把别人的东西掌握之后变成自己的就是我的知识(强盗精神,呵呵~~)。
研究过这些框架之后,我们才能知道差距在哪里。然后,我们学习大牛儿们的处理问题的手段,理解他们的编程理念,拓宽我们的知识面,Copy他们的编码风格,像他们一样做注释……
工作之中一点一滴的积累并有意识的整合是比较适合工作中的学习环境的。也是我说的以点到面的意义:一粒沙里瞰世界,掌握世界!秉着一份学习的心态来工作,常问问自己:“我还可以做得更好吗?” 这样会获得无限的动力,当在工作中验证了自己的研究成果时,你会有成就感,毕竟我们都需要鼓励与认可。在学习中也要学会自己奖励自己,不断的阿Q一下。告诉自己,现在的我可以默默无闻,但是有一天,我会成为大牛儿!甚至可以刷新历史!
这样坚持做下去,当你期待加入一个团队的时候,你会收到盛情的邀请,而不是在奢望中乞求别人送你一份工作;当你组建一个团队的时候,你的精神会感染里面的每一个人,会让这个团队朝气蓬勃,而不是人心涣散,搞成“将熊熊一窝”的垃圾团队。这是我们Coder的尊严,而尊严从来不是什么人给的,是我们的努力挣来的。
体系成才
曾经有这样一句话:“学好数理化,打遍天下都不怕!”,现在的你还指望学好某一项技术就能够打遍天下吗?不行了。要成为团队中优秀的一员是需要条件的,不仅仅是你会办事会说话,更多的是:你要有追求,你要有爱心,肯分享,并用行动来实践证明;而不是处处表现自己多牛×,在什么什么地方贡献最大,那样只会让人瞧不起。
我们应该追求在团队中独当一面;只要能够,去关心和帮助团队中所有的人;放开心胸分享收获的喜悦,失败的教训。
拿技术上的追求来说:要对所学的知识有一个清晰的认识。比如你非常精通JS,你需要知道的不仅仅是它有哪些用途,还要明确:它在前端技术中处于什么样的位置,它将来可能走向何方。
当通过以点带面的方法精通某一技术的时候,我们这些默默无闻的Coder们要有更高的视野。
在两年前,还没有几个人知道前端开发工程师是个什么玩意儿,可是现在你去看看前端工程师的招聘广告都需要哪些能力?如果目标是成为一名合格的前端工程师。那么,就需要以前端领域的某项技术为起点,将自己的知识面辐射进前端开发的相关领域。你要懂的不仅仅是一点,而是掌握一套体系。这应该成为想做前端工程师的朋友的努力方向。更高的目标是:你在这一领域中应该占据什么样的位置。
我们不断去追求卓越,不断的去拓宽视野,不断的尝试实践,那Coder们就没有必要去迷茫,没有必要去为工作的前途担心。成为某一领域的优秀人才不是所有人都能做到的,请坚信你我会是其中之一。
即使你不能在某一领域面面俱到,请不要忘记你是生活在一个团队,一个群体之中。这个群体可以赋予你三头六臂,一个有大牛儿潜质的人不能成为孤家寡人。只要你用心发现,里面的每个人都很可爱,都值得你去感激去珍惜。
如果我们这样做了,那可以期待的是:在不久的将来,当我们到30岁35岁的时候,我们不会为工作而担心,也不会为转型而苦恼。一个Coder的价值才得到完整而又真实的体现!
这就是我说的体系成才:不在某项技术上固步自封,将你的技术拓展到一个领域,打出一套组合拳!
将近两年以来,我的大部分时间都是在紧张的开发中度过的。两年中,既从事技开发又做管理。公司曾经的技术部只有两个人,发展到9人,到现在的7人,几乎清一色的应届毕业生,我们一起成长,走到现在。我对这里面所有的成员心怀感激,包括我自己。感谢你们!感谢公司给我从事管理的机会!虽然个人在07年感觉不是很适应,但是我和大家一起坚持过来了,我坚信,只要肯付出,我们必定会有美好的收获!
这是我在蓝色理想论坛第一次正式发表主题贴,以后每周我会抽出时间发表一篇技术与管理相关的主题贴,并同步发表在个人博客中。比如本文技术方面尚未明确的问题:JS原型继承、闭包、事件处理机制、管理体会等,阐述本人的理解与体会,与大家共同探讨交流。蓝色理想,是我经常来的网站,知道里面有许多大牛儿,期待成为你们的朋友,我们共同交流,并欢迎大家对我的本文的观点发表意见。