打印

在工作中成长 – 致有追求的Coder和可爱的部门同事们

引用:
引言:
我现在的工作首先是一个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原型继承、闭包、事件处理机制、管理体会等,阐述本人的理解与体会,与大家共同探讨交流。蓝色理想,是我经常来的网站,知道里面有许多大牛儿,期待成为你们的朋友,我们共同交流,并欢迎大家对我的本文的观点发表意见。
本帖最近评分记录
  • 帅青蛙 威望 +3 精品文章 2008-3-17 10:18
顶一个,楼主对w3c贯彻的很透彻,算是一个完美主义者,强烈支持
在MF下面可以添加模拟IE的attatchEvent方法。模仿IE

 提示:您可以先修改部分代码再运行
[ 本帖最后由 chensulong 于 2008-3-16 09:39 编辑 ]
周日大清早就看到了如此好文,怎能不留脚印。。
楼主举的那例子太好了,循序渐进
缘余几分~~飘~~

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
很好的文章,其实JS要学的精通是很难的

TOP

兼容的问题,还有一个处理方法,见我的签名里转的那篇文章(作者不详

3楼给过了,嗯嗯。我多说句话哈~

另外,把onclick的事件注册放在img标签里,也不能说就是结构与逻辑不分离,毕竟一切都应该是以需求为中心思想。
圆通快递是垃圾!

TOP

楼主文采飞扬,令人为之振奋.确实是一篇好文.从中学到不少东西,精典收藏!
赞一个!
致力于web2.0研究

TOP

@#1:yqhehe && #4:berain && #7:by0001
感谢支持,处女作,大家多提意见
@#3chensulong :
你提到的方式是很好的一颗珠子,Firefox遵从W3CDOM标准,其DOM接口都是通过Javascript实现的;但是IE是通过ActiveX实现的。在Firefox里,每个文档对象(DOM节点),都可以通过原型继承的方式扩展其方法和属性,期待将来的IE也有这样的改进。当然,在目前,也有人实现了IE下的HTMLElement原型。
请阅读:Crossbrowser HTMLElement Prototyping
对于DOM与Javascript之间的关系,推荐阅读:DOM 和 JavaScript
@#5:kabukon
会用可能不难,但精通是不容易的。
我们和大牛儿之间的区别并不大,需要更细心、更坚持、更有研究精神、更追求完美。
找到适合自己的方法,相信自己的实力!
@#6:ariex
同意你的观点,根据不同需要去组合应用不同的手段。
比如:重构,DIV就一定好吗?不一定,复杂的列表结构如果用DIV来实现简直是恶梦,那为什么不用表格呢?
也很类似于我这篇文章的需要,讲结构与逻辑的分离是为了引发思考,去想到第二种、第三种方式。
可能的话,我们尽量向分离的方向努力!

[ 本帖最后由 hgx127 于 2008-3-16 14:16 编辑 ]

TOP

相当感谢楼主,老早就想找HTMLElement有没有在IE中对应的东西了~
圆通快递是垃圾!

TOP

好帖啊,写的很不错,让人一看就明白。

TOP

谢谢楼主分享

TOP

感觉目前谈结构与逻辑分离还不成熟 楼主是不是考虑过各种写法的效率呢

当你需要打造一个胖客户端的时候 这一点好像蛮重要的

TOP

我一直在努力学JS,但是总是在门口。自己买了一本书,也好好的研究过,在蓝色也看了很多高手写的代码。但是让我去写代码的时候却不知道从哪下手,让我有点很迷茫。

TOP

忽然有想学js的冲动
往死了整丫的

TOP

@#12:dashzhao
部分同意你的观点,方法有好多种的情况下,根据实际需要组合不同的手段;讲分离,不是说一定要用分离。
本文主要是以技术手段为实例,分享学习方法的,目的是:在能够学到一点儿知识的基础上探讨学习方法,因此技术上的细节就没有过多的提及。
@#13:mythosworld  
我想你不知道从哪儿下手的原因是:你没有从事工作,或者你的角色很少用到JS。
首先有需要,才会有去学习它的动力。
要想学好它,就要用它,并且不断的实践;没有实践机会,自己创造机会。你甚至可以自己给自己找个小小的项目来干干。如果你是完全自己手写的,那么你的收获肯定不同,努力去做吧。

TOP

我也从事了一年多的前端开发,感觉没你那么有感悟,看了你的帖子,深有感触.......学习......

TOP

对楼主的学习过程很赞同,我自己也是按照同样的曲线走过来的。在这里不得不感谢一下人民邮电出版社和阿蓝的《css网站布局实例》。

另外,非常想说的一点是,关于标准,真的是尽信标准不如无标准,过尤不及。我们知道标准的好处是什么,然后尽力去实现就可以了,但并不一定真的要死死地去执行。举个简单的例子吧,window.getElementById("adang").onclick=function()虽然可以将行为分离出去,可是一旦页面有变化,我们不再需要adang这个元素了,当我们把把相应的html删掉的时候,js就会报错了。而这对于很可能不断修改的项目来说,是件很麻烦的事,维护方面是个问题。当然,这是可以解决的问题,虽然麻烦了点。可是,如果是xml解析出来的html呢?很可能我们的document.getElementById()执行完了,报错了之后,html才被解析出来。哪怕我们用windown.onload来把我们的代码包起来,或者是js库里的.ready()里包起来,也是没用的。当xml载入进来的时候,window.onload就已经执行了。当然,我们也可以用setTimeout来延迟执行,可是,延迟多久呢?我们的浏览器解析xml要多久?访问数据库又要多久?如果网络状况不好呢?

我们最好的办法是什么呢?就是把事件句柄写在html里了。这样,是最不容易报错的办法。
理论虽好,实现起来却是困难重重。相信每个做过重构的设计师都了解标准真正执行起来,特别是大型项目执行起来,不得不有所放弃。

TOP

深有同感的人啊, 不过在JS方面我就不行了, 奇怪了,也接触网站N长时间了, 但是对于JS就算的上是 能用起来,但是不会写
New Field fanne.net

TOP

虽然我看不懂js上面的什么一堆东西...不过我觉得楼主分析的很透彻举一反三.......

期待楼主的js教程....顶一个!

[ 本帖最后由 Singerlsf 于 2008-3-17 16:24 编辑 ]

TOP

。。。。。。。。。。。。

楼主js很牛

我觉得有时间一定能写个很好用的框架的!

lz的帖子朴实,洒脱。。‘赞

TOP

这里的每条回复我都仔细看过,感谢大家的支持!
@#17:cly84920
你所说的尽信标准不如无标准,深表同意!标准既然是人制定出来的,那么就不可能适应所有的情况,标准也是在不断完善之中的。虽然我们尚无制定标准的实力,却可以灵活运用标准。
当然,还是希望所有的浏览器大佬儿们都遵从了标准,呵呵~~那样我们就不用这么辛苦了。
对于你举的例子(xml解析html),发表点儿具体的建议:
实际上这个问题是:在无法准确获知客户端(浏览器)执行速度的情况下,如何确保数据可见性的问题。
既然客户端的执行速度是无法控制的,它和客户端的硬件配置和网络环境(主要是速度)有关。那么我们可以采用变通的手段:控制浏览器请求。
比如:
我们可以用XMLHttpRequest组件发送异步请求,这个请求是可以控制的,那么就可以解决你说到的问题。
另,如果应用了xslt,我们还可以直接讲代码写到xslt里面(CDATA)。

@#22:flypallas
你的短消息我已经看到了,你说的情况是我们每个人都曾经经历过的,我会找时间给你回复。
给个小小的建议,实际上,你可以把你面临的情况发表出来,让大家帮你想想办法,这样比我一个人给你回复要好得多哦,毕竟,我的经验也是有限的。

人说:“授人以鱼莫如授人以渔”,如果大家积极参与讨论,使到过这里的初学者在有所借鉴的基础上找到适合自己的方法。我想,这比给他们一段拿过来就能用的代码更有价值,你说呢?
希望你也能够分享自己的学习体会,Thanks!!

TOP

太好了,我明天继续看,LZ可以出书了,你出书肯定学着快!~

TOP

经典果然人才辈出,看完楼主的文章感觉有点相见恨晚啊.
代码要像美女的裙子,越短越好

TOP

看完楼主写的,很赞同“以点带面,体系成才”

这里我想请教楼主的是:
网站重构方面的问题,本人虽然看过一些网站重构的书籍,却一直没有真正实践过,也更不知道该如何下手,以及“重构”中的各项工作细节,希望楼主能有时间写一点关于重构的“珠”和“线”吧

TOP

仔细拜读大作的时候,突然发现一个熟悉的名字 hgx127 ,呵呵~~
原来是你啊,好久不见了,现在技术又更上一层楼啦!
我是425的,知道是谁了吧,常联系:)
游民部落格

TOP

还呆在学校。。。。。努力学习中哦
好好学习,天天向上!

TOP

很多很清晰,期待楼主共享更多精品文章及作品。此帖收藏!!!!!感谢ing.....
web标准学习群:2591676

TOP

期待下一周的篇子。。
www.m0592.com

TOP

好文章,感受良多!尤其是对生活的感悟!

TOP