今年是在it行业里工作的第8个年头。到7月1日,就满9个年头了。日企,美企,欧企,大公司(世界500强),小公司(起步时不到10个人)都有过工作经历。现在也从之前的纯代码编写者,升级为项目管理者。写过多个行业的项目,用过多门编程语言。无论公司,项目,技术怎么变化,从事编程这份工作需要的核心能力却从来没有变过,大家可以去看看各大招聘网站上的招聘要求,多年如一日,核心的要求都是一样,唯一变化的是新添加了几个热门技术而已。
靠山山会倒,靠公司公司也会倒,人际关系和资源,你离开一家公司的时候未必能带走,自己的核心能力这是唯一自己确定能带走的东西。
1. 扎实的基础知识和广博的知识范围
哪些知识算是编程的基础?我个人认为,像数据结构,算法,网络知识,操作系统这些平时工作中虽不常用,但都是一个程序员的功底。可以说是武学中的心法,是思考的基础,也是你面试进入各大公司的敲门砖。无论准不准备换工作,多出去面试面试,了解自己和许多优秀人的差距,会提高更快。对于广博的知识范围,参加过工作的小朋友,大朋友都知道,公司不可能按照你掌握的技能来给你定制项目的。大部分的时候都是公司的项目需要什么样的技术,你正好掌握了这门技术,那很好,马上开工。如果你并没有这方面知识的储备,对不起,现学也得上。慢慢的差距就能显现出来了,你比别人知道的多了,相信我,你会有更多的机会。
有两件事情给我的印象特别深。第一件事,我们给甲方做一个互联网金融的项目。甲方对参与项目人员的一个很主要的要求是要有丰富的项目经验和知识背景。我们公司有不少很资深的员工,能力也很不错,但是入公司以来一直做的是同一个项目,来我们共色之前也没做过几个项目。公司推荐了7个人过去,甲方只选了两个。看看这两个人的简历,都是有多家公司工作的背景,经历了5个左右的项目的。
第二件事是我们现在正在做的一个项目,是关于医疗的,避免不了要和医疗设备打交道。于是,各种串口,连接口等等的硬件相关的知识,对于我们这些平常只做软件项目的人来说,并不是很好理解。但是我们项目组有一个同事,平常对这些知识有积累,客户一讲他就明白,自然也成了这个项目里面比较重要的人员。
2. 阅读别人代码的能力
一个软件的开发,从需求分析开始到最后的产品交付,都是多个人协同工作开发的结果。很多时候,你接触到的项目并不是一个新的项目,而是在一个已经成型的系统上进行功能添加或是原来功能的维护。你读不懂别人的代码,恕我直言,程序员这个行业并不适合你。更重要一点来说,阅读代码的能力,并不是泛泛的说你读懂了这段代码的含义,而是还能明白代码的结构是怎么样的,和其他系统模块之间有什么样的关联,我这次改动会不会影响其他的模块,风险有多大,能不能修改,我们要能从代码中读懂这些。
为什么要读懂这些?主要的用途有两个:第一,你要告诉测试,我改了哪个功能的代码,可能会关联影响的功能有哪些。测试要针对这些做全面的测试,这是保证代码质量很重要的手段。第二,我们要给客户正确的反馈,如果是牵一发而动全身的改动,一定要给客户说明白其中的厉害关系,给出我们专业的建议。这个就是话语权。
3. 分析并理解需求的能力
先说说什么是需求分析,这个词对我们来说并不陌生。需求是什么? 需求就是客户的要求。我们为什么要进行需求分析?是要了解客户的真正要求。很多时候客户表达了很多,但是并没有说到点子上,我们要根据这些表达一步一步跟进,挖出客户真正想要的东西。举个例子来说,客户说“这个棒棒糖真甜。” 从客户的这个表述中你能得到什么样的信息?
仔细想想这个含义比较多,客户有可能就是想表达一下自己的想法,并不要求我们做什么,换句话说,这句话对我们来说是句废话。另外,客户也可能想再要一颗棒棒糖。我们如何得知呢?我们根据谈话场景进行分析,分析后再和客户确认。这就是做需求分析的过程。发现问题,分析可能的答案,确认。直到需求明确为止。
工作了这么多年,接触到各种各样的行业。有零售行业的,金融行业的,医疗行业的。我们做项目之前都没有相关行业的行业知识。这就要根据我们做项目的经验,进行分析。客户说了一堆行业术语,到底在表达什么。面对这种情况,不要怕,要有耐心。仔细读需求文档,仔细听客户的讲解,做合理的判断。多和客户交流。正确的理解需求是软件开发的第一步。
4. 完成并优化代码的能力
先来界定什么是完成代码。这里所说的完成代码并不是说只要对应的功能实现就好。你的代码还要结构明确,条例清晰,让其他团队成员容易读懂。开发团队,一般是会有代码审核机制的。想想这个场景,你到新公司上班第一天,领导给你布置了一个任务,让你打印输出10遍hello world。你觉得这个实在是太easy,写了10遍system.out.println(hello world)。你提交代码给领导。请自行脑补你的领导会是什么反应。这个例子虽然极端,但是很能说明问题。简单的事情,你知道怎么优化,怎么正确优雅的写代码。那么,需求复杂的情况呢,你是否有足够的能力写出优雅的代码呢?
这还只是你做一个最底层的开发人员的时候。如果你有一天开始带领别人做项目呢?做为一个从开发出身的管理者,你是否应该有能力识别你手下的员工所写的代码质量如何呢,代码存在什么问题,有哪些风险?
5. 逻辑思考的能力
什么是逻辑?什么又是逻辑思考?我个人认为代码编程工作中用到的逻辑是一种因果的逻辑关系。简单来说就是因为a所以b。并且a到b的因果关系是大家都能接受的,不是你自己创造的。举个例子来说,我们说 外面下雨了,出门要带着伞。这个是符合逻辑的。我们看到了下雨,思考到要带着伞,这就是简单的逻辑思考。如果你说我饱了,所以我要吃饭。你可以这么说,当然也可以这么做。但这并不符合地球人的逻辑思考,或许有一天你去了火星,火星人都这么认为,我们可以叫这个为火星人的逻辑。但是,很抱歉,地球人接受不了。
这样的场景对应到代码编写上又是什么样的呢?我个人认为做为一个程序员,你要能理解电脑的逻辑。电脑的逻辑是什么,你写一个if判断,判断条件正确,代码执行if判断对应的语句。如果判断失败,则跳过,执行下面的代码。一个if判断的情况比较简单,相信大家都能思考到执行的结果是什么。如果是多个if判断加各种循环呢?据说高手都是什么都不做只盯着屏幕看就能找到代码的漏洞,想到执行的结果的。如果你想能无限地接近高手,这个能力还是很有必要掌握的。
6. 快速持续学习的能力
请注意我这里写的是快速持续学习的能力。我个人在it行业里面摸爬滚打,也认识了不少这个行业里面的人,同事也好,朋友也好。个人认为,从事it行业的人,还是比较愿意学习的,大家也都能学的会,太难的不行,简单的总是可以的,至少证明大家都还是有学习能力的。但是只有学习能力对从事这个行业还是很不够的。
it行业出现的新技术,或者说技术的分支,可以用“繁花似锦”来形容。每天,每周,每月都有新的技术或者理论出现。有人做过统计,it行业的技术每2~3年都会更新一轮。对于这个我也是深有体会。我做第一个银行项目的时候,j2ee还在大行其道,没几年过去了,现在大概很少有公司会用这些技术了。大家都向更轻量,学习周期更短的新技术上转移了。即便是存续了多年的技术,也在年年更新迭代,早已经不是当年的那门技术了。
首先,你要注意关注收集出现的新技术,新思想,有筛选的学习,持续的学习新东西。如果项目开发用到了你没有掌握到的技术,你也要有能力把这门技术一周内上手,先入门。需不需要精通,看项目的需要或者个人的喜好。
7. 团队合作能力
一款软件的开发都是多个人协同合作的结果,国际化的大公司还在多个国家设有软件开发中心。团队合作是重中之重,你要让自己能够融入你所在的团队。作为技术领导人也好,作为一个普通的开发者也好,跟着项目和团队一起成长才是最快的成长。
8. 阅读英文文档的能力
软件开发这个行业,和其他很多行业类似,最先进的技术并不在中国。国外一些新技术,新思想出现,官方网站上并没有中文的说明文档。如果你看不懂英文文档,只能等对应中文的翻译。这比别人晚了一步不说,另外来讲,国内人翻译的东西往往晦涩难懂,更增加了学习成本。
另外一个方面来说,有问题需要解决时,”google+英文关键词“这样的搜索组合,更容易找到解决问题的方案。这些都需要能够阅读英文文档的能力来支撑。
其实阅读英文的技术文档,并不需要多高深的英文知识。大学四六级的水平足够了。阅读技术文档时会遇到不会的单词,大胆放心的去查词典即可。技术文档,语法结构一般都比较简单,很容易看懂。我个人认为,对于阅读英文文档最大的障碍是克服自己的恐惧心理。
9. 强健的体魄