关于本系列文字的来源,初衷和内容定位可以参考第一篇的开头部分,链接地址如下:
http://blog.csdn.net/binarytreeex/article/details/8174445
http://www.cnblogs.com/WideUnion/archive/2012/11/12/2766397.html
本文前一篇地址如下,感兴趣的可以访问下面的连接:
http://blog.csdn.net/binarytreeex/article/details/8888607
http://www.cnblogs.com/WideUnion/archive/2013/05/06/3061994.html
这次讨论一个和解决问题有密切关系,并且也是大家非常熟悉的话题:能力。实际上能够解决问题就是一种能力的表现,但是两者并不完全等价。这篇博文打算从我个人成长经历的角度回顾分享一些关于如何提高开发者自身能力的一些体会和心得。当然这些体会不是什么特效药,可以保证开发者能够一天就能武功精进,相反还是需要开发者自己长期不断的积累,才能完成能力的体升。但是我的这些体会和心得可以帮助开发者尽量少走一些弯路,并且在提升之路上能获得一些帮助,带给开发者正能量。可以解决问题是能力表现,但是并不等同于能力。因为具体的人在解决问题时所处的环境,可以使用的资源,能够获得的帮助和信息都会直接影响到是否可以解决问题。所以评估能力不能简单从能否解决问题这一个思路上来考察,更要看解决问题的过程和思路。前三篇所讲的内容是从方法本身方面来说的,从某种角度上来说见效会快一些。本文则是谈如何直接提升或者培养自身的能力来提高解决问题的质量,更注重在一个日积月累的过程。
如果本文叙述的内容,和读者已有的体会存在相异之处的话,我非常欢迎能够和同行们交流。应该说文本的内容出自自己的实际经历,所以我是刻意去避免说一些大家都知道,或者经典书籍,培训课程上的东西(如果这些东西存在的话)。但是在实用性和实际效果方面,我相信是非常好的。同样再次强点,本文介绍的内容来自个人的实践,对于能力培养这样一个宏大的话题和全体开发者这样一个宽泛的群体来说,局限性和片面性是在所难免的。所以请同行们自行取舍,同时也要根据自己的经验,实际应用场合做出适当的变化,这样才能更好的应用本文介绍的内容。如果分享的内容可以为同行们带来实际的帮助的话,那么我的目的就达到了。
一. 能力是什么?
在开始讨论能力养成这个话题时候,首先要明确一下,能力是指什么,或者说什么是能力。在实际工作中,能力这个词是大家非常熟悉的,也被频繁使用,甚至可以说被用烂了。我这里不考虑各个公司对能力的定义和内容,本文所说的能力只被限制在一个相对狭隘的范畴。在这样一个范畴中,能力可以通过具体的实际的表现来衡量。这个标准就是一个开发者能够解决问题的数量的多少和质量的高低。
简单来说数量和质量可以用一个等价数字来表达,数字高的可以认为是能力强,而低的则相对较弱。这可以理解为是绝对标准。于此相对,还有一个所谓的相对标准。这个意思是不仅仅从数量和质量来考察,还需要考察问题的上下文环境,解决问题的开发者的自身情况等因素,综合考虑之后再确定开发者的能力处于一个什么水平。这就是所谓相对标准。
二.能力的内容
本文只讨论和专业相关的能力,就是所谓的智力因素相关的能力。对于更为普遍的所谓非智力因素的能力,本文就不讨论了,比如:如何培养能力从一个程序员成为一个项目经理,等等。
三.提升能力的途径和方法
总体来讲,提升能力的方法和途径大致有以下几点:学习,积累,思考,实践。这些方法是可以贯穿在整个职业生涯的。当然在不同的阶段,具体的操作和使用会有所区别。
下面我从一个大学生开始介绍一下提升能力的体会。作为起点从校园开始讲,那是因为我觉得大学是一个提升能力的很重要的阶段。
1. 学生提升能力的方法
普遍的观点认为,大学毕业生没有经验,所以在实际解决问题时表现出来的能力是比较差的。这点我不否认,但是这种观点过于流行的程度,使我认为这种看法是不全面的,学生是可以有能力的。我建议学生们做好以下几点:
a.读好你的书
在校园中的时间,学生主要的任务当然是学习。这种学习的效果在开始工作时可能不会有所体现,但是从长远来看,这是能力提升的一个瓶颈。所以在校园中尽量把课程学好,尤其是几门重要的基础课和专业课的课程学好是非常有必要的。具体课程的内容,可以参考本系列学习篇中的相关内容。当然我也相信在学校中会有很多相关的内容,帮助学生学好自己的课程,所以可以参考一下,这里不太过多讨论了。
b.做好你的作业
这个作业具体可以指这样几门课程:数学相关的课程,尤其是排列组合相关的内容;编译;数据结构;操作系统等等。完成作业是最直接使用知识的一个途径。我建议学生可以从使用知识,解决问题的角度来看待自己的作业。其实这样做应该不是太难,尤其像数据结构这样的课程,做到这点是比较容易的。对完成作业的解题方法的质量,我建议学生可以对自己提出一点要求。这个意思就是说,能不能找出多个不同的方法完成题目,或者努力一下找出一个更好的完成题目的方法。这样的要求可以帮助学生更多更好的思考,从一个相对要求更高的层面上来使用自己学过的知识。当然也能帮助学生对自己学过的知识更加熟悉起来,为以后在实际工作中使用这些知识做好准备。
c.多多练习
计算机专业是一个实践性很强的专业,所以作为计算机专业的学生,只是在作业本上完成习题是远远不够的。对于数据结构或者某一门具体的编程语言的课程,我建议学生保证一定量的编码练习。我觉得在学这类课程时,你每天晚上都应该是比较忙的,当然是忙着写代码和调试程序。
d.毕业设计
从你大学生涯的第一天学习计算机专业的课程开始,你就要对自己的毕业设计做什么有一个大致的看法。如果觉得有困难,那么我建议学生提前2年开始考虑这个问题。因为当年在我自己做毕业设计的时候,我的老师说过,毕业设计要综合运用到自己在大学里学过的知识。所以你的专业一定是在你的毕业设计之前就要学好的,否则你的毕业设计就会有问题。提前思考你的毕业设计,对你学好专业课会有一个更为明确的目标和动力。我看到的大部分学生完成的毕业设计的质量是很低的。之所以说低,是因为完成后的毕业设计没有使用到自己学过的知识,尤其是专业课程的知识。所以学生失去了一次非常好的实践机会。一个好的毕业设计你可以认为是一个mini项目。
e.尝试做一些项目
项目可以自己找,也可以去实习,这个自己看着办。我想强调的是要去做。比如利用寒暑假做一些小程序。我可以说一下自己当年做过的练手的程序:
挖地雷:
这个可以帮助你设计最基本的界面,可以熟悉GDI+,可以考虑地雷位置的生成算法,等等。是一个非常好的可难可易的练手的题目。
俄罗斯方块:
这个程序可以练习键盘控制,界面响应,图形操作,以及一些基本的面向对象的设计构思。我建议学生可以考虑多次反复的完成这种练习,每次会有新的体会,能力就逐步提高了。这个游戏我在不同的阶段用不同的语言做过好几遍。
那么做到以上几点对于一个学生提升能力有什么帮助呢?我觉得当你离开校园踏上工作岗位的时候,你具体以下的优势:
第一点, 扎实的基础功
这可以保证你在很长的职业生涯中维持着一个不错的状态也是你能够长期胜任开发岗位的一个重要因素之一。
第二点, 具备基本的或者较强的调试程序的能力
调试程序的能力不一定需要有实际工作经验以后才能具备。学生完成足够的编码,并且编码的内容具有足够的难度和质量,那么一个毕业生同样可以具备非常出色的调试程序的能力。这是任何一个愿意去努力的学生完全可以做到的。
第三点, 基本的解决问题能力。
学生解决自己作业中的问题,解决自己上机练习中的问题,这些经历实际上就是一个能力积累的过程。这为工作后解决实际问题或者更有难度的问题打下了一个非常好的基础。
2. 工作中的能力提升
在工作中要注意积累。对于大部分人来说,开发的岁月是在完成一个一个项目的过程中度过的。那么当一个项目完成后可以问一下自己我得到了什么?尤其是刚开始工作的那几年,正是提升幅度最大的阶段。思考一下自己收获,掌握的新的技能,如果可能还可以写一点笔记。我在最开始的两年能够做到每一周写一篇笔记。所以至今回忆起来,在我创业之前那个阶段里,收获最大的是我没入行自学的那个阶段。而到了北京入行以后,基本上是使用之前积累的经验。虽然不能说在北京工作的那段时间一点长进都没有,但是从编码开发的角度来说,长进确实不能和自学阶段相比。所以建议大家做好积累的工作。
勤于思考。这个思考主要是考虑项目中可以改进或者有缺陷的地方。当然具体的环境是否允许你提出来,这个自己看着办。我的意思是你需要主动的去这样思考。你的能力可以在这样的思考中慢慢提高。另外思考之后,可能会发现更好地作法,如果这样的话,我建议你再多做一点工作。那就是尝试去寻找证据来证明的你想法是对的,这点非常重要。在刚开始的时候,可能会觉得有难度,但是次数多了就会慢慢顺手了,你的能力也就得到提升了。
尽量高质量的完成自己的工作。做到这点可能会受制于具体的环境,比如时间非常紧的项目可能不允许花费过多的时间来做这个事情。但是如果有机会的,希望能尽量去尝试。其中一个非常有趣味的问题在于,把工作或者说把编码做到什么程度算是更好的质量呢?这个问题我相信不同的人会有不同的理解,大家可以自己去定位一个,然后努力去做。我可以给出一个参考标准:用尽量少的代码行数完成相同的工作。当然,前提是可读性和可维护性的损失在可接受的范围内,零损失当然是理想的。这种判定标准的确定和具体判定时的取舍,实际上也是一种能力的体现,多多练习也是很有裨益的。
3. 生活中的能力提升
我一直觉得从事开发工作是要有一点基础条件的。其中一个就是,是否能从程序员的角度来考察和思考现实生活中的事情。这属于勤于思考的范畴,但是内容却更为丰富,也更有趣味。下面我可以举两个例子。
一次和同事一起坐电梯,同事一边看自己的手机一边进入电梯,电梯门关上后他发现手机信号还是满的。这个问题如何解释?思考这个问题的答案和程序员有什么关系?首先从我们知道的事实来讲,手机可以显示所处环境的信号的强弱,所以可以肯定手机和基站有通信。如果在电梯门一关上手机就能马上察觉没有信号,那么手机必须保持足够高频率的检测。比如电脑扫描键盘是频率是每秒18.2次。以人类生理极限来说,这个频率可以足够保证你的每次按键都可以被捕捉到。那么手机有必要么?基于当时我做过的通信项目来说,是完全没有必要,保持一定间隔的查询就可以了。到这里和程序员的开发就有关系了。对于这个例子一个可能解释是,手机显示的信号是两次检测间隔中的信号,而上一次是在电梯外,下一次检测时间还没到,所以造成电梯门关上后,还显示满信号的情况。当然如果从来没有做过通信程序可能想不到这个答案,但是你可以在生活中尽量使用你知道的知识和经验来解释你看到现象。
第二个例子还是和手机相关的。我记得葛优在一部贺岁片中有这么一个桥段,不关机直接去下手机电池。这个时候别人打入电话时听到的提示是无法接通,而不是已关机。那么这是为什么呢?这个问题同样可以从通信角度给出一个解释,当然我不肯定这个解释是对的。手机和基站的存在通信这个是肯定的。正常关机的话,手机的操作系统一定是按照固定步骤完成关机的。显然假设其中存在一个步骤通知基站手机关机,这是非常合理的。从而更新数据库中的相关数据确认手机已关闭。所以正常关机后再打入电话就提示已关机。如果直接取下电池,那么所有程序立刻停止,基站或者服务器端没有得到任何信息,当然任然认为手机是开着的。这时再打入,那么服务器还是认为手机开的,然后发出呼叫信号,等待应答,当然等到花儿都谢了也不会有应答了。这样服务器端只能提示无法接通。
就这个问题而言其实还可以做更多实验,比如卸下电池后过一天再打,提示如果是已关机,那么说明服务器和手机之间通信有连接检测机制。或者,去下电池再装上,别开机,然后打入,再马上开机,看看是否能接到。如果可以,说明服务器端有等待并多次尝试连接的通信机制。
以上例子说明在生活中要注意观察勤于思考,用我们知道的知识来解释我们看到的现象。另外一个训练的法方法是,向自己提问:一件事情如何尽可能多的通过写程序让计算机来完成。从这个角度上来说,当一个程序员遇到事情时不能总是想着自己来做,而是要想着如何让电脑来做。坚持这么思考,你会慢慢发现计算机能做的事情会越来越多的,项目中要求实现的有难度的功能越来越少了。当然这种思考不会每次都有结果,但是保持这种习惯对提升能力很有帮助。
4. 智力的培养
在我的看法中智商是最重要的因素。当然智商是先天决定的,但是智商也是可以后天培养的。对于这个事实,我以前的看法是感觉有帮助,但是确认可以后天提升,那是不久前看到的一个报道。这个事实由英国科学家通过研究得到确认了。所以在这里介绍给大家。当然这种提升和先天的智商还有很大区别的,主要有以下几点:
1. 提升的幅度有限
也就是说只能在一定程度上改善智商,但是这点改善就我的体会来说已经很受用了。
2. 应用领域受限
先天的智商可以在不同的领域发挥作用,这取决于个人的选择。而后天培养的智商只能在培养的方向上起作用。当然这一点肯定不是一个问题,能提升能力就行,别的行业我们不关心。
3. 需要持续的培养
这就是说,如果一旦你停止,那么后天的智商就会衰退。所以啊,要勤奋的不间断的培养。
就智商提升的具体手段来说我的体会如下:
1. 看大公司的笔试题面试题
大公司的很多题目都是和专业知识无关的动脑筋的题目。不用去做这些题,你可以简单思考后直接看答案,然后体会一下,并记住思路。这样题目大家可以自己在平时的生活中点滴收集。我可以给一个例子,我曾被问道这样一个问题:如何判定一个单向链表中存在环。这个题目的解非常优秀,很值得欣赏。
2. 向智慧的案例学习
不要理解成益智的案例,或者益智的游戏,类似阿凡提之类的故事不要去看。我举两个例子:
某一届港姐选举时,一个选手被问到这样的问题:希特勒和莫扎特你会选择和谁结婚?如果答案是莫扎特,那么当然不错,但是没有亮点,显然很普通。该选手的答案是选希特勒,理由是这样世界将不会有第二次世界大战,这个答案大亮。
另一个例子是来自周恩来,一次外国记者问中国银行有多少钱,其用意是想通过回答的数字来讽刺中国政府很穷。当然总理看出其意图,总理回答是18元8毛8分。这个故事广为流传,这里就不多说了,不了解的自己google吧。
生活中注意这种训练是会有实际益处的。比如我曾在一次应聘开发职位的面试中被问到这样一个问题:如果给你足够的权力和资源,你会如何把长城从北京搬到温哥华?如果长期坚持对自己智商的训练,那么应对这类问题的难度就会降低,其中的一部分就有可能给出正确的回答。当然更为实际体现还是在我们的开发工作中。我相信应该还会有其他的方法来训练,我也愿意听到大家的经验,如果愿意告诉我,我表示非常感谢。
好了,这次就写到这里,如何解决问题的话题到这里就算是告一个段落了,通过这次回顾我自己也有相当的体会,确实也收获了一些东西。同行们有兴趣进一步交流的可以加我的群:244054966,这个群定位是创业,新手就不要去了。另一个是:231233168,这个群没什么限制。入群时请加上消息:CSDN博客。由于最近工作原因,这个系列是否可以定期发表我不敢保证了,但是我会尽量保持定期。下一篇的话题是什么现在还没有想好,可能是职场相关的,或者设计相关的。