分类 程序人生 下的文章

加班-产品成功

最近产品行业流传“唯快不破”四字诀,这话我是信的,只有实际运行的数据才能提供最可靠的指引。所以数据来得越快,方向就走得越准。敏捷发布,小步快走这些道理都是互联网产品项目的真理。问题是,单单从一个“快”字延伸出去,很容易唱一曲“爱拼才会赢”,6X12,甚至6X14之说大有市场。
加班并不可怕,至少我自己不怕加班,而且是习惯性每天多做几小时。过去五年的历史记录有两个,一是连续半年以上每周工作70+小时,另一个是带队报道车展的时候,连续四五天,每天工作16+小时。但正因为我加班很有经验,才对6X14持以异见。更直接点说,我不赞同把加班作为整个团队的一条口号,一种工作常态。
第一,产品项目以设计与开发为主,加班若要加出效率来,行政命令是没有用的,只能靠“质朴的热情”,即对项目有着发自内心的认同、喜爱与紧迫感,然而拥有这种热情的人终归是少数。让多数人陪着少数狂热者加班,会造成多数人的效率下降,状态疲惫。我们常见自上而下的以己推人……因为自己着急,就觉得所有人都该着急;因为自己全身心投入,就觉得所有人都不怕牺牲;可惜多数人的加班工时与进度收益之间并不成正比。
第二,有很大一部分工作,并不能靠加班来显著地推进,比如写出优质的代码,设计细腻的交互与精巧的算法,策划有创意的活动等等。简单来说,凡是脑力活动剧烈的工作,都要求在良好的精神状态下进行,才能保证质量。这就牵涉到第一条——部分人由于被迫加班,状态疲惫,不仅工作效率下降,质量也滑坡得厉害。可能是赶了两周工期,最后反而给项目带来更多的损失。
第三,产品项目中的每个工种都有农忙、农闲的时候。比如策划阶段,工程师的事儿就不多;到了开发阶段,设计师又得以清闲一段时间。调研和设计完成之后,我会建议PM休几天假放松一下,接下来,测试和发布阶段就得拼拼老命。因此将6X12设置为一种工作常态,这未免也太变态。我不止一次听见(其他公司)有人抱怨说,自己的活儿早就干完了,但下班后不准走,得留下来随时待命。这又是何苦……
前些日子,有件关于加班的事情让我印象深刻。我这边有一位资深工程师调换了部门,在新部门里升任主管职务,然后常常加班,累得够呛。之前不论我怎么激励整个团队,也很少见到他加班,现在却是主动大量地加班,任劳任怨。看来我以前对他“不愿意加班”的看法完全是个误解。这个例子说明质朴的热情往往来源于自我驱动,自己给自己设定目标,安排任务,“这是我的事情”。如果你的目标和任务来自上级,则驱动力大打折扣,“那是你的事情,我去帮你完成”。
可惜,强有力的自我驱动是件极为罕见的事情。有些人觉得自己不在其位不谋其政,有些人过于看重阶段性的物质奖励,有些人特别在乎自己的私人空间,有些人对项目的认同感始终提不起来,还有些人干脆对这份职业的投入度都不高。我在类似问题上困扰多年,积攒了几条经验:首先精简团队,至少是精简核心小组,参与(主持)项目的人越少,则归属感越强,不容易互相推卸责任。其次,核心小组要得到足够的授权,让他们感觉在做“我的事情”而不是“你的事情”,至少保证核心小组的自我驱动力。最后,我这个主管也要以身作则地加班,起到表率作用。
换个角度来看,加班对于产品成功真有那么重要吗?
最近恰好见一位豆瓣的朋友,问,你们加班多吗?答,一到19点办公室基本上就空了,早上通常是10点后才来上班……
这当然不能阻止豆瓣是一款好产品。
我在微博上说过一句话:2周一次小迭代,和3周一次迭代没有本质区别。产品胜出不会因为你每个版本的迭代都比别人快一周,而是你的判断更准确,设计更有效,实现更细腻。过度强调快快快,不仅令员工疲乏,也容易做不好产品减法。因为你能加班嘛,反而有更多工时去做次要需求。
我们都知道,产品并不是功能越多越强就越有竞争力。你拼命加班,飞快迭代,发布各式各样的型号版本,把自己搞得鸡血沸腾,但最终决定胜负的并不是速度,而是精度。拿我很钦佩的Instagram举例子,至今不开发Android版也不去完善网页端,平均一两个月才更新一个版本,不到一年用户数已经突破了700万大关!故而产品的理念与方向,比速度与激情更重要得多——但我看国内很多团队就知道抄,东抄西抄,自己的想法很少,就算有想法也往往是“抄这家”“抄那家”的贪多求全。这样的6X12,6X14又有何意义呢?真没见过几款产品单单靠“抄得快”“抄得全”就能成气候。勤不仅不能补拙,还有可能造成设计过度与产品失衡,结果越补越拙……
所以把6X12作为一句招聘提示,提前警示“有时候会非常忙哦”,这是没有问题的。但如果真心诚意这么执行下去,员工天天个个加班,时时刻刻在线,则一声叹息。从团队管理的角度上来讲,对市场与用户群的研究,尤其产品理念神马的过于飘渺,依赖超强的个人产品素质,无法用管理手段来衡量与促进,只好不得已而求其次,采用“加班”这种简单可量化的竞争手段。此法有效但不可滥用。

易成云门户开发实践总结

易成云门户开发实践总结
1、发现人员在协作开发中,存在等待现象,比如:前端开发需要model中的字段在页面中获取相应的值,但是后端开发没有做;门户后端的开发人员都应该思考:Action,Service,Model哪个该先做,这样才能协助前端展开工作。
开发的时候应该是:先接口,先model,后实现,即先model,先Action,后mock,最后Service实现;
提交任何一点代码都需要保证当前的工程是可运行的。
系统设计:
1)系统分析
2)数据模型
Done的标准
1)接口设计,输出伪代码
2)输出数据模型pdm
工作流程:
1)前后台开发人员一起根据原型,对“Action,jsp”进行分析,输出伪代码设计
2)后台开发人员对自己的业务层(Service)进行设计划分模块,列出服务清单
3)前后台分别开发,后台开发人员遵循TDD模式进行开发
发现的问题:
1.后台管理缺少原型,因此无法分辨请求是Ajax还是同步请求,返回页面还是提示也需要明确
对需求的把握的“度”的不统一:造成原因有:例如门户后端管理无原型,造成需求不明确,因此大家出现偏差,对需要的理解和执行上存在把握的“度”的不一致的问题。
解决方法:讨论时带上原型,后台管理部分的页面也需要原型设计—需要明确由谁来设计
2.前后端分离,组成两个team,而不是端到端的开发,这对大家的编程习惯是个挑战,需要我们互相学习、磨合、协作。
一、发起讨论的人必须准备的文档:
1.数据模型pdm 及相应的model代码
2.前后台接口设计的Action的伪代码
3.service与action的接口设计的伪代码
4.在wiki上发布,并邮件提醒相关参与人
二、参与讨论系统分析的人需要做的准备:
1.明确要讨论的模块的需求
2.熟悉wiki上的设计文档
2.根据文档提前列出需要明确的问题和自己的想法
三、注意事项
1.在讨论需求的时候还是需要先画出UE,这个必须有!!!!
2.需要修改则直接更新 伪代码和数据文档pdm,不必事后修改。
3.采取三三小组制,系统设计的组织形式:前台开发一人+后台开发二人 为一个小组 组与组之间的信息共享通过wiki和讨论会
4.层次较高的系统设计,仍由专人来设计、出文档,然后大家再一起讨论
5.前后端接口讨论时间:10:28-11:03 ,以后需要注意讨论的时间
四、接口设计负责人需要把你写的Action,Service,Model等类配置到spring和struts2的配置文件中 完成的标准:伪代码在框架中是可访问的,不会因为缺少配置文件而造成出现404等错误。

程序员VS编码员

程序员是脑力劳动者,编码员是体力劳动者。程序员是建筑师,编码员是泥瓦工。程序员有自主创新能力,编码员是照本宣科。
英文中 Coder 和 Programmer 都含有软件开发人员的意思,Programmer 是程序员,这个很好理解,但 Coder——这里暂且翻译成编码员——在国外有着跟程序员很大的不同。比如,在一家日本公司里,日本的软件工程师负责设计软件,编写详细说明书,制作完整的伪代码清单。他们这些人可称作是程序员。当他们完成这些事情后,设计说明书、详细说明书、伪代码等必备资料都交给中国那些外包的年轻小伙们,这些小伙阅读说明书,严格按照伪代码,把它们变换成特定语言真正可运行的代码,做这些工作的小伙只能称作编码员。可以看出,前者是用脑子的,而后者更像是一种人肉转码器。

IT人不要一辈子靠技术生存

我现在是自己做,但我此前有多年在从事软件开发工作,当回过头来想一想自己,觉得特别想对那些初学JAVA/DOT。NET技术的朋友说点心里话,希望你们能从我们的体会中,多少受点启发(也许我说的不好,你不赞同但看在我真心的份上别扔砖头啊).
一。 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事 市场开发,跑腿的人,没有前途。
不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)
更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。
也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。
比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给他换个地方,他马上会成为一个勤奋且出众的人。)
二。在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。
有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。
朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。
如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)
三。你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。
如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。
创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。
[小结]
基于上面的讨论,我奉劝那些学习技术的朋友,千万不要拿科举考试样的心态去学习技术,对技术的学习几近的痴迷,想掌握所有所有的技术,以让自己成为技术领域的权威和专家,以在必要的时候或是心里不畅快的时候到网上对着菜鸟说自己是前辈。
技术仅仅是一个工具,是你在人生一个阶段生存的工具,你可以一辈子喜欢他,但最好不要一辈子靠它生存。
掌握技术的唯一目的就是拿它找工作(如果你不想把技术当作你第二生命的话),就是干活。所以你在学习的时候千万不要去做那些所谓的技术习题或是研究那些帽泡算法,最大数算法了,什么叫干活?
就是做一个东西让别人用,别人用了,可以提高他们的工作效率,想象吧,你做1万道技术习题有什么用?只会让人觉得酸腐,还是在学习的时候,多培养些自己务实的态度吧,比如研究一下当地市场目前有哪些软件公司用人,自己离他们的要求到底有多远,自己具体应该怎么做才可以达到他们的要求。等你分析完这些,你就会发现,找工作成功,技术的贡献率其实并没有你原来想象的那么高。
不管你是学习技术为了找工作还是创业,你都要对技术本身有个清醒的认识,在中国不会出现BILL GATES,因为,中国目前还不是十分的尊重技术人才,还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。(如果你不理解,一种可能是你目前仅仅从事过技术工作,你的朋友圈子里技术类的朋友占了大多数,一种可能是你还没有工作,但喜欢读比尔。盖茨的传记)。

编程-学校不会教你的课程-Code.org宣传片

编程,学校不会教你的课程——Code.org 宣传片(中文版)
视频的明星有:Bill Gates(微软公司创始人,前世界首富)、 Mark Zuckberg(Facebook创始人,最年轻的亿万富翁之一)、 Chris Bosh(NBA全明星球员,曾效力多伦多猛龙队,目前迈阿密热火队的主力大前锋), I.Am.Will(超级R&B说唱乐队”黒眼豆豆”的创始人和主唱)。
其实,学编程并不仅仅是为了生存!

情人节html5玫瑰花源码

情人节html5玫瑰花源码:将代码复制成为html文件,用支持html5的浏览器(火狐)访问该页面就可以看到效果

</pre>
<iframe src="javascript:'<br /> <!doctype html>n<html>nt<head>ntt<title>JS1k, 1k demo submission [1022]</title>ntt<meta charset=&quot;utf-8&quot; />nt</head>nt<body>ntt<canvas id=&quot;c&quot;></canvas>ntt<script>ntttvar b =
document.body;ntttvar c = document.getElementsByTagName('canvas')[0];ntttvar a = c.getContext
('2d');ntttdocument.body.clientWidth; // fix bug in webkit: http://qfox.nl/weblog/218
ntt</script>ntt<script>n// start of submission //nwith(m=Math)
C=cos,S=sin,P=pow,R=random;c.width=c.height=f=500;h=-250;function p(a,b,c){if(c>60)return[S(a*7)*(13+5/(.2+P
(b*4,4)))-S(b)*50,b*f+50,625+C(a*7)*(13+5/(.2+P(b*4,4)))+b*400,a*1-b/2,a];A=a*2-1;B=b*2-1;if(A*A+B*B<1){if(c>37){n=
(j=c&1)%3F6:4;o=.5/(a+.01)+C(b*125)*3-a*300;w=b*h;return[o*C(n)+w*S(n)+j*610-390,o*S(n)-w*C(n)+550-j*350,1180+C
(B+A)*99-j*300,.4-a*.1+P(1-B*B,-h*6)*.15-a*b*.4+C(a+b)/5+P(C((o*(a+1)+(B>0%3Fw:-w))/25),30)*.1*(1-B*B),o/1e3+.7-
o*w*3e-6]}if(c>32){c=c*1.16-.15;o=a*45-20;w=b*b*h;z=o*S(c)+w*C(c)+620;return[o*C(c)-w*S(c),28+C(B*.5)*99-b*b*b*60-
z/2-h,z,(b*b*.3+P((1-(A*A)),7)*.15+.3)*b,b*.7]}o=A*(2-b)*(80-c*2);w=99-C(A)*120-C(b)*(-h-c*4.9)+C(P(1-b,7))
*50+c*2;z=o*S(c)+w*C(c)+700;return[o*C(c)-w*S(c),B*99-C(P(b, 7))*50-c/3-z/1.35+450,z,(1-b/1.2)*.9+a*.1, P((1-
b),20)/4+.05]}}setInterval('for(i=0;i<1e4;i++)if(s=p(R(),R(),i%2546/.74)){z=s[2];x=~~(s[0]*f/z-h);y=~~(s[1]*f/z- h);if(!m[q=y*f+x]|m[q]>z)m[q]=z,a.fillStyle=&quot;rgb(&quot;+~(s[3]*h)+&quot;,&quot;+~(s[4]*h)+&quot;,&quot;+~(s[3]
*s[3]*-80)+&quot;)&quot;,a.fillRect(x,y,1,1)}',0)n// end of submission //
ntt</script>nt</body>n</html>'" frameborder="0" scrolling="no" width="1200px" height="820px"></iframe>
<pre>

HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 技术。HTML 5有两大特点:首先,强化了 Web 网页的表现性能。其次,追加了本地数据库等 Web 应用的功能。广义论及HTML5时,实际指的是包括HTML、CSS和JavaScript在内的一套技术组合。它希望能够减少浏览器对于需要插件的丰富性网络应用服务(plug-in-based rich internet application,RIA),如Adobe Flash、Microsoft Silverlight,与Oracle JavaFX的需求,并且提供更多能有效增强网络应用的标准集。
请使用火狐、谷歌等支持html5的浏览器,点击查看效果:http://tianhailong.com/rose.html

我的程序里-《我的歌声里》程序员版


《我的程序里》!没有一点点防备/也没有一丝顾虑/突然错误出现/在我的日志里/带给我惊奇/身不由己/可是你偏又这样/在我不知不觉中悄悄地消失/从我的堆栈里没有音讯/剩下了报警短信

伟大的程序员是怎样炼成的

•只做正确的事
对于软件这一行的人,我们有个很大的挑战,就是如何能够用正确方法的做事情。什么是正确的方法,这依赖于你在做什么和做给谁。而究竟所谓 “正确的方法”里都包括了什么内容,这并不是重点,重点是你是否能坚持按照这种方式做事。初级程序员在这个问题是通常不能做到坚持,而资历较深的程序员却 能始终坚持原则。 也许会有一个“非常紧急”的项目,或者这个项目很特殊,不能按常规过程开发。这只是个假象。 好的程序员知道即使在任何情况和环境下都要坚持做正确的事情。 如果说按正确的方式开发将导致不能按时完成任务,那么,他们就会知道,这个项目是不能按时完工的。 不要妥协,工程质量是你作为一个优秀程序员的唯一终极证明。 确保你所有的代码都是在正确的方法下100%正确的写出的。要按一个优秀的程序员的标准来要求自己。
•甘愿受苦
听起来很傻,但却是真的,优秀的程序员都乐于承担工作上给他们带来的痛苦。 你说出一个伟大的程序员,我都能告诉你,在他或她的职业生涯里,各个阶段,都曾有花好几天时间去解决一个问题的经历。 优秀的程序员品味着困难给他们带来的挑战,这让他们日以继夜,他们明白,问题必须要解决掉。
不太优秀的程序员就不一样了,他们在刚刚碰到有麻烦的迹象时就先想到要寻求帮助。 在问题面前,他们习惯于去寻求帮助,而不是自己去努力解决这个问题。 他们最喜欢的一句话是:“帮我看看这个问题”。 伟大的程序员的第一反应是我要自己解决这个问题。解决问题是种技能,是优秀的程序员非常看重的一种技能。
好的程序员是通过痛苦的磨练才成为伟大的程序员的。 痛苦的磨练是说当你对这个问题实在无能为力时才去请求外援。 求助就意味着认输, 所有尽量减少这种处境的发生。 甘愿受苦。和问题做不懈的斗争。这就是你要学会的。
注意: 我并不是说你不能寻求他人的帮助。我说的是,你首先要尝试自己去完成任务,如果你不能完成,再寻求帮助。 不要在自己没有努力过前就轻易的求助。你经常会发现,当你知道了解决方法后,你才认识到,你用自己的力量本也能解决这个问题的。
•学无止境
如果有人敢声称他不需要再学任何新的知识,我是绝对不愿意和他共事的。 在有些行业,你也许很多年不学新的东西也能干的很好,但软件技术革新的如此之快,你不能不时刻关注。 你的老板是由于你有某些技能才花钱雇你的,如果你的技能已经落伍、过期了,那你也就没有价值了。 想成为一名伟大的程序员,你首先要承认你不是无所不知,你必须每天都要努力的寻找、学习新的知识。
在你现在的公司里或组织里寻找能让你学习、让你钦佩的人。在复杂的问题上征求他们的意见,看看他们是怎么思考的。 向他们介绍你的解决思路,请他们给予批评指点。 如果在你的周围你不能找出一个能作为你的导师的人,这要么是你还没有认真的寻找,要么是你留在了一个不该留的公司里。 如果你在现在的工作上不能学习进步,那是到了你该换个工作的时候了。
要阅读网上的博客。关注一些研讨会。与其他程序员交流。伟大的程序员从不停止学习。
•分享知识
有一些程序员认为,他们的唯一价值所在就是他们所拥有的知识,于是,分享出他们的知识就会让他们的价值降低。 这是大错特错了。让你有价值的不是你的知识,而是如何运用你的知识给公司创造价值。 难道还会有比分享知识给他人更能给公司创造价值的方法吗?
我曾经面试过一家公司,知识不共享、相互保密、相互提防的理念在这家公司里根深蒂固。 在这样的环境里,员工之间形成了一种恶性竞争的关系,这直接导致了勾心斗角和诬陷中伤的产生。 我可不想在这样的公司里工作。如果每个人都对自己知道的事情讳莫如深,那你什么都学不到。
伟大的程序员希望他人也能知道自己所掌握的知识。他们并不担心会因此而失去优势,因为他们相信大家都会这样做。 伟大的程序员乐意看到他们的同伴成长、成功。 一个公司,它应该被一群喜欢知识共享的人组成,就像人们在运动场上,让团队的每个对员都强大起来,整个团队才会强大。
•伸出援助之手
伟大的程序员从来不会说“这不关我的事”。他们总是愿意伸出援助之手。他们经常在做自己的工作之余,去帮助那些编程新手。 如果有件任务必须按时完成,而又没有其他人能胜任,伟大的程序员会主动承担起这项任务。 他们从来不嘲笑来请求帮助的人,即使问题是那么的小、那么无意义、无价值。 伟大的程序员重视他们的团队,愿意为团队做任何的事情。 不管是要去写1,000行的代码,还是去编辑一个图片,伟大的程序员都会立即站出来帮助完成。
•十年磨一剑
伟大的程序员不是天生的,是后天炼成的。他们是本文上面提到的那些因素造就的,加上还要通过努力的工作。 如果你是刚刚意识到这些,那还不晚,你仍然有充分的时间来成为一个伟大的程序员。耐心是关键。伟大的程序员不是在旦夕之间就可以成就的。有些人可能要花上 数年,有些人则需要十几年。 没有人为你写血泪史。 好的公司当发现你有成为伟大程序员的潜质时,会帮助你,为你提供舞台。而你会通过你的努力工作、让你的团队进步来证明自己。要坚定,要自律,通往伟大程序 员的道路会很长。

什么是程序员的优秀品质

优秀程序员应当具备的品质:
语言和工具(Languages and Tools):
任何程序员/开发者需要具备的第一个技能就是,能够用编程语言工作并会使用与之相关的主要开发工具,包括:工具、IDEs, web 框架, messaging APIs。
程序设计方法(Programming Paradigm):
举例来说,很好地理解面向对象,这对使用强制式语言(Imperative Language也称过程式语言)写出可维护的代码至关重要。在企业开发中你会遇到各种不同的问题,理解多种程序设计方法并知道何时使用,将使这些问题迎刃而解。
领域专长的知识(Domain Specific Knowledge):
如果想编写系统来解决特定领域内的问题,那么拥有该领域的专长知识将非常重要。
尽管许多这样的知识是由项目的商业分析员(Business Analyst)来获悉,但如果开发者也能获取,那么跟用户的交流将会更加容易,而且更能够理解他们的专业词汇。
人际关系(People Skills):
软件开发中最重要的技能之一就是能够与其他开发者一起高效工作——同事、质量/商业分析员(Quality/Business Analysts),客户,用户,很多很多……如果你能够很好地处理这些关系,那么成功的大路也离你不远矣。
解决问题(Problem Solving):
有能力解决那些没有明显解决方法的问题,这一点在软件开发中很重要。当把你的应用配置到JBoss或者通过一个测试找到一个棘手bug的时候,理智地编程将成为调试一个类路径(class path)问题。
沟通能力(Good Communication skills):
在软件世界中,人们通常认为好的沟通能力就是流利地说话,事实上这远不是。这指的是:你能够多么有效地与其他人交流。作为一名优秀的开发者,你应当能够很好地表达你的想法,很好地听,以及很好地掌控你与他人沟通的过程。
读书(Read Books):
读大量书将了解很多不同的技术,读书使你对一种技术有了快速、直接的视角。通常你应当选择知名学者的书,他们推崇实践和用技术解决问题的多种方法。在这个过程中,你将学到很多并逐渐形成自己的方法。没准哪天你也就能出书了呢。
实践、实践再实践(Practice, Practice and Practice):
许多开发者拥有大量理论知识,他们饱览书籍和技术资料。然而,怎样运用这些知识却让他们望而却步。这是因为他们缺乏实践。你工作的效率和效力只能通过你实践中编写代码来获得。唯一能使你成为优秀开发者的方法就是实践、实践再实践。
遵循范例和最好的实践(Follow Patterns and Best Practices):
范例和实践反映了技术指导、常见技术问题和基于真实事件的实践。学习的过程是循序渐进的,但是一劳永逸。这会节省你非常多的时间和精力,让你的工作更加有效。遵循一本“代码编程指南”(Code Design Guideline),经常使用代码分析工具将检测和分析你的代码。
讨论/小组沟通(Discussion/Newsgroup):
参加开发社区会提高你的领导能力以及贡献感,二者都是成功的必需品。在社区内参加一场含量较高的技术讨论将使你充满成就感,而且会增长你的知识,因为其中的智者会查看和评点你的解决方法,你也会查看和评点他们的。而且这个过程教会你接纳并感激别人的建议。如果她/他做出了积极的贡献,不要忘了赞扬和鼓励(’pat someone on the back’)。
网络和数据库知识(Knowledge of Networking and Databases):
有人也许不赞成这点,但是一个优秀的开发者应当知道网络和数据库的基本东西。而且在思考解决方法的时候,不要忘记将二者考虑在内。拥有二者的知识,能够帮你写出更好的代码并节省你很多时间。
博客、写文章(Blog/ Write Articles):
我们中有谁能够记住每件事?我不能,所以我把他们记下来。当我需要的时候,可以回头翻阅参考。除此之外,我可以借此从读者那里获得反馈,让我对同样的问题收获更多的方法。我已经获悉了许多与我工作有关的反馈,虽然有好有坏,但我会一一验证,这个过程也让我受益匪浅。
KISS:
不要想歪了,这里的KISS不是你想的那样,是指让应用/方法直短、简单(Keep Implementations/Approaches Short and Simple的简写)。不要使用行话来让事情更加复杂,因为人们很难理解它们。最好的方法是简化你的设计并避免过度设计(over-engineering)的东西。
像测试者一样思考(Think as a Tester):
开发者和测试者,来自两个不同阵营的两类人群,随时准备同彼此较量。我发现二者的合作将产生非常好的结果。既不会损害开发者的利益也不会损害测试者的利益。实际上,长期来看,像测试者一样思考有利于减少你代码的bug,而且会形成很好的编程习惯和思维。
坚持一致是游戏规则(Consistency is the name of the game):
你是否经常跳槽或者被你的薪水所打击?如果是,那么静坐下来放松下并重新规划。好好想想不要让你的决定天马行空,为了不断向前,你需要一个坚实的决定并坚持不懈。
参加技术研讨会/大事件(Attend technology seminars and events)
如果你所在的城市有技术研讨会,一定要抽出时间参加。大部分的研讨会是免费的,而且会提供新技术的重要信息。
万家通吃还是一门独大?(Jack of all or Master of One?):
嗯……这个问题不好回答。在现在的环境下,你必须掌握一种以上的技术。尽管这不容易,但是好的开发者还是能够做到。其中的关键就在于适应性:如果你精于某种技术,那么给以机会你将较容易地在短期内掌握一种新技术。你不妨试试,多掌握一种技术可以让你在使用中对比、选择。
停止抱怨(Stop complaining):
是否软件没有做成,是否测试人员给你检查出一堆bug?许多开发者的本能反应是抵制情绪进而非常抵制这种情况。由于这种情绪是自然反应未经控制,所以它不可取。静心分析为什么软件失败、为什么有如此多bug,这是一个学习的经历将使你未来的工作受益良多。
最后,请记住你不是要永远做个程序员。所以一旦你自我满足并觉得自己是个优秀的程序员,你就得重新规划你自己(re-program yourself)。扩展你的兴趣。开发只是这个过程的一部分,了解用户和商业实际上是一种艺术,每个人应当以此为目标并努力掌握它。