首页 > 代码库 > 什么才是程序员的核心竞争力
什么才是程序员的核心竞争力
add by zhj: 对人的态度,对待工作和问题的态度,技术能力,我认为这是做技术的人的核心竞争力。
对人的态度:团队中的人的技术水平是参差不齐的,性格等各不相同。这就要求我们要有包容的心,对人要和蔼,不要
看不起别人,即使自己能力很强,每个人都有弱的时候,即使很牛逼的人也是一步步走上来的,没有谁一出生就牛逼。
如果一个人不好相处,那么无论他能力有多强,别人也不愿意与他合作同事,独学而无友,且孤陋而寡闻,最后这个人
不可能干成什么事,而且这类人不仅工作不顺心,生活上也不会幸福。所以,这类人应该调节自己,对人友好,别人才
会对你友好。良好的工作氛围是高效工作,愉快工作的前提。
对工作和问题的态度:这里的问题是指其它人提出的问题,当别人希望你解决问题时,不应该直接拒绝,要与问题提出人
讨论问题背后隐藏的需求是什么,这种需求是否实际,想清楚的再决定是要解决它还是拒绝它。比如,产品经理提了一个新的
功能需求,这个需求实现起来非常复杂,不应该直接拒绝,而应该与产品经理讨论这个功能背后的需求是什么,为什么有这样
的需求,如果需求很实际,那就应该想办法去解决。需求肯定是不断增加的,这也说明产品还有一定的生命力,如果哪天不再
增加新功能了,那也就说明这个产品的生命周期快要结束了。不要因为感觉别人提的需求很弱智而去批评别人,尤其是产品的
需求,因为很多时候,这只是你自己的感觉,你没有决定性的把握证明对方提的需求不可行,也许他的需求是符合实现的,可
不可行往往要接受市场的检验,如果你认为不可行,那可以把自己的观点亮出来,与对方讨论,而不应该批评对方白痴弱智。
没有人愿意被批评,可以与别人讨论,但不应该与别人吵架,把关系搞糟糕。
技术能力:一个人的技术能力取决于两点:自学能力+人际关系。对这两点,我都深有体会,互联网行业发展很快,新技术
日新月异,这就要求你必须要有持续学习和比较强的自学能力,这的确对人提出了比较高的要求,也因此,做互联网软件工程师
很累,对于像我之种大学和研究生没读计算机的人来说更是累得要死,自己一方面要学习计算机的基础知识如Linux操作系统,
软件工程,设计模式,另一方面也要学习新的技术,如NoSQL,网站架构等。对于人际关系这点,我也深有体会,我工作之后,
很多东西都是从别人那里学来的,比如第一份工作时,很多问题是从师傅那里学到的,第二份工作中,firebug, http, restful,
django, django-restframework, mysql, redis, uwsgi, nginx, postman,数据库搜索引擎,网站架构中的高可用,高伸缩
等这些东西都是从同事和朋友那里听说的,然后自己才慢慢的熟悉的,可以说是那些同事把我领进门的。现在,我主要靠这些东西
吃饭。良好的人际关系能开扩自己的视野,提高自己的水平,给自己提供更多的机会,非常有利于自己的发展。
下面是知乎上关于该问题的回答,原文见http://www.zhihu.com/question/27180582
学习能力,尤其是自学能力,你啥时看到那些有名的程序高手在论坛上问“学习 XX 该看什么书,如何快速学习 XXX,学习 XXX 有什么代码推荐”之类的问题,他们想学什么很快就能自己找到相关资料。这个行业发展太快,技术淘汰的速度也很快,3 年不学新东西就可能落伍了。
动手能力,都是看书看资料,当别人还在纠结看什么书,还在纠结书里的字句是什么意思的时候,有些人的几百上千行代码都已经能运行了。
耐心和毅力,做程序员兴趣固然重要,写自己喜欢的代码那是相当愉快的事情,但是程序开发中无论如何还有大量乏味无趣的事情,要能坚持,咬牙把这些做完。
表达能力,能在大庭广众下,把自己的想法逻辑清晰流畅地讲出来,让人听懂。
那么技术呢?技术不重要,有了以上几种能力,市场上需要什么技术,很快就能掌握了。
最后再说说工资的事,记住两句话:
工资不是老板对你过去贡献的回报而是对你未来贡献的预期。
现任老板不可能给出让你满意的工资,下一任老板才会。
姚冬回答的非常好,我狗尾续貂的说几句。
我们都知道学习能力很重要,那么学习能力从何而来,除了去看书上课这种,如何在实践工作中学习成长?
我之前微博说了一个笼统的概念,什么是能力? 对待问题的态度,以及处理问题的思路和方法。
先说态度
你服务器偶尔出 501 错误,也许比例不高(知乎也出现过很多次),很多程序员,没错,是很多,假装看不见,不在乎,或者归咎于人品问题。 这就是态度问题。
再往后,负载高了或者其他什么原因,突然频繁出现 501 错误,不去追寻深入的原因,而是找各种借口, 什么 IDC 服务商不好,服务器品牌不好,操作系统不好,数据库不好,CDN 不好,网络状况不好,web server 不好,甚至,直接对 Boss 说我们被 DDOS 啦!(遇到过,帮他 Boss 找过多个安全专家会诊,最后发现根本不是 DDOS,是程序员太烂。)
这就是态度,触目惊心,如果能对问题有敏感性,能知道对任何小的,轻微的问题有足够的敏锐度,你就有了一个快速成长的基础。对问题的敏锐度是非常重要的。很多性能或程序逻辑上非致命的 bug,在不够敏锐的时候是发现不了的,但是一旦进入特殊场景就会骤然爆发,你多一点敏锐度,就会减少这种危机的风险。
第二个态度是解决问题的态度,有人对自己的解决方案信心满满,认为万无一失,但有的人就会多留一条后路;就好比你说我服务器要不要做安全加固,肯定要做对不对,要做到尽可能严谨和周全,但是你数据库保存密码的时候是不是还要加密?而且要随机 salt,不就是防止万一依然有漏洞被人拿库怎么办么。程序也一样,以前写的一些服务端守护进程,有 bug,会莫名其妙的终止,这个 bug 当然要定位,要修复,但是同时,写一个 cron 检查这个守护进程状态,一旦遇到终止给予自动恢复,这就是第二手准备,即便你多么不希望他执行,这个准备还是要做的。对问题 做两手甚至三手准备,也是优秀程序员,架构师的关键素质。
第三个态度是基于沟通与理解的态度,产品或运营提了一个不靠谱需求,一句话打回去当然很爽很威风,但是有没有仔细沟通分析过,这个需求基于怎样的实际诉求,这个实际诉求有没有更合理的实现途径,一句话“这个没法做,这个实现成本太高”,不是正确的沟通态度,而且,最优秀的产品,往往是实现了那些原本人们认为无法实现的诉求。
这样的态度,才有了一个持续进步的基础,下面说思路和方法。
优秀 的程序员和平庸的程序员,如果只看敲打代码的速度,我觉得是分不出来的,也许每人都可以一天写很多行代码,但是遇到问题后,平庸的程序员的解决效率,和优秀程序员相比就会有天壤之别。 所谓解决效率,不外乎对 bug 的分析、定位,以及 思考。
最基本的一条,看执行日志,看各种日志,web server 的日志,数据库 的日志,慢查询日志,binlog 日志,php 的错误日志,等等等等,线上出问题瞎猜连日志都不看的大有人在。看日志不仔细不完整的也大有人在,你能去认真研究日志已经超越很多人了。
第二条,模块测试和断点分析,程序员一个坏习惯就是上来就写很大一坨代码然后再执行,不知道一个模块一个模块来写来测试,执行出了问题不知道设置断点,缩小范围逐步分析。断点分析非常简单,将整个代码中插几个中间输出,观察哪个环节出了问题,或者观察每个环节的系统开销,对调错和性能优化都非常重要,高手们大概认为这是 ABC 的东西,但是就这玩意我看到的大部分程序员都没有这个习惯。
第三条,错误信息 的理解和搜索,搜索引擎上有各种丰富的技术资料和技术问答,你所遇到的错误信息和错误提示,通常都能在网上搜索到,当然,搜索到后要结合你的场景认真思考,并理解透彻,而不是照猫画虎的去处理,否则可能这次运气好就蒙对了,下次运气不好又不知道怎么回事了。
第四条,不断总结归纳,对一个问题,一类问题,以及不同类型的问题,善于归纳整理,不断反思自己的问题,即便是不出 bug 的代码,你经过一段时间去回头看,也有很多思考不正确不合理的地方,有很多优化点,如果你觉得自己的代码一向牛逼,毫无破绽,那你一定是原地踏步,毫无进展。
关于 归纳总结,我说个案例
以前我们有个系统,请求量非常大,负载非常高,有个不错的技术经理来处理,他列了几个升级计划,都很靠谱,去执行了,效果非常好,然后我们跟进汇报的时候他来讲,做了几项升级,整体效果如何,然后我就批评了他。
我批评了什么呢?他是一起做的升级,然后一起观测的效果,那么这几个方案里,具体每个方案的实际效果怎样,对提升的帮助多大,他没有任何数据。所以对具体每个升级方案的价值和重要性,他没有任何概念。你正确的解决了问题,却没有认真的去归纳整理,你的收获是有限的。一起做升级不能说是错的,但是效果评估需要单独去做,而这个数据是非常有价值的,知识积累,不是你处理过的就一定有积累,而是整理过的。
大概就这些
最后重述一遍
什么是能力?
遇到问题的态度
处理问题的思路和方法
这就是能力
什么才是程序员的核心竞争力