对好书进行整理,把好内容共享。
我见证过许多的程序员的成长,他们很多人在进入成熟期之后,技术上相对较高,一般项目开发起来比较自信,没有什么太大的困难,有的职位上也有所提升,成了项目经理、设计师,有的甚至是到了管理者的位置。又经过很长时间,这些程序员却在也没有什么变化和发展,工作稳定、情绪稳定,好像一切都在按部就班地进行着。有的程序员满足于现在的收入和职位,安于现状;有的程序员却在安于现状的同时,苦苦思索,却找不到自己的上升空间。
我想说的是,满足于现状的程序员并不能成为优秀的程序员,永远也不会实现程序员最初那个梦想。而对于那些思索于未来的程序员来说,探索自己的上升空间是一个非常重要的事,有上进心的人始终是这个社会追捧的对象。那么这个阶段程序员的上升空间在哪里呢?这个问题是仁者见仁,智者见智的问题,同时也是和程序员个体情况相关的问题。因此,我们可以用尝试的心态,提出自己的看法和建议:
1、 技术上的反思和提高
无论程序员个体之间差异有多大,我认为程序员上升空间在于技术上的反思和提高。程序员到了成熟阶段,往往有一种狂奔到终点后的那种感觉,身体疲乏无力,特别需要休整再战。要知道程序员在“奔跑”的时候,一般是在使用自己的体力,很少用到跑步的技术和技巧。尤其是到最后,更是依靠体力来支撑。从技术提高的曲线来看,新手的技术提高速度最快,无论从时间还是急迫性两个方面对新手的压力挺大的。而到了成熟阶段,其编程时间也大大缩短了和学习技术的迫切性也降低了,所以技术提高速度就慢下来许多。在现实中,我们真的看到有些年轻的程序员还看不起那些程序员的技术水平呢,就是这个道理。
因此,成熟的程序员在安顿之后,一定要坐下来反思自己,看看自己的技术发展之路,哪些走的比较踏实,哪些走的比较急促;哪些是自己的技术特长,哪些是自己的技术薄弱环节。反思后一定要抽出时间抓紧学习,把自己的技术上明显不足的地方给补上,这样程序员的技术水平加上丰富经验和工作能力会使得自己更加具有实力,可以应付各种挑战,为今后的发展铺平道路。
而那些顺其自然的思想,使得程序员缺少技术提高的主动性,程序员有明显的技术上的问题,也不主动去解决,而是拖之再拖,从而使得程序员的成熟度大打了折扣。
2、 走向软件设计师
其实很多程序员走到这个阶段已经在做软件设计师工作了。这是绝大多数程序员发展的必经之路。因为,程序员在编程序的时候,一方面会实现设计的功能,另一方面也在对设计有一个理解、认识、熟知的过程。进而慢慢地从学习别人设计,转向到自己参与或独立设计。如果这个程序员真的非常非常喜欢程序员这个职业,则可以转向软件设计师。这个转变很大程度是程序员意识的转变,就是说要把编程的时间,逐步分摊到软件设计上,要把重点从编程实现转变到项目的功能设计上。我这里强调的是“逐步”的一个过程,程序员要逐步减少编程的时间,增加设计的时间,要克服编程的强大吸引力,要主动地攀上设计这个台阶。很难有一个设计师是完全不编程的,而且我认为,会编程的设计师才是真正的设计师。一般这种转变需要花上一到两年时间。
3、 走向项目经理
也有一些程序员工作机遇比较好,不但负责了项目的设计工作,而且负责了项目管理工作。对项目经理这个工作有了一定的尝试。因此,这类程序员可以审视一下自己,是否合适这项工作。如果自己对这种工作比较满意,而且具备项目经理的要求,则可以向项目经理这个方向发展。项目经理承担着项目管理的职责,对项目负主要责任。它和程序员的作用也不相同,项目经理的重点已经从编程转移到对人、对技术、对进度、对项目的管理。由于软件的项目经理与软件项目的相关性太大,因此,他必须要了解软件开发的各个环节、了解开发的各种技术和运用、了解开发队伍人员的水平和特点。所以他依旧和程序员脱不了干系。从程序员到项目经理可以使得项目经理更好地理解程序员在项目中的地位和作用,了解软件开发的各种规律性的东西。从而保证项目的正常完成。而且,项目经理的收入在公司中的地位也是比较高的。因此,我认为走向项目经理是程序员的另一个发展空间。我想提醒一下,程序员在担任项目经理之前最好要把软件设计工作做好,这样在做项目经理的时候,就会有很好的基础。
4、 走向管理者
很多程序员希望自己能成为公司中的主管、经理、老总、老板,这样无论是收入和在公司的地位都相对比较高一些。另外,一方面程序员可能厌倦了年复一年的编程工作,对工作产生了抵触情绪,希望能摆脱这种步步紧逼的工作状态。走向管理者其实要求程序员要比一般人做更多的准备,要做更多的转型工作,并不是想当管理者就能成为管理者的。但是,如果程序员有这个志向和爱好,有积累了这方面的工作经验,自己也感觉在这个方面能够发展,更重要的是有这样的机会,走向管理者也是可能的。由于软件公司的管理者毕竟不同于一般公司的管理者,专业能力越强,管理起来就越得心应手的,没有专业能力的管理,遇到的问题很多,也很难解决。因此,我的建议程序员最好要把编程、项目设计、项目管理等基础打打好。这样转型到管理者成功率就会高一些。
5、 走向软件营销
我一直说,程序员最大的缺点之一,就是眼光只盯在技术上。程序员在入门阶段和成长阶段,这种情况还是属于正常的。但是,到了成熟阶段这种缺点将严重影响了程序员的发展。程序员在工作中不免会接触到用户,不免会了解到用户的需求。从而了解到软件实际发挥的作用,进而了解了自身的工作价值所在。有的程序员则固步自封,不愿意和外界打交道,从内心里坚守技术底线。有的程序员则喜欢和外人交流,喜欢把自己的软件推荐给用户,而且用户也乐意接受这种专业的介绍,用户的接受是程序员价值的直接实现,程序员因此获得了工作成就感。这类的程序员可以将自己的专业知识和产品营销结合在一起,推动软件的销售和服务,转向软件营销职业。这个职业将是一个比程序员更有发展的职业,它可以直接反应程序员的工作能力和工作成果,程序员的收入和销售会直接挂钩。因此,可以让有才华的程序员获得更高的收入,接触到更大的软件市场,看到更广的个人发展空间。
6、 原地发展
当然也有一些程序员惰性比较大,满足于现状,享受着眼前的胜利果实,也无可非议。对待这些程序员,我们不要强求他们改变自己的想法,我建议是原地发展,把本职工作做得更好,把自己的技术水平往上再提高一步。在这个过程中他们的能力和自信心都会得到提高,他们的想法不会一直一成不变的。磨刀不误砍柴功,刀快了自然会去砍柴的。
7、 跳槽走人
还有一种情况,程序员工作很努力,技术水平也有很大的提高,工作成绩也很突出,但是,公司的工作环境让他感觉不好,例如,收入和付出差距很大,而且短期内看不到加薪的可能;自己的技术水平已经超出公司开发所需,英雄无用武之地;公司的经营状况比较差、看不到公司未来;公司的人际关系紧张,小人当道,自己得不到重用等。他可以选择跳槽走人。要说明的是,这个时候跳槽走人你是有本钱的,这个本钱就是你积累的工作业绩、技术水平和工作能力。
程序员在成熟期面临着上升空间的选择,是上还是不上往往决定了程序员今后的发展。水往低处流,人往高处走,只要程序员有向上的意识,不满足于现状,根据自身的特点和资源选择发展方向,我想程序员一定会有很好的发展前途。
打工的是指被发工资的人,“老板”是指发工资的人。很多人有这样一个逻辑:老板是有钱人,当了老板就有钱了。于是乎当“老板”就成了许多人“脱贫致富”的一种理想、一种追求。
程序员经过了一个成长期发展之后,慢慢地成熟起来,原来那种单纯地把技术学学好,把工作做做好的想法也有了一些变化。尤其是那些发展较好的程序员(最好是一个人能独立开发软件的程序员),他们一方面从编程技术上提高很快,另一方面在项目设计、项目管理上也开始了尝试。最重要的是他们看到了软件销售的金额和软件销售的市场。他们发现只要能把软件开发出来,然后把软件卖了出去,自己也能开公司当老板。尤其是当自己的报酬和自己创造出的价值相差巨大的时候,这种当老板的念头更加强烈。
我记得“不想当将军的士兵不是好士兵”这句名言,对于程序员去当老板,我举双手赞成。在中国就是缺少那些有理想,有闯劲的创业精神。看看全国那么多人热衷于报考公务员,我们就可以想象这个国家人们在追求的是怎么样的生活了。从这个角度上来说,程序员无论是在心中想当老板的,还是真正迈出当老板一步的,都是值得那些不想当老板的程序员尊敬的。毕竟,我们更崇尚那些有理想、有勇气的人。
很多人认为这个人当老板是不会成功的,但这个人却成功了;很多人认为这个人当老板一定会成功,但这个人却失败了。这些例子比比皆是。这说明当老板并没有一定的要求,每个人去当老板都可能有其当老板的理由;不是局中之人是没法体会的。所以,对自己不了解东西,不要轻易地给出自己的判断。市场之中,一切皆有可能。
在我身边的程序员也有去当老板的,有成功的,也有失败的。在这么多年IT岁月里,我也特别留心各种程序员当老板的各种报道,总想从中悟出什么道理出来。很多人就是从软件单价*销售个数得出的巨大金额而动心去当老板的。例如,程序员预计这个软件单价为2万元,可能的用户有100个,2*100=200万。程序员就会为这200万而下定决心去当老板了。
我认为程序员当老板应该注意以下几个问题:
1、 要有坚定的信念
要想当老板,不能只想不做,或者今天想做,明天又不想做了,反反复复,犹犹豫豫,当老板的机会就会丧失了。要做,那就要坚定信心,精心准备。准备越充分,信心就会越充足。
2、 要有独立开发能力
当软件公司的老板,并不需要太多的资金。开始的时候,一般只有一个人,或是几个人就能开张了。正是因为如此,当老板的一定要具有独立的开发能力,有了开发能力,才能保证开发周期,才能保证按时向客户提供软件。否则,依靠创业伙伴或招收新员工都有很大可能在规定的时间内完成不开发任务的,或保证不了软件质量的。这样会造成创业的失败。
3、 要有强烈的市场意识
当老板首要的条件就是要具备市场意识,具备市场意识,意味着程序员要把工作重心转移到软件用户在那里?软件能卖多少钱?软件能否销售出去?成本是多少?利润是多少?是赚是亏?诸多方面。如果这种意识不强烈,脑子里还是考虑到程序怎么编?程序要采用什么新技术?,程序要有什么技术含量?这些技术问题上,那这种程序员真的不能当老板。因为当老板应该把绝大多数时间放在市场上,这样市场上才有可能给你回报。就如同程序员把大部分时间放在程序上,程序员的编程技术才会提高。
4、 要有客户资源
很多创业者一般都会有一两个客户的,他们会理所当然地认为,同类的客户都可能是自己的用户。其实这是一个很大误区。潜在的客户并不是很容易地成为自己的用户的。不少创业者做了一两单子后,就是缺少持续的用户而坚持不下去了。所以,当老板一定要首先考虑你的客户在那里,要营销多少客户公司才能维持下来,怎么样才能营销出这么多的客户。
5、 要有克服困难的准备
从现实的角度上来问题,开公司当老板并非易事,我和软件公司的老板们有过交谈,他们的苦衷、苦水、苦头。
6、 要有凝聚力
凝聚力是非常重要的,在创业初期,除了要明确合作伙伴与公司之间的承诺、开发人员与公司之间的用工协议之外,还要把他们凝聚在一起,使大家为了一个目标而共同奋斗。这种凝聚力取决于领头者要具有那种素质,那种能力,给与同伴以信心,给以同伴以信任,给以同伴以支持,给以同伴以榜样。
7、 要有管理能力
当老板要有管理意识和管理能力,开始的时候,程序员的角色还没有转变。以前是别人要自己干什么,自己处于一种被动和等待状态;现在则是要求别人干什么,自己处于一个主动和积极的状态。管理意识则要在创业前就要有所准备,管理能力是逐步提高的。随着企业的发展,管理越来越重要,不重视管理、不具备管理能力,企业就会很快垮掉的。
8、 要有沟通能力
这里的沟通能力,主要是创业者的外部沟通能力。程序员由于长年和计算机打交道,客观上和主观上与外部人员接触比较少,因此,其沟通能力是比较弱的。但是,当老板必须要有沟通能力,才能了解到市场信息、才能把自己的产品介绍给客户,才能进行商务谈判定下合同。
总的来说,程序员在成熟之后,未尝不可去当老板。但是,在此之前,要做些当老板的准备。准备越充分越好。即使失败了,也可以重新去找工作,也可以再一次等待当老板的机会。
程序员在经历了若干年编程工作之后,很想知道自己水平到底如何?自己是否已经成为成熟的程序员?虽然程序员会对自己有一个自我评价,但是,自己的评价和社会的评价、专业的评价会有差异,所以程序员自己并不能肯定这个评价。现实中,除了各种证书之外,很少有人会专门给出一个程序员的成熟度的评价。人们往往是偶发性地就事论事地对程序员的工作作出好与不好,行与不行的评论。因此,程序员对此感到很茫然,不知道要从那些方面去评价自己的能力。
一个程序员到底成熟不成熟,我想从以下几个方面谈谈自己的看法。
1、技术标志
如果程序员不会编程序那决不是程序员,程序员至少要掌握一门程序设计语言,要能够用这种语言去编写程序去解决他想解决的问题。但是,成熟的程序员往往掌握不止一种程序语言,三到四种语言的掌握是必须的,一种二种语言的精通也是必须的。
除了从掌握程序设计语言个数之外,我们还可以从其他几个方面去看看程序员在技术上水平。例如,函数编写能力(命名、格式、大小、分类、参数、复用等),面向过程的能力,面向对象的能力,数据库技术能力,效率处理能力,安全处理能力,网络处理能力,软件构架能力,人机交互能力,通用软件能力,软件文档能力等等。尤其是面向对象技术的掌握和运用,以及面向服务的技术都是成熟程序员所必需掌握的。
2、时间标志
虽然程序员的天资、素质、基础知识各不相同,所经历的工作内容以及环境也不相同,但是,时间也是程序员成熟程度的标志之一。一般程序员需要经过三到五年的时间才能日趋成熟。其中入门需要一年,成长需要两年。这是我经过长期观察得到平均数据。我并不认为成熟时间越短程序员就越聪明,就越了不起。享受每个阶段充分的时间,会让自己成长更加充实、更加成熟。当然,也有超期而不成熟的情况,这也是很正常的。
3、项目标志
程序员的社会性是程序员成熟的标志之一。没有参加过项目的程序员,程序编得再好,只能是纯程序类的程序员,是一个孤独的高手,是一种个人型的程序员,远没有成熟。项目作为社会性活动,体现了项目的社会价值。所以项目能力也是程序员成熟的重要标志之一:项目能力包括参加项目的个数、项目的大小、在项目中承担的角色等等。就项目承担的角色而言,主持开发(项目经理)3个以上项目是必须的,这是一个必要条件。一个程序员如果没有主持过开发,无论参加过多少项目的开发,无论是在程序编写或项目设计上发挥了多大的作用,是很难被称之为成熟的,因为项目的组织、协调和管理是反映一个程序员成熟程度的又一个标志。就如同一个程序员能参与过10个以上大大小小的项目或能参加或能主持两个以上大型项目的开发,其成熟程度是可以信赖的。若低于此数,则说明程序员离成熟还有相当的空间。“我们在项目中成长”可见项目对于程序员的意义是多么的巨大。
另外,一般程序员只是为一个企业客户进行开发一个或多个项目,或同行业的企开发项目,如果程序员能够如果程序员能够开发过多个行业的项目,其成熟度要比一般人要高一些。
4、思维标志
幼稚和成熟在思维方式上还是有很明显的区别的。就程序员而言,不成熟的程序员逻辑性不强,程序编得没有条理,即使程序员自己进行了解释也没人能看懂。而成熟的程序员应该具有很强的逻辑性,程序编得井井有条,不用解释别人也能看得懂。这种逻辑性还体现在软件的构架设计、数据库设计、算法设计等多个方面。程序员通过全集子集概念、时间概念、顺序概念、重点非重点概念等对各种事物进行逻辑分析。例如,以顺序概念为例,不成熟的程序员往往会采用自底向上的思维方式来开发程序。他们先考虑程序的具体实现,然后再考虑功能设计、最后考虑构架设计。而成熟的程序员则采用自顶向下思维方式,先考虑构架设计、再考虑功能设计、最后才考虑编程的具体实现。前者思维方式主要是出于工作惯性,只适合入门阶段,而后者思维方式反映了后者的进步,适用于各种项目开发或大型项目的开发。
除了在思维内容上的逻辑性之外,程序员还应该处理好动脑和动手的关系。重视思维本身就是一种成熟的标志。成熟的程序员的思考时间要大于动手编程时间,想好之后只要一次就编程成功,而不成熟的程序员往往动手编程时间要远大于思考时间,而且是边做边想,通过反复来逼近最终目标。
另外,在思维范围上,成熟的程序员要比普通的程序员有更开放视野。他们更容易去接受新的东西,更容易不受各种约束去考虑问题,更勇于去挑战自己和高手。
5、与人交往
很多人认为程序员是和计算机打交道的行业。这只是这个职业的特点。但是,只要是工作必然就是一种社会劳动。而社会劳动则必须和人进行交流和沟通。尽管程序员的劳动工具是计算机,但并不意味着程序员只想着这个工具。从这个工具的下游来看,程序员还是要考虑用这个劳动工具生产出来的软件产品是否有人购买,是否有人使用,是否运行正常,从这个工具的上游来看,是谁让程序员了解设计方案的,是谁让程序员编程序的,是谁让程序员程序通过验收的等等。因此程序员在软件制作各个环节都会与其他人打交道。只有和人进行有效的交流和沟通我们的工作才能进行下去才能做的更好。
如果一个程序员还沉浸在个人劳动的意境之中,对外界持有冷漠、无奈、恐惧的心理,内心里不愿意和外界打交道,无论自己感觉自己的技术水平有多高,还是一个不成熟的程序员。而成熟的程序员一定是特别重视与人的交往,无论是上级领导、外部客户、项目经理、团队同伴这些与自身工作密切相关的人还是那些非同单位同行朋友、网友等他们都会认真去听取别人的阐述、要求、意见、建议、反馈等。从中得到更多的工作上的、技术上的、生活上的好的想法,以便自己参考和吸收。与此同时,与人交往也反映你有好的想法和好的技术水平交流出去,而这些想法和技术水平也是你成熟度一种反映。那些没有想法和技术水平的程序员的确是怕和别人交流的。
与人交流的有两个基本能力,一个是理解能力,一个是表达能力。两者缺一不可。例如,有的程序员理解能力差,不能理解项目经理提出的要求,有的程序员表达能力差,无逻辑,无重点,啰里啰唆,让别人不知所云。这都是不成熟的表现。
6、别人评价
别人的评价尤其是单位同事以及对自己工作情况比较了解的人对自己的评价是有参考价值的。一般而言,评价差的,一定是不行的,是不成熟的。评价好的要看情况而定,单位同事对人的评价会从两个方面来考虑,一个是这个人的为人情况,一个是这个人的工作能力。如果两者都不错,我们有理由认为这个程序员是成熟的。反之,无论是工作能力强,但为人不好,为人很好,工作能力不强,我看都不能算一个成熟的程序员。
所以,程序员要注重别人对自己的评价,在提高自己技术水平的同时,学会做人,做好人,学会与他人分享,这样别人才会给自己更好的评价。
无视别人评价其实,也是一种不成熟的表现。只有自己感觉好,大家感觉好,那才是真的好。
其实,别人的评价如果仅限于自己单位的话,恐怕这种评价的价值会打折扣,如果这个单位技术人员的人数很少,水平普遍很低,即使你鹤立鸡群,大家对你的评价很好,但是,你和其他公司和单位的程序员来比,你真的不一定的成熟。所以,我说别人的评价仅仅是一个参考。
7、收入标志
收入也是成熟程序员一个参考标志。收入的大小往往是对程序员社会价值的认可度,表明程序员的劳动值这个价钱。一般而言,成熟的程序员能够挣得软件业平均收入的中上水平,或者在一个单位或部门中能够挣得比80%左右员工要高的收入。而刚参加工作不久的程序员收入应该与其相差很大的。另外,单位的项目奖金发放也可以看出程序员在项目中的地位和作用。
现实中,我们知道程序员的收入和其付出是不是正比的,而且,越是能力强的、贡献大的程序员,可能不一定比那些不如其它能力不如他的程序员高出许多。这不是软件行业的通病,几乎所有行业都存在这种情况。通过分析我们认为程序员成熟度应该是和其收入高低挂钩的。如果,我们知道我们能力和贡献大大超出我们的收入,我们就有理由向上级领导提出自己的收入要求。
8、心理素质
程序员常常面对各种各样的成功和失败,尤其是失败更是多于成功,这也是程序员这个职业特点之一。以编程为例,几乎没有一个人一次就能把程序给编好的,它总是要遇到各种语法错误,总要遇到各种遗漏,一个程序要反复多次修改调试才能完好。有的程序员因找不出来程序的bug,束手无措,哀声叹气,心里极其不爽。以工作为例,有的程序员因工作进度和程序出错常常受到别人的批评和指责,心里极其不满,认为批评人不了解造成这个结果的客观原因,批评错了人。从而对人产生意见,甚至对工作造成了影响。面对失败和挫折,成熟的程序员会坦然面对:编程时出现问题不可怕,有什么问题就解决问题,解决不了的问题可以想其他方法进行解决,不在一棵树上吊死。面对别人的批评和指责,首先从自身查问题,是自己的问题,那就要主动承担责任,并尽快改正。不是自己的问题,应该换位思考,理解批评人的焦急心态,并找机会给予说明。良好的心理素质在面对困难和挫折的时候,就会很坦然,很坚强,很自信。
程序员也会面对成功的。有些程序员因开发了某个项目,因编写了某个程序而感觉良好,在不自觉中表现出我最牛,我最好的样子,面对他人夸夸其谈,而对其他人不屑一顾。而更有甚者并其无成果,表现平平,却依然会摆出一个高手的样子,有的仅仅参与了某个项目,而且不是项目主要开发者,却会贪天之功,归其所有,好像这个项目是他主持开发的。这些其实也是心理素质不成熟的另一种表现。成熟的程序员面对成功并不会感觉到高人一等,该是自己的功劳就是自己的功劳,该是别人的功劳就是别人的功劳,即使自己比别人水平高出许多,他还是在想还有更高的技术顶峰等待攀登,不可自傲,看到别人取得的成绩首先感到去祝贺,然后去学习,而不是心怀嫉妒,从中挑刺,尽量贬低。
良好的心理素质使得程序员更加理性地处理好各种成功和失败带来的各种问题,更有利于程序员超越自我,以平常之心去迎接更大的挑战。
当然一个程序员是否成熟是一个仁者见仁,智者见智的话题。有的人强调程序员的个人能力方面,有的人强调是程序员的社会能力方面。我认为从以上8个方面综合地去评判一个程序员是否成熟应该能说明些问题了。我们标志成熟,一个目的是对程序员前面成长过程给与一个肯定和鼓励,让程序员认清自己的所处的阶段,让自信找出依据。另外一个目的是对程序员未来成长提出更高的要求。走向优秀是程序员面临的更大的挑战。
很多程序员到了成熟阶段后,就会处于一个停滞状态。技术上已经驾轻就熟,工作上已经按部就班,心里虽然感觉有些不甘,但是何去何从他们显得很茫然很无助。我认为程序员到了成熟阶段后,如果还想要向优秀阶段发展,一定会遇到这个瓶颈的,穿过这个瓶颈就会走进另一片开阔的前景,穿不过则会停留在原地止步不前。
1、技术瓶颈
技术上的瓶颈是很明显的,主要表现在,对学习缺乏热情,对技术缺乏钻研,对新技术发展缺乏了解等三个主要方面。其中原因主要是:第一,成熟的程序员编程技术已经能够满足开发软件的要求,很多人认为只要能编出来就行了,至于编得更好,那就要看兴趣了,看时间允许了。第二,由于成熟程序员承担着比一般程序员更多的工作,比如软件设计和项目管理,比如和用户打交道、和领导打交道,很多时间精力无法放在编程上面。第三,由于软件开发任务一般都比较紧,工作起来必须加班加点才能完成,因此,没有时间再做技术上的深入。第四,很多程序员处于一个自发的发展状态,自己的成长完全取决于自己工作内容,工作内容强度和复杂程度决定了其技术水平的高低,因此,他自己根本不知道自己技术发展的方向是什么,技术上的差距是什么,也就无从谈起自己的努力的方向。
因此,成熟的程序员应该有更上一层楼的意识,千万不要固步自封,夜郎自大。首先要对自己在技术上有一个客观的分析,看看自己的长项在什么地方,弱项在什么地方。对自己的弱项就要想办法进行克服,千万不要留在那里,日后必然会影响自己的进步。比如,很多人弱项在面向对象的设计方法,人机界面交互,大数据量处理,处理效率等,如果有这些方面的问题就要想尽办法去解决。其二,要注重编程基础技能的深入掌握,很多时候程序员只是拿来主义,知其然不知所以然,把基础缺失的那个部分再补回来,为今后向更高的技术境界打下基础,比如像操作系统,网络知识、程序设计语言、数据库、系统构架、软件工程等基础知识,要重新审视,把其中有用的知识掌握好,并且要学会把各种基础知识给串联起来,加深对基础知识的认识。其三,要逐步把编程技术从功能实现方面转向参数化设计、软件构架等高级阶段方面的研究,在共享、通用、标准化方面有所建树。
2、工作上瓶颈
程序员在工作上也存在向上的瓶颈。就一般而言,很多程序员在这个阶段工作上比较稳定:领导对自己相对比较了解和信任,同事对自己的工作能力和技术水平也比较认可,软件用户对自己的服务也相对比较满意。因此,在充满工作上的满足感的同时,工作上日复一日,没有什么新意,疲倦感油然而生,而以往那种激情很少有地方释放了。所以,程序员有时也会思考自己在工作上究竟要在什么地方进行突破,究竟怎么才能更上一层楼。
程序员在工作上的现状,还是来自于软件公司或部门上级的安排所致,尽管自己在具体工作上付出很多,编程上有很大的自主权,但是从总体上来看,程序员只是企业经营过程中的执行人员,是一个被动的角色。因此,程序员要改变工作上的现状,程序员必须要有主动意识,尽可能主动地规划好自己的发展方向,主动地向上级反映自己的想法和打算争取上级的理解和支持,在工作条件许可的情况下,把自己的时间和精力以及主点放在自己关心的方面。例如,程序员感觉自己编程方面已经满足工作要求了,但是自己与客户打交道的能力,市场资源的积累很差。他就可以向主动上级提出自己想做售前工作,如果领导同意,则可以在这个岗位上,提高自己这方面的能力。在岗位不调整的情况下,可以根据自己的工作范围,尽可能多多和客户打交道,了解客户的需求,从而为自己开发的项目做好基础,同时通过与客户打交道和客户交朋友,为自己的市场资源做些积累。其实在工作层面上可以有很多值得改进的地方的。
3、收入上瓶颈
说到底程序员最大得瓶颈在于收入上的瓶颈,虽然经过多年的努力奋斗,收入也有了一定得提高,有的甚至达到了社会平均收入的中上水平。但是,面对中国的生活现实,买一套房需要花光几十年得收入(即使按揭还是要每月偿付本息的),而且工作很难稳定到几十年不变(除非是公务员)。因此,绝大部分程序员的收入是很难满足那种程序员向往的生活,尤其是过上中等生活的要求和过上稳定生活的要求。当然,例外总是有的,极少的程序员收入也是相当高的,生活过的很滋润。就普遍情况来看,我们付出的和得到的是不成比例的,这不能不说是社会的一种悲哀。回到某个程序员具体情况来看,程序员的收入一般比较稳定,有的一年动一次,有的几年动一次,这要看所在各公司情况和所在单位部门情况而定。程序员和其他职业的员工一样很少在工资收入方面有自己的话语权。
程序员经历了成长过程的风风雨雨之后到了成熟阶段,收入应该比过去高了许多。但是程序员的预期和实际收入的反差是程序员内心最大的烦恼,因此,增加收入或大幅度增加收入是程序员无法突破得瓶颈。
面对收入瓶颈,程序员应该调整心态,光靠埋怨是绝对无用的。要解决这个问题,程序员可以从以下几个方面来考虑。第一,程序员可以本公司部门进行收入增加的挖潜,可以主动提出调整到收入高的岗位,可以参加高奖金的项目开发,凡是能够增加收入的各种工作都可以考虑去做。第二,在这个基础上,如果程序员感到自己的收入还是无法达到自己的预期,不妨可以考虑离开这个公司或部门,通过应聘高薪工作的方式来提高自己的收入,当然这种选择还是要慎重的,要考虑多方面的影响,很多情况下收入不是唯一的因素,未来收入和现有收入很小的差距更是忽略不计的因素。第三,程序员在条件和精力的许可的情况下,可以从事一些第二职业,由于程序员这种职业特性,程序员可以独立完成某个编程任务,也可以和其他人共同完成编程任务的,通过从事第二职业,程序员可以增强市场意识,可以比本公司、本部门知道更多的软件的价值,结识更多的软件同行,学习更多编程技术,并且获得相应的劳动报酬。更重要的是在此期间可能会遇到自己发展的机遇。
满足现状的程序员就不可能遇到这些瓶颈,他们会在一个自己的世界中得到满足,他们会在这种满足下持续自己的工作,求得一份平静的生活。而那些不满足现状的成熟程序员,那些追求优秀的程序员,因追求而困惑,因瓶颈而求突破。程序员只要不甘于现状,只要认定一切要靠自己,只要准备付出比过去能多精力,只要准备克服比过去跟多的困难,只要求新求变,最终都会破茧成蝶的。那绚丽的天空下,那自由飘飞的彩蝶正是他们未来的身影。
从技术层面上来看,优秀程序员和一般的程序员相比,其中一个重要区别就是重心从程序制作转变到构架制作。绝大部分程序员关心的是如何将各种各样的需求通过计算机语言进行编程实现。因此他们有三个方面的重点:需求、编程、需求到编程那个过程。所以他们的主要精力在用于需求是什么?需求怎么变成功能设计?如何实现功能的程序编写?他们的出发点是需求,终点是程序。
随着我们编写程序的数量增多,我们慢慢地会发现有两条主线同时在运动,一条是用户需求,一条是程序编写。就用户需求而言,我们就会发现不同用户的项目之间的需求比较类似,做的越多我们看到相同的需求或类似的需求就越多。在程序编写方面,我们面对相同需求或类似需求的时候,就会自然用原来的程序或用原来的程序进行修改来完成了。同理,程序编写的越多,我们用到的原来的程序的次数就越高。这种现象是和需求趋同的规律是一致的。在项目开发过程中,我们就会自然而然地将相同的需求用相同的程序来完成。于是,我们就会产生了需求和程序之间的对应关系。例如,我们想要在A项目中检查一下用户的权限,我们自然就会想起以前在B项目编写过的check_usr_right这个函数。于是我们就会把这个函数拷贝过来用在A项目之中。虽然,拷过来的函数并不能完全满足项目A检查用户的权限要求,我们可以对check_usr_right函数进行改造,这样就成了新的check_usr_right函数了。如此一来,我们就会积累出很多相同的程序,这些相同的程序表现为公用函数、控件、类库等。这种编程方法和最初一心实现需求、采用原始的连续性编程方式相比,开始考虑了软件构架问题了。
那么什么是软件构架?软件构架就是站在软件自身角度上(而不是站在需求角度上)编制软件的技术方法。通俗地说是软件之上的软件。如果我们一个窗户看作一个项目,那么窗框就可以看作成构架,而窗框里的小框和玻璃以及玻璃上的贴花和贴膜,则可以看作小构架和构架下的各种功能。我们可以看到,窗户的形状(方形,长方形、半圆形、异形等)是由窗框决定的,而窗框中的小框和玻璃等是在窗框范围之内的。因此,我们可以这样认为,软件构架决定了这个软件的大范围和构架,而其中的功能软件则是在这个构架之下的功能实现。
既然我们知道软件构架是软件之上的软件,那么软件构架和我们一般程序有什么不同呢?我认为其不同之处在以下几个方面。
1、 抽象和具体之间的差别
一般程序主要是解决具体的需求,形成一个具体的功能。比如,要计算1+2等于几,非常之具体,程序员容易理解。而软件构架并不针对一个具体的需求,比如,要进行算术表达式处理。当然这个算术表达式的处理,也可以处理1+2等于几的需求,但是,这个算术表达式是抽象的,并没有具体的需求,但是能处理具体需求。
2、 大和小之间的差别
一般程序主要是解决具体的需求,程序很小,功能点也比较直接,并不复杂。而软件构架则是软件之上的软件,考虑问题比较多。例如,它要考虑软件的整体的一个构架,构架中的各种模块的功能,构架中的模块之间的关系和接口,构架怎么与具体程序相联系等各种问题。因此,构架程序量是很大的,功能也相对复杂。
3、 高和低之间的差别
一般程序在解决需求时并不会去给软件分层,最多是按B/S,C/S,或者是按表示层、逻辑层、数据层三层构架来进行程序分层。另外,一般程序只要能满足具体需求就OK了,其技术上的并没有硬性的要求。但是,软件构架就不同了,它是将软件进行了分层处理,最上面是构架,最下面才是具体功能。因此,软件构架对技术要求相对是比较高的,比如程序的结构,程序的效率,程序的通用性和扩展性,程序的并发处理、程序的例外处理等等。这样有了软件构架概念之后,软件就分为构架软件和具体软件两个部分了。构架软件处于上层,可以应用于各个项目,而具体软件或称具体程序则处于下层,这个具体程序和我们现在所说的一般程序很接近,这两者结合形成了具体的项目或系统。
4、 全面和局部之间的差别
一般程序主要是解决一个项目的某个具体需求,因此,它体现出程序的局部性,所以一个项目可以给不同的程序员去完成。软件构架在设计时或者在制作时,则是站在全局的高度来审视整个抽象的项目,一方面要考虑构架本身的功能,另一方面要考虑到如何向具体程序提供合适的接口。这两个方面都需要对项目或软件有一个整体认知,而不仅仅限于某个局部。
当然以上的差别是非常宏观的,并不很具体。但是,有一点是可以肯定的,那就是软件构架制作是和一般程序编写不同的。这一点需要程序员去细心地体会的。如果一个程序员没有软件构架的意识,只是满足于停留在一般程序编写的优劣之中,那是很难进入优秀程序员行列之中的。那么什么是软件构架的主要内容呢,程序员应该关注那些问题呢?
1、 构架意识
意识,我仍然在强调意识的重要性。没有对某个事物重要性的意识,就不会关注和研究这个事物,就不会去主动掌握这个事物,就不会利用这个事物去创造更大的价值。同理,如果我们的程序员没有构架意识,就会在普通程序员中求得那种优越感,时间一长就感到自己在软件中没有可以发展地方。而有了构架意识,我们的程序员就可以在原有的编程基础上,向更高层面发展,那里有更大的空间需要我们去学习和展示自己的才华,可以说构架领域中的学识和技术是没有止境的。
2、构架制作
光有构架意识还不够,还要让构架从设计走向程序,这就需要进行构架制作,也就是说我们要编制构架程序。而编制构架程序,就涉及到具体的程序设计语言,涉及到具体程序语言的特性、涉及到具体程序设计语言的编程技术和技巧。这些编程需要程序员要有很扎实的编程基本功,很高的程序设计的技巧,以及程序编制的丰富经验。构架制作绝大部分都是面向对象、面向抽象功能、面向通用、面向参数化的编程。
3、 构架应用
我们不能为构架而构架,我们编制构架的其中目的,就是可以更快、更好、更节约地开发出我们的应用系统。如果我们编制的构架不能运用到具体项目开发中,或者编制的构架反而比普通的编程效率更差,质量更差,达不到我们预期的目标,那么我们的构架只能是失败的构架,失败的构架比没有构架更加糟糕。因此,我们要编制那些有用的构架,并且通过具体项目的开发来验证构架的正确性和有效性。可以这样说,开发的项目越多,构架的积累也就越多。只有这样我们才能让我们的构架更加具有实用性和实用价值,在开发和运用中发挥越来越大的作用。
4、 构架研究
构架一方面是一个实用的程序,另一方面也是一门学问,它需要理论和实践的不断地结合和完善来体现其价值。例如,我们如何划分构架程序与具体程序之间的界限;我们面对各种应用系统是采用统一构架方式,还是采用多构架方式来完成项目的开发;我们在应用构架时如何设计和应用参数,并使得参数运用更加简便合理;我们在采用不同程序语言在制作构架时应该注意什么问题;我们如何处理构架与具体需求之间的关系;我们怎么利用具体程序与构架之间的接口实现动态程序的挂接等等话题都是我们可能要面对和解决的。因此,我们要静下心来,要学习构架各种知识,要大量积累项目开发经验,区分那些是属于构架方面的功能,那些是属于具体程序方面的功能,研究采用什么样的编程技术才能达到构架的最佳效果。理论和实践的结合才会让我们长成腾飞的翅膀。
采用构架的方法开发程序可以让你的程序技术上个档次,让你的项目结构更加清晰,让你的项目开发更快更好,让你的项目更具有可维护性和具备可扩展性。
没有构架的约束,我们可能更加自由,但是,有了构架的约束,我们可以让自由更加有价值。追求价值才是我们最终的目标。