主题:[转帖]程序员的培养
软件开发是以人为核心的过程,对人的依赖性远高于传统的硬件生产企业,为了保持开发能力的稳定性,一方面需要定义软件过程,以过程为枢纽将人、技术、工具衔接起来,另一方面也要加强人才的培养,使人的工作能力能够稳定、提高人员的自治性。随着社会需求的膨胀,对程序员的需求量、对熟练的程序员的需求量在剧增,然而对程序员的培养问题却成了一个盲点,学生在学校里学习的是关于软件开发的基础知识,软件企业需要的是熟练的能够快速开发出产品的程序员,需要程序员具有很强的实用知识,因而出现了明显的学校教育与实际需求脱节的问题。企业反映新毕业的学生知识老化、动手能力太差、缺乏实用理论知识、缺少工程管理知识等问题。尽管社会上有各种各样的专业程序员培训班,但是距离企业的实际需求仍然有较大的差距。在企业中培养一名合格的程序员一般需要3个月到半年时间,对企业来讲,这个周期就显得太长了,所以一般的企业不愿要新毕业的学生,企业希望程序员能够“来则战之,战则胜之”。无论如何,对程序员来讲总是要面临一个成长的过程,希望学校或者培训班来解决这个问题很难,因为程序员不是标准件,程序员不是教育出来的,是在实践中干出来的,最终还是要在实践中来培养程序员,这是任何软件企业必须承受的,因此,对软件企业来讲需要有一套机制,一套办法来培养程序员。
那么,我们需要从哪些方面来培养程序员呢?大体来讲,包括以下几个方面:精神、能力、理论基础、工作方法、工作习惯。
1、精神
软件开发是一项智力劳动,需要开发人员很投入的工作,因而需要开发人员能够热爱软件开发,有工作热情,有投入的精神。如果一个程序员缺少一种投入的精神,他不可能在最需要他投入精力的时候来工作。有的人很聪明,但是他对软件开发没有兴趣,或者他工作很不专心,杂事很多,工作效率很低,别人1天能干完的,他需要3天甚至5天才能干完,而且还漏洞百出,这样的程序员需要尽早识别出来,尽早转换工作。
现在的工作环境对程序员的诱惑很多,比如游戏、QQ、各种新闻等等,这些诱惑使不能很好处理这些关系的程序员浏览忘返,浪费了大量的时间,降低了工作效率。程序员的业绩很大程度上不是取决于其智商,而是取决于其情商。
2、能力
程序员最主要的能力可以概括为3点:良好的逻辑思维能力、良好的沟通能力与良好的学习能力。
良好的逻辑思维能力
软件的开发过程是解决复杂业务逻辑的过程,是简化复杂逻辑的过程,是用精确来实现模糊的过程,开发人员需要具有良好的逻辑思维能力才能胜任。现实空间是模糊的,数字空间是精确的,在现实世界中很简单的问题,在数字空间中来模拟时,就变成了一个复杂的问题。它要求程序员能够全面、准确、简洁地把握问题、分析问题、解决问题。
在笔者接触过的很多程序员新手中,很少有程序员能将下列的题目解答的完全正确:
画出解答下面问题的程序流程图:输入三个整数,作为三角形的三个边,判断是否构成:等边、等腰、直角、锐角、钝角三角形。
这个题目的逻辑很简单,需要的处理的逻辑包括:
1 输入的合法性判断:输入的是否是正整数
2 是否构成三角形:任意2边之和大于第三边
3 是否构成等腰或等边三角形
4 是否构成钝角、直角、锐角三角形
答题者常见的错误有: 序号 常见的错误
1
没有判断输入的合法性
2 没有判断是否构成三角形
3 判断为其中一种结论时就结束了,没有考虑到:等边三角形也是锐角三角形,等腰三角形可以是钝角也可以是直角或锐角
4 程序内部逻辑复杂
上边的题目是一个很简单的程序,但是类似的逻辑问题在实际的软件开发中是经常用到的,需要程序员能够对各种情况进行仔细的分析、归纳、总结,如果在这样的问题上出错是很难成为出色的程序员的。
沟通能力
现在的软件越来越庞大,根本不是单兵作战能解决的,需要多人来协同工作,比如一套简单的进销存系统可能就要产生30万行代码,按每人天生产100行代码来估算,也需要3人年,再加上分析、测试等的时间,需要6人年才能完成,因此就需要开发人员具有很好的沟通能力。作为程序员要善于沟通,习惯沟通。程序员在交流问题时,往往在描述问题是什么时要花费大量的时间。这种现象在项目组中是经常出现的:在给一个程序员布置任务时,讲清楚任务比他完成这项任务花费的时间还要多,而有的程序员自己心里明白,但是说不清楚,或者干脆就不说,这些情况都会降低整个团队的工作效率。
学习能力
软件的新技术发展很快,开发人员必须能够不断的跟踪、学习新技术,要有很好的学习能力。只有善于学习的人,才能够不断进步,在实践中快速成长。真正优秀的程序员一定是掌握了很好的学习方法的程序员,否则现在是优秀的程序员,2年后可能就被淘汰了。
3、理论基础
如果基于.net做多层结构的软件开发,以下的知识是必须的:操作系统原理、实体关系理论、SQL语句、OO基本理论、数据结构、VC++/JAVA、COM/DCOM、ASP/HTML、PSP/TSP/ISO 9000/CMM、专业英语、程序设计风格等。可以看出如果没有学过数据结构、程序设计方法、数据库概论、以及软件工程的基本知识,要想在现在的环境下成为一名合格的程序员显然是很困难的,而且一名熟练的程序员需要的知识可能还远不止这些。掌握了基础的计算机科学理论,再拥有一定的学习能力,才能不断的进步。
4、工作方法
有很多程序员不会高效率的编写程序,也不知道如何高效的调试自己的程序,这不仅仅是对于工具掌握不熟练的问题,而是没有掌握一些基本的方法。做为程序员来讲需要掌握几种最基本的方法如:程序的设计方法、程序的调试方法、新工具的学习方法等。
在很多程序设计的课程中都讲解了程序的设计方法和调试方法,但大都是从理论的角度来讲解的,而不是从工程的角度来论述的。比如说对于事件驱动的编程,在程序设计时首先要做的应该是穷举事件,然后再设计事件之间的信息共享的机制,设计事件的内部处理逻辑等,这些基本的方法往往是程序员迷惑的地方。再如调试程序时采用常规错误检查单、单步执行、内存变量查看等方法。
在实践中经常看到很多程序员在学习一种新的开发工具时,不知道从何下手,对老师的依赖性很强,总是希望有师傅手把手地来教他,这一方面是个人的认知能力问题,另一方面也说明他没有掌握基本的学习方法,如:
在学习一种新语言时,先通读有关的类、标准函数,过程等,从整体上有个印象,当需要时可凭记忆查询资料。
类比。 与以前熟悉的语言进行类比。
询问他人,互通有无。
阅读示范程序。
网上检索相关的资料等。
5、工作习惯
良好的工作习惯是程序员个人开发过程成熟的体现,是效率的保证。程序员的培养很大程度上是习惯的培养。有的程序员总是没有写注释的习惯,结果一个月后他要花费很长的时间才能读懂自己写的程序;有的程序员经过简单考虑后就急于去写程序,往往是把简单的问题搞复杂了,复杂的问题搞乱了,效率很低。对于一个好的程序员必须养成一些好的工作习惯:
按照明确的编码过程工作
职业的程序员设计的时间长于编码的时间,业余程序员编码的时间长于设计的时间;职业的程序员是设计程序,业余程序员是调试程序;职业的程序员是预防BUG,业余程序员是修改BUG。为什么会出现这种情况呢?因为职业的程序员一定是按照一个规范的编码过程来工作,编码的前期工作量超过了其实际的编码工作量。在进行任何一项编码工作时,需要按一个规范的过程来进行。首先要定义清楚做什么,包括功能范围、接口,任务要明确,不能似是而非;其次要想清楚如何作,包括数据结构、算法;第三,要定义清楚验收标准,如何检验自己做对了;第四,动手编程序、调程序;最后,测试程序。按照规范的过程来编码,才能真正提高工作效率。
编码之前写文档
软件设计文档是软件实现思想的载体,是开发人员之间、开发人员与管理之间交流的工具,是设计人员与编码之间、设计人员与需求人员之间的一种约定,是组织的软件设计经验的积累,是组织软件财富的记录,是软件复用的基础。只有真正认识到了设计文档的重要性,才能积极主动的来写文档。对程序员而言,在动手编程之前通过写文档可以把实现的方法想清楚、表达清楚、讨论清楚,这是已经通过无数的实践来证明了的好经验。 初级的程序员往往在写程序的过程中发现越写越觉的复杂,程序越改越乱,等真正把工作做完了,再反思一下,却发现原来是很简单的事情,为什么会有这种感觉呢?问题就在于事先没有真正想清楚,弄明白,一旦进入问题的解决细节中,就很容易出错了,所以职业的程序员应该是培养起写文档的好习惯。
遵循设计进行编码
程序员不能随意自己决策,不按设计人员的设计去施工。同一个问题,可能有多种解决方案,在考虑解决方案时,程序员想的是局部,设计人员想的是全局,因而在进行决策时,设计人员是从全局的角度的考虑问题。在这种情况下,程序员要严格按照设计去实现,不能在如何实现上偏离设计,造成隐患。对于设计中有疑问的问题,可以讨论,但是不可以随意变更。
按照良好程序设计风格编码
有人讲程序设计是一门个人艺术,他饱含了程序员个人的创造性,正是这样,才使得很多程序构思精巧,耐人寻味。但是同时它却使得程序的可读性较差,尤其是在多个人合作开发一个软件时,风格迥异的程序使得软件的可靠性与可维护性大大降低。程序设计语言一方面是人与计算机之间进行交流的工具,它还是人与人之间进行交流的工具。单纯的作为人机交流的工具,只要程序能够正确地忠实地表达设计者的思想,也就发挥了其作用,但是人与人之间的交流没有一种固定的统一的模式,因此作为人与人之间的交流工具,还要表达的清晰易懂,能够为其他程序员所理解,这也正式要求程序员讲究程序设计风格的主要原因。
维护好自己的开发环境
俗话讲:磨刀不误砍柴工。程序员的工具主要就是计算机,程序员必须维护好自己的开发环境,常用工具要装齐,无用的软件不要装,要定期杀毒、定期备份,减少非正常停机,确保环境能够正常进行,保证环境的干净,否则就会因为环境的问题降低工作效率。
总之,培养程序员是一个长期的艰苦的过程,程序员是可以培养出来的,顶尖的程序员是在职业的程序员中选出来的。
引用地址:http://blog.programfan.com/trackback.asp?id=15318
那么,我们需要从哪些方面来培养程序员呢?大体来讲,包括以下几个方面:精神、能力、理论基础、工作方法、工作习惯。
1、精神
软件开发是一项智力劳动,需要开发人员很投入的工作,因而需要开发人员能够热爱软件开发,有工作热情,有投入的精神。如果一个程序员缺少一种投入的精神,他不可能在最需要他投入精力的时候来工作。有的人很聪明,但是他对软件开发没有兴趣,或者他工作很不专心,杂事很多,工作效率很低,别人1天能干完的,他需要3天甚至5天才能干完,而且还漏洞百出,这样的程序员需要尽早识别出来,尽早转换工作。
现在的工作环境对程序员的诱惑很多,比如游戏、QQ、各种新闻等等,这些诱惑使不能很好处理这些关系的程序员浏览忘返,浪费了大量的时间,降低了工作效率。程序员的业绩很大程度上不是取决于其智商,而是取决于其情商。
2、能力
程序员最主要的能力可以概括为3点:良好的逻辑思维能力、良好的沟通能力与良好的学习能力。
良好的逻辑思维能力
软件的开发过程是解决复杂业务逻辑的过程,是简化复杂逻辑的过程,是用精确来实现模糊的过程,开发人员需要具有良好的逻辑思维能力才能胜任。现实空间是模糊的,数字空间是精确的,在现实世界中很简单的问题,在数字空间中来模拟时,就变成了一个复杂的问题。它要求程序员能够全面、准确、简洁地把握问题、分析问题、解决问题。
在笔者接触过的很多程序员新手中,很少有程序员能将下列的题目解答的完全正确:
画出解答下面问题的程序流程图:输入三个整数,作为三角形的三个边,判断是否构成:等边、等腰、直角、锐角、钝角三角形。
这个题目的逻辑很简单,需要的处理的逻辑包括:
1 输入的合法性判断:输入的是否是正整数
2 是否构成三角形:任意2边之和大于第三边
3 是否构成等腰或等边三角形
4 是否构成钝角、直角、锐角三角形
答题者常见的错误有: 序号 常见的错误
1
没有判断输入的合法性
2 没有判断是否构成三角形
3 判断为其中一种结论时就结束了,没有考虑到:等边三角形也是锐角三角形,等腰三角形可以是钝角也可以是直角或锐角
4 程序内部逻辑复杂
上边的题目是一个很简单的程序,但是类似的逻辑问题在实际的软件开发中是经常用到的,需要程序员能够对各种情况进行仔细的分析、归纳、总结,如果在这样的问题上出错是很难成为出色的程序员的。
沟通能力
现在的软件越来越庞大,根本不是单兵作战能解决的,需要多人来协同工作,比如一套简单的进销存系统可能就要产生30万行代码,按每人天生产100行代码来估算,也需要3人年,再加上分析、测试等的时间,需要6人年才能完成,因此就需要开发人员具有很好的沟通能力。作为程序员要善于沟通,习惯沟通。程序员在交流问题时,往往在描述问题是什么时要花费大量的时间。这种现象在项目组中是经常出现的:在给一个程序员布置任务时,讲清楚任务比他完成这项任务花费的时间还要多,而有的程序员自己心里明白,但是说不清楚,或者干脆就不说,这些情况都会降低整个团队的工作效率。
学习能力
软件的新技术发展很快,开发人员必须能够不断的跟踪、学习新技术,要有很好的学习能力。只有善于学习的人,才能够不断进步,在实践中快速成长。真正优秀的程序员一定是掌握了很好的学习方法的程序员,否则现在是优秀的程序员,2年后可能就被淘汰了。
3、理论基础
如果基于.net做多层结构的软件开发,以下的知识是必须的:操作系统原理、实体关系理论、SQL语句、OO基本理论、数据结构、VC++/JAVA、COM/DCOM、ASP/HTML、PSP/TSP/ISO 9000/CMM、专业英语、程序设计风格等。可以看出如果没有学过数据结构、程序设计方法、数据库概论、以及软件工程的基本知识,要想在现在的环境下成为一名合格的程序员显然是很困难的,而且一名熟练的程序员需要的知识可能还远不止这些。掌握了基础的计算机科学理论,再拥有一定的学习能力,才能不断的进步。
4、工作方法
有很多程序员不会高效率的编写程序,也不知道如何高效的调试自己的程序,这不仅仅是对于工具掌握不熟练的问题,而是没有掌握一些基本的方法。做为程序员来讲需要掌握几种最基本的方法如:程序的设计方法、程序的调试方法、新工具的学习方法等。
在很多程序设计的课程中都讲解了程序的设计方法和调试方法,但大都是从理论的角度来讲解的,而不是从工程的角度来论述的。比如说对于事件驱动的编程,在程序设计时首先要做的应该是穷举事件,然后再设计事件之间的信息共享的机制,设计事件的内部处理逻辑等,这些基本的方法往往是程序员迷惑的地方。再如调试程序时采用常规错误检查单、单步执行、内存变量查看等方法。
在实践中经常看到很多程序员在学习一种新的开发工具时,不知道从何下手,对老师的依赖性很强,总是希望有师傅手把手地来教他,这一方面是个人的认知能力问题,另一方面也说明他没有掌握基本的学习方法,如:
在学习一种新语言时,先通读有关的类、标准函数,过程等,从整体上有个印象,当需要时可凭记忆查询资料。
类比。 与以前熟悉的语言进行类比。
询问他人,互通有无。
阅读示范程序。
网上检索相关的资料等。
5、工作习惯
良好的工作习惯是程序员个人开发过程成熟的体现,是效率的保证。程序员的培养很大程度上是习惯的培养。有的程序员总是没有写注释的习惯,结果一个月后他要花费很长的时间才能读懂自己写的程序;有的程序员经过简单考虑后就急于去写程序,往往是把简单的问题搞复杂了,复杂的问题搞乱了,效率很低。对于一个好的程序员必须养成一些好的工作习惯:
按照明确的编码过程工作
职业的程序员设计的时间长于编码的时间,业余程序员编码的时间长于设计的时间;职业的程序员是设计程序,业余程序员是调试程序;职业的程序员是预防BUG,业余程序员是修改BUG。为什么会出现这种情况呢?因为职业的程序员一定是按照一个规范的编码过程来工作,编码的前期工作量超过了其实际的编码工作量。在进行任何一项编码工作时,需要按一个规范的过程来进行。首先要定义清楚做什么,包括功能范围、接口,任务要明确,不能似是而非;其次要想清楚如何作,包括数据结构、算法;第三,要定义清楚验收标准,如何检验自己做对了;第四,动手编程序、调程序;最后,测试程序。按照规范的过程来编码,才能真正提高工作效率。
编码之前写文档
软件设计文档是软件实现思想的载体,是开发人员之间、开发人员与管理之间交流的工具,是设计人员与编码之间、设计人员与需求人员之间的一种约定,是组织的软件设计经验的积累,是组织软件财富的记录,是软件复用的基础。只有真正认识到了设计文档的重要性,才能积极主动的来写文档。对程序员而言,在动手编程之前通过写文档可以把实现的方法想清楚、表达清楚、讨论清楚,这是已经通过无数的实践来证明了的好经验。 初级的程序员往往在写程序的过程中发现越写越觉的复杂,程序越改越乱,等真正把工作做完了,再反思一下,却发现原来是很简单的事情,为什么会有这种感觉呢?问题就在于事先没有真正想清楚,弄明白,一旦进入问题的解决细节中,就很容易出错了,所以职业的程序员应该是培养起写文档的好习惯。
遵循设计进行编码
程序员不能随意自己决策,不按设计人员的设计去施工。同一个问题,可能有多种解决方案,在考虑解决方案时,程序员想的是局部,设计人员想的是全局,因而在进行决策时,设计人员是从全局的角度的考虑问题。在这种情况下,程序员要严格按照设计去实现,不能在如何实现上偏离设计,造成隐患。对于设计中有疑问的问题,可以讨论,但是不可以随意变更。
按照良好程序设计风格编码
有人讲程序设计是一门个人艺术,他饱含了程序员个人的创造性,正是这样,才使得很多程序构思精巧,耐人寻味。但是同时它却使得程序的可读性较差,尤其是在多个人合作开发一个软件时,风格迥异的程序使得软件的可靠性与可维护性大大降低。程序设计语言一方面是人与计算机之间进行交流的工具,它还是人与人之间进行交流的工具。单纯的作为人机交流的工具,只要程序能够正确地忠实地表达设计者的思想,也就发挥了其作用,但是人与人之间的交流没有一种固定的统一的模式,因此作为人与人之间的交流工具,还要表达的清晰易懂,能够为其他程序员所理解,这也正式要求程序员讲究程序设计风格的主要原因。
维护好自己的开发环境
俗话讲:磨刀不误砍柴工。程序员的工具主要就是计算机,程序员必须维护好自己的开发环境,常用工具要装齐,无用的软件不要装,要定期杀毒、定期备份,减少非正常停机,确保环境能够正常进行,保证环境的干净,否则就会因为环境的问题降低工作效率。
总之,培养程序员是一个长期的艰苦的过程,程序员是可以培养出来的,顶尖的程序员是在职业的程序员中选出来的。
引用地址:http://blog.programfan.com/trackback.asp?id=15318