码迷,mamicode.com
首页 > 其他好文 > 详细

论程序员的成长

时间:2015-04-17 15:33:52      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:


《论程序员的成长》

Athson | 2015-04-04 ~ 2015-04-17

原文地址: http://blog.athson.wang/?p=45 

技术分享  知识共享许可协议文本:简体中文版
本著作由Athson、Athson Wang、鹏澍原创,以 CC 署名-非商业使用-禁止演绎 (by-nc-nd) 授权条款 执行公开许可。
此作品衍生自http://blog.athson.wang/


 

论程序员的成长

Athson | 2015-04-04 ~ 2015-04-17

 

中国程序员的个人成长,首先离不开中国软件的发展。

在《第五项修炼》一书中,有一个游戏:啤酒游戏。值得我们借鉴思考。一个相似的系统困局:“你看不到自己与他人的订单之间相互作用而产生的影响,……参与者其实是更大系统中的一部分,而身处其中的多数人都对系统感到迷茫。……最终,一个恶性循环会影响到另一个恶性循环……”,从而“使整个系统里的问题日趋恶化”。

在中国软件的发展系统中,便存在着这么三个相互关系的角色:企业,程序员与客户。企业,为程序员提供了机器、时间、组织等各类资源;程序员,则为企业提供了所必须的知识才能;客户,为企业提供了发展所必须的资金。当我们讨论个人成长的时候,不能不牵涉到其它两个角色的成长。同理的,当我们讨论个人成长之痛的时候,也不能不牵涉到其它两个角色之痛。只有明晰过这些错综复杂之痛,我们才能一窥今日这个“恶性循环”的系统回路,然后解决它,然后获得自己长远的发展。

目前,中国的软件状况,作为企业方,多有责备程序员不够才华,不称其职,谓之企业“人才短缺”之困。此中深意,其一方面是责备程序员本身不够努力奋进,还有另一方面也是责备中国大学教育之缺失,以致社会无“合格人才”之苦。不论如何,总是多多抱怨其他,而很少,甚至从不反省自身。企业盘踞着如此多的社会资源,试问企业自身又是否物尽其用了呢?试问企业又是否意识到自己身上的社会责任呢?试问在软件企业中,有管理职能且熟悉掌握软件工程方法的管理者又是几何呢?还有除却财务报表之外,试问又有多少企业的高管在认真的设计自身企业的绩效考核和招聘事宜呢?有人事部,有招聘专员,有KPI,有项目评审,有导师制度,企业就真的获得了高的生产力吗?还是所有的东西,都沦为了官僚和教条的玩意,变成了一场“自私”的游戏?孔夫子讲“己所不欲勿施于人”,我们在抱怨其他之前,是不是应当回归美德,看看自身呢?

而作为程序员一方,又多有责备企业不够“良心”和能力,既不懂得管理,也不懂得技术,特别的,诟病于企业内对技术人才的不尊重。于是,无论有实学没实学的,每每多寄望跳槽,抑或创业,这类逃避的方式来“表明心声”。鲜有人能意识到“不积跬步无以至千里”的道理。其实,改变现状,就从自己的身边开始。我们要学会去主动面对,去用专业主义向他人证明那个高贵的自我,去通过真理的斗争来表明立场。否则,当程序员从这家“糟糕”的企业去了另一家“糟糕”的企业,各种都是坑,又怨得了谁呢?

一个更坏的恶性循环是,基于各家企业糟糕的管理,似乎它们对“人才短缺”的恐惧胜过了对公司前途的关注,于是便马马虎虎的处理招聘事宜,它们对面试程序员的简单价值定位,给这些频繁浪费资源的逃避行径大开了方便之门,甚至有火上浇油之势。这些不仅虚张了程序员的“气焰”,使其更加拥有跳槽或者独立的资本(其实就成为了泡沫,因为并没有产生新的价值),同时也进一步压迫了企业的发展空间,因为这时,企业为了留住人才,必须不断的抵兑上一家企业或者行业内带来的资本泡沫(技术上的和福利待遇上的),然后一轮又一轮,这些滋生的泡沫就像雪球一样,越滚越大,而平庸的程序员们,也凭借着这一次又一次的“冲浪”,拔得了头筹,最终或许就开启了另一个“糟糕”企业的管理模式。在这个恶性循环之下,平庸无能者成为了最大的赢家,而有真才实学的程序员,企业以及整个软件行业则是最大的输家。

作为一名合格的程序员,若果真有好好的为自己将来做打算的话,那么放弃抱怨,坚定职业道德,学会融入企业,变革企业,就会是一种比抱怨、跳槽、创业或者其他任何逃避的方式,都要好得多的选择。事实上,对于一名以计算机为终身职业的人而言,这还是一份不得不做的斗争,是一场注定不能逃避的战斗。因为企业以及由领袖企业所领导的这个行业,它们并没有多少抵御“泡沫诱惑”的动力,谁也不想当出头鸟,谁都想要好看的财报,源源的财富,它们或许知道“绥靖政策”最终会殃及自己,但它们也清楚这盘子毕竟大,在棋局的收官阶段,依然有些缓冲,得以抽身而逃,而最先输不起的,便会是为这个行业抛头颅洒热血的人们。在这些毫无节制膨胀的泡沫中,他们会是第一批被挤掉的空气。所谓“行业好,个人才会好”,也便是这么个道理。

                还有一类糟糕的情形,便是在程序员中,对客户也是多有抱怨,责其无知专横,特别的,诟病于客户对需求的不确定以及对于开发过程细节的强硬干预。对此,我们便拿起了一面叫做“职业尊严”的正义大旗,和他们针锋相对,希望通过我们的“鄙视”,“咒骂”,“怨恨”等等努力,能让他们某天突然悔悟,然后洗心革面,重新做人,然后“唯程序员是从”,或者,至少能懂得理解程序开发之苦也是好的。但显然客户们没有买账,相反,这种对抗,使得种种矛盾不断升级,终于,双方不再互相信任,开始拒绝沟通而各执一词,虽还为同事,但已然充满了怀疑和警戒。作为出钱方的客户,不愿蒙受更多的损失,他们于是变本加厉的要控制开发细节,从而又引来了程序员们更多的怨恨。如此恶性循环,最终项目流产或者失败,客户丧失了所有的价值,而程序员也丧失了所有的荣耀,至于整个行业,则都沉浸于这阵阵痛苦之中,无法自拔,更不用讲“伟大”或者“幸福”的话了。

                这其实是一种集体的“疯狂”,不妨试想如果整个软件行业都是精诚合作的,那么一两个程序员对客户或者对企业的抱怨,大伙一定能嗅出其中的坏味道,都能说出一个普遍的道理:只有双赢和合作才有未来。那么反省一下我们自己,自己是不是就纵容了这类集体的“疯狂”呢?程序员当前所面临的这各种“坑”,是不是就有自己的一份责任呢?故我以前作诗云“今人历史今人著,遍因循果徒伤悲”,便是这么一番意味。终于,论程序员的成长,终于只是“好自珍重”,这么个简单的道理了。

                不过,别一方面,作为客户方,也的确有无知蛮横的人存在,在中国稚嫩的软件行业中,这些人甚至非常普遍。这其中缘由,我想其一,应与中国企业落后的管理,导致平庸无能者频频上位,身居要职有关,其二也是由于中国软件行业才兴起没有多么深远的时间,于是,行业本身还未成熟,而社会对于这个行业也缺乏足够的时间和经验来理解与协作。如果慢慢的,我们也有了强大专业的行业协会,能给社会多多科普,能通俗的展示出行业内严谨的工程方法之外,也可解释我们的种种“性格”。在经过更多的了解之后,社会一定会重新给予我们足够的信任与尊重,然后一同携手完成一份“精彩”的工作。很显然,在那个纯粹的世界里,人人都会清楚的意识到,唯有精诚合作才是对各方都好的做法。

只是,现实是,在我们期盼有那么个强大专业的协会之前,我们还有一个困境需要面对:一个客户之于企业的恶性循环。

要知道,软件本身对社会其实并不产生实际价值,它只是一些虚拟的用以表示二进制数的高低压电子在循环流动而已,它一定要借由影响各类社会实体,从而产生价值。“软件即服务”,看似是种新的云概念,不过也果真是道出了软件的本质来了。在今后讲到软件外包的时候,还要不断深化这个思考,这里便也就不再展开了。总而言之,软件并不能像农业等实体经济那般,独立的生存,它必须有所依凭,而它所依凭的东西,我们则统称为“客户”。软件企业所依凭的客户是否“靠谱”,将直接决定企业的兴衰生死。而当下,中国大环境下的企业环境并不好,实体经济发展乏力,立足实体经济的软件服务也难以生存,中国软件乘着世界互联网泡沫的浪潮,即便在其已经破灭的今天,还一直只在服务圈内打转,而很少有落实自己的价值于农业或者工业,或者制造业等这些实体经济的身上。这种依附服务业市场的想法,其实风险和弊端尤大。

创办一家服务业的企业,成本相对于工业或者农业来说,要低得多,而且绝大部分的服务并不需要多么高深的技术背景。中国服务业企业层出不穷的创办起来,固然有些繁荣的氛围,但反之也意味着,这其中竞争者越来越多,也将难以产生垄断的企业或者市场(当然前提是市场没有出现新的增长点,比如生产力的提高,政策的变动等等),各方企业资源都非常有限,再加上服务需求这个东西,很有可能朝令夕改,社会的趋势,说变也就变了,企业发展犹如走钢丝,有的企业甚至数月之后便随即破产。试想,在如此的市场环境下,我们的客户又如何会愿意损耗巨大的成本来做长远的规划?他们又如何舍得花费更多的资金在“虚无缥缈”的IT服务上?免费的IT服务当然不妨一试,但提供免费IT服务的软件企业又如何维生,甚至壮大呢?有人说依凭广告收入,然而广告也只是某种宣传的服务,其市场价值依然受于实体经济规模的限制,一个提供服务的企业去打广告,说到底不过就是服务业的自我炒作而已,市场的份额吃了一些,但市场的盘子还是那么大,如此反而导致了更加激烈的竞争,最后,企业资本变得越发薄弱而难以做出更加巨大的成就。宣扬这类盈利模式者,实则于自身,于行业无益。

另一层根本的问题还在于,所有的服务,都需有所服务的实体,通过产生实体的实际价值,而收取其中的附加价值。从市场的系统思考来说,一个服务的市场份额或者说价值,绝不会大于所服务实体的“整体”实际市场份额或者说价值。如果说一个市场,其实体经济衰败,但非实体经济却欣欣向荣,那它一定出了问题,市场中一定滋生了许多的市场泡沫,甚至是在孕育一个泡沫炸弹也不一定。我们的软件企业对“客户”的错误定位和评估,便给软件行业注入了各类虚假繁荣的景象,也带来了各类“黑”科技和改变世界的噱头,比如人工智能,移动互联网,物联网,云计算,大数据之类等等,好不“高大上”,可问题还在于谁来买单?哪家又真的会有其研发的实力呢?于是,做一些盲目的规划,盲目的投资,这种“看不到自己与他人的订单之间相互作用而产生的影响”的认知水平,其企业便也不过逞了一时的匹夫之勇,最后终于要折戟沉舟,落荒而逃。稍有些实力的企业,也顶不过是垂死挣扎而已,所谓成长为世界性的,真正改变世界的,优秀的“国际企业”,到底痴人说梦,自我意淫罢了。所谓“社会环境不好,企业也难以独善其身”,也便是这么个道理。

中国的软件企业,固然有理由责备目前的市场环境不景气,但另一方面,也要意识到自己的社会责任,主动承担起社会发展的义务,那才是对自身发展最好的选择。如果企业抱怨学校教育失败,无法提供优质人才,那何不投入一部分企业资源,支援教育事业。如果企业抱怨程序员不够才能,那何不投入一部分企业资源,关注程序员的个人成长,提供其培训发展的平台;另一方面,也通过实施严谨有效的考核和招聘制度,杜绝平庸无能者对其资源的浪费,以及对其系统的伤害,从而保护那些踏实努力和真才实学之人的成长环境。

事实上,企业是拥有强大生产力的社会组织,我们要摆脱现在中国软件的困境,企业的作为将会成为决定性的力量。

我不禁想到借鉴《精益创业》一书中的思想:“增长引擎是新创企业用来实现可持续增长的机制。……这些可持续增长的来源为我所说的“增长引擎”的反馈循环提供了动力。增长引擎就像内燃机一样不停转动,反馈循环发生得越快,公司成长得越快。”

在我们的软件系统中,企业就是我们走向良性循环系统回路的变革引擎,而“可持续增长的来源”,客户所提供的资金,便是这架变革引擎的燃料;程序员,就是组成这架变革引擎的零件。这将会是一个系统的协作工程:变革引擎本身要有一个良好的结构和设计,然后通过匹配精湛工艺打磨出的优质零件,才得以支持我们变革引擎7x24的强力运作,再加上毫不参假的纯粹优质燃料,才能让这台变革引擎高效的运转。在《第五项修炼. 实践篇》中的开头,第六节:“如何推进建设学习型组织的战略思考”中,便提出了一套“深层学习循环”与“组织结构设计”相结合的系统战略,用来帮助企业实施正向反馈循环的系统变革,非常值得我们参考借鉴和深入思考,从而得出一个适用于我们系统困境的系统解决方案。

但这还仅仅只是一个开始,在这一路上,毫无疑问,系统思考将是我们强有力的武器,而彼得.圣吉伟大的著作《第五项修炼》则必将是我们不可不读的真知灼见与指路明灯!

暂时,我无法全盘考虑清楚,实在没法把这变革的过程,具体的描绘出来。我所着力关注的只系统思考中的一个方面:心智模式。

“心智模式”这个术语,《第五项修炼》解释得很好,最好读者也能去深入阅读一番。我通俗的简单些做个比方说,就好比要构建一个真正的民主社会,光有民主制度还不够,我们还需要真正的民主思维和意识,这民主思维和意识,就是一种心智的模式。它是讨论关于你如何看待问题的方式方法的研究。我们要搞民主与科学,但仍旧按着封建的思路走,那事业定就搞不成,“中体西用”的破产就是最好的教训。

咱们中国软件的复兴亦是如此,没有一个正确引导的思维意识,那就脱不掉失败的命运。思想,可以说是改革的第一步,它可以马上实施,而且成本极低,效率极高。只是也因其思想所固有的主观性特质,总是是是而非,难分对错,难断利弊。思想改革将会是风险最高的一份事业。极其又极其简单容易的,我们就会陷入到哲学形而上的讨论中去,迷失了初衷,舍本逐末,终于失败无所成。

要破除这个窠臼,很难,但也不是完全没有办法。思想意识,说到底都为着某个系统结构而发生着。而对于一个系统的结构,这类客观的主体,我们是可以测量与评估的。在对某个系统结构获得一致的价值认同后,我们便能由此定夺出某份思想是否适应了这个系统的结构,而分出对错优劣来。

哲学家黑格尔说“存在即合理”,那么在一个“恶性循环”的软件系统中,也定有其中引导出那个循环的错误思想,如此才是合理的。

我们要改变那些错误的思想认识,便要树立起一些正确的思想认识。其中,我所思考的结论目前便有了以下三点:其一,程序员对于知识的培养应该要甚于对于技术的痴迷;其二,优秀程序员的定位应该是多元多维度的,我们不应该单取某个方面就妄下断言;其三,软件行业的从业者们都应该秉承一份实用主义和专业主义的工程师文化。

首先说这第一点,其实认同的人颇多,但显然真正去做的人很少。这就像拖延症,人人都知道不好要改,但就是死改不掉,戒烟戒酒的,也是一例。都很好的说明一个事情若不是真的透彻到自己内心震撼而心服口服,我们终究难以正视它,难以获得足够的信念来认同坚持它。所以,类似《拖延心理学》这一类剖析透彻事物的书,就很有之必要。于程序员而言,就不能不首先去读一读《程序员的职业素养》这一本书了。

毫无疑问,知识比之技术,要更加深邃根本。技术每天都在推陈出新,但其实多数不过某类知识换汤不换药的做法或者几类知识的简单组合。我们追逐技术,而遗忘知识的沉淀,舍本逐末,则注定是在玩一场必败的博弈游戏。

这其中,我们会颇感为难困惑的兴许是,如何界定知识与技术的界线?

倒是有一种不很严谨但颇有启示的说法,讲:“数学解释物理;物理解释化学;物理和化学解释生物;物理、化学和生物解释心理;物理、生物和心理解释社会……”。知识与技术的界定总是相对的,我们取相对的衡量尺度便在于看一个事物是否能够解释出另一事物(当然也有些能互相解释的复杂情况,但不必如此纠结,纯粹做一公理存在即可),那些能够承担解释功用的事物,便是知识,并且越是能贴近客观公理解释的,则越是根本性的知识,其所包含的效用范围也越加广阔深远。比如,有些技术牛人,研究并摘录出某段核心源码,用来解释其技术应用的细节,这当然是某种知识的积累,但倘若还能剖析出发生这种技术背后的设计决策,则那些知识就要更加根本,适用效用也更加广阔,几乎能适用到所有软件的开发中去。“知其然,更要知其所以然”,也便是这么个道理。

但这也不是说盲目的学习知识,而忽略技术就是好的。事实上,对世界发生作用的,一定是某种技术,而不会是由知识直接产生。知识是对技术的某种抽象,这个高级抽象要对世界产生价值,又先要具体化为某种技术才行,这一“装箱”,“拆箱”的反复操作,其性能效率可想而知。所以,于现实中,我们是很有必要在“本地”驻留某些技术,以便能及时生效的获取到价值。想想 .NET CLR 中的IL语言,那几乎是所有 .NET 编程语言的根本解释,但显然,你把它搞得熟透,却对C#之类具体语言的语法知之甚少(特别一些便捷的语言技巧),企业也定不能收你这“高徒”了。机器语言也好,汇编语言也好,也都是这么个道理。

故哲学家问“明天和未来,哪个会先到?”显然,不会有一个没有明天的未来。那么在未来到来之前,我们就总不可避免的,要为了明天,去做出某些,便是在未来也有所贻害的抉择。对于知识与技术这个具体的命题来说,则也适用了这一哲学的困境。我们短暂的一生,有限的精力和时间,这些便都逼迫着我们必须要有所规划与平衡,最好能做到既可真正的造福世界,也不会因此丧失了革新世界的才能。

而回顾当下,便会发现我们所面对的最大问题就在于没有找到这个最佳平衡,我们是:对于技术过于“痴迷”了些;而对于知识又过于傲慢轻薄了些。

说起对技术的“痴迷”,倒是很可以理解。“最先进的科学,往往与魔法无异”,而魔法秀,大家都很爱看,觉得惊奇,个人和企业对此趋之若鹜,不自主的想要学习到这些诡异高深的手法,都人之常情。只是倘若这份好奇的进取心沦落为了盲目肤浅的心态,以致忽视了这些魔法背后的“努力”和“知识”,则大错特错矣。

其实,知识不通过经年累月的努力积累,是难以有所成就的。但恐怕许多的程序员们并没有能切身领会到这句话中的份量。所谓“经年累月”,少说十年,多说便是一辈子,我们若是没有这番信念,也谈不上会有多么深厚根本的知识,而没有这么深厚根本的知识,也便是谈不上那些“改变世界与未来”的高尚想法。其所谓“努力”者,不废寝忘食,不读书万卷,不身体力行,不可至其高度也,不至其高度,又何谈其深厚呢?

想必还是有好些程序员感受不到这些“厚重”。最好的,还是只能通过提高自身的素质与修养,慢慢通达明智哉。苦口婆心,多说无益,姑且作罢。

再讲其第二点,其实是对第一点的延伸和扩充:知识也有着很多的面,不特只在专业知识上做出价值判断。

我个人按着各类知识的某些特性,分出了一套职业体系,做出六类角色:科学家、程序员、工程师、管理者、设计师、架构师。相信我们能得以重新定位自己的价值与追求,终于既不过于自卑,也不至于傲慢。

科学家,多做理论的研究,算法的开发,一类关于建立模型及其论证的任务,亦是真正承担研发任务的角色。虽然绝大部分的团队都用不到如此的重型武器,但毫无疑问,有志一番事业的组织,则这个角色将必不可少。

程序员,价值在于熟练使用多种多样的已知算法和多种多样的编程工具(比如数种编程语言,数类开发工具等)。其不受业务领域的局限,而可为所有软件开发团队提供支持。他们虽然弱于创新研发、设计分析、管理之类的职能,但他们却是团队中最注重技术,也是最精通技术,还是拥有十八般武艺的一批实战专家。在国外这一人群很多,但国内的话 ,多有误解,以为肤浅低级,不受尊重。这一人群的缺乏,也便造就了当下多有“拿着锤子,看到什么都是钉子”的行业氛围。用一个不适用的工具去完成任务,其实是一种浪费,就好比用勺子运沙子的例子。我们要避免这一类的浪费,就得着力发展这一角色的人群才行。

工程师,在编程技术上,往往不如程序员广泛高深,多只精通一门语言和某一些特定的工具,对于算法也多是一知半解,不过够用的份量罢。但他们在抽象上的功力则不容小视,在技能素质上,取综合与实效。能熟练掌握到其设计模式的精髓,也能独立的完成程序设计和分析的任务,熟悉软件工程,对程序有着工艺质量上的追求,但也不至于死磕艺术的态度,他们讲究实用,以顺利按时按量按质的完成工作任务为首要目标。他们综合的学识和优秀的态度,使其得以能在某一特定的编程领域内工作得得心应手,也能和编程领域之外的各类角色顺畅沟通与合作,是深受企业青睐的一类人才,一般也会是开发团队中人数最多的一个人群。目前,国内各方也都是主要着力培养这一角色的人群,但至如今输出到社会的,能真正符合了这角色素质的人,还是相对要少,导致这个人群里鱼目混珠的多,社会组织对其的信任和尊重都在受到严重的挑战。

管理者,除了实施软件工程的过程管理之外,还需要涉及项目的,团队的各种管理工作。他们善于分析与综合,在编程的技能上甚至会毫无经验,但一定要求有能力,能控制各类生产要素,来获得团队和项目的整体最优状态。讲起软件的管理,这不论中国,便是世界的,其本身还是稚嫩,很多难题,比如如何量化团队成员的技能指标,如何量化客户满意度,如何量化软件质量等等,这些还都是在发展之中,悬而未决的课题。管理者要在其知识并不完备的状态下,独自摸索来完成任务,其中便要承担很多的风险与责任,从而,对其从业人员的素质要求就是极其的高。国内企业中,有优秀管理者的,怕只十之一二也,于是在业内,对其都普遍缺乏价值认同和应有的尊重。思考这其中的缘由,或许是在大学教育里学IT管理,只讲些其实还不完备的教条理论,于社会实践上效用极低,有的理念甚至有害。而企业内对管理人才的培养,又多做井底之蛙,只以本企业内部固有的文化与知识来做标准,评判人才,最后不过原地踏步,甚至倒退回原始的状态。其实殊不知,这一类的人才所需要的是一类综合才能的智慧,而并非执着于某一领域的智力,所有只是遵循教条理念的管理者,都注定要在未来的某一时刻面临失败。他们所要真正学习的,应该是分析与解决问题的能力,比如说系统思考的才能。

设计师,虽然对于他们而言,技术不是不重要,只是在工作中,思维总是要甚于对技术的考虑。无论是美术设计也好,程序设计也好,组织设计也好,但凡是涉及到要提供优雅解决方案的任务,都有他们的身影。他们总有一份才能,得以从浅显的技术性问题看到背后的结构性问题,从而用一种优雅艺术的方式从根本上解决它。与之相对的,你看工程师们频频打补丁修补程序,就明白团队中,设计师这一角色有多么的重要。有的时候,他们对于艺术性会过于追求而忽视了实际的限制,多少便难免有害于团队的实效输出能力。但也正是因为他们的这份执着追求,才使其成为团队中最具有激情和创意的一群人,而成为团队的活力源泉。

架构师,则是一群坚持在软件之中做哲学思考的固执高人。他们对于事物本质上的思考,几乎不留余地,致力于以极致质朴简练的抽象,来表述系统结构。去繁为简,变难为易。为设计师的工作提供导向,为工程师,程序员的工作定义框架,为管理者的工作管理流程。他们会是团队中知识最广博,综合素质最高的一群人,也能顺畅的和各类角色的人物打交道,广受团队成员的尊敬与爱戴,而自然而然的成长为团队的精神领袖。与科学家一样,虽然绝大部分的团队都用不到如此的重型武器,但毫无疑问,有志一番事业的组织,则这个角色将必不可少。

目前,我们业内对于程序员的能力评定,最差的便是粗暴的单就技术高低论,而且似乎还很有些“祖先崇拜”的情结,以为越古老的技术,越是高深厉害,于面试的方面,反而落伍满足不了实际的工作需要。其中,我尤其想要纠正的便是业内至今对于算法和数据结构的“执着”,似乎没有办法手写出课本上几种基础算法或者构造出课本上罗列的几种基础结构来,就不会编程,不能谓之程序员一般。其实,软件技术不断的发展,有些“作古”的知识,已然被内化封装,而成为非必须掌握的知识了。比如像C#、Java这一类高级语言,都已经提供了非常高级的结构和算法接口给程序员使用,这一些类似自然语言的算法接口使得程序员即便不理解其算法背后的实现,依然可以编写出有用的程序来。只怕很多“高深”的计算机人士还是对此多有辩言,我本人也是浅薄,不做深入研究,只列一案例罢。从前的程序员编程除了软件设计上的知识,还必须要硬件设计上的知识才行,但有了操作系统后,我们便只需要调用系统的API就可以完成编程,于是程序员的面试便从硬件相关的问题变成对其系统和系统API相关的问题,后来有了Web,便是计算机系统相关的也不面试了,而关注于对于浏览器相关的问题。一个做Web应用开发的程序员,企业还会要求他对操作系统也要透彻了解吗?类似的,那些“作古原始”的算法和数据结构的知识,我们是不是也应该改变为对其实现语言的了解和使用呢?那些算法设计类的试题,是不是应该从技能型面试中剔除,而只在需要算法设计的职位上使用呢?企业想要招到合适的人才,是不是也首先提供一个明确的招聘目标,一个准确的人才定位,再开始招聘呢?一个简单的“软件工程师”定位是招不到你想要的人才的,即便他是一个真正的人才。程序员在自我培养的成长之路上,是不是也要破除对“祖先崇拜”的心理,而把时间和精力放到更加重要的方面去呢?

比如放在对自我才能的培养上。这知识也好,技术也罢,到底是人创造出来的,没有了人的才能,也就没有了人的知识。我们忽视了人的才能,也就限定了成长的高度。我所得出的以上这六类角色,便是抛开了程序员技术和知识上的束缚,而关注其才能的分析与定位。所谓人的成长,真正讲的还是人的才能素质的成长。我们有了才能,就可以创造知识,研发技术,从而获得自信和能力,得以面对所有的未知和难题。只有这份才能,才是我们改变世界和未来的根本力量。

还有些案例,无论是在面试的时候,还是在企业内晋升的时候,都被问及是选择管理路线,还是技术路线,这也莫不是对程序员成长的巨大误解。人的才能是综合共存的,就好像游戏角色一样,既有防守能力,也能进攻,只是通过不断的升级,慢慢的人物会突出其中的某个能力来。作为程序员,其实以上六种角色的素质都是有一些的,每个程序员都可以做出某个架构,或者设计来,只是在工程专业性上会有所高低好坏之分,而随着自我的不断培养,某些专业的技能会得到不断提升,终于,便成长为了不同的角色定位。而且,不难发现,其各类角色的才能很有些重叠,这也意味着,几类角色之间是可能互相转化的,才能并不像知识或者技术那般固定的存在于某些具体的领域,它可以跨越知识领域的阻碍,而最大化的满足生产力的要求。比方说,工程师的角色稍加培养就能很好的胜任过程管理的职能,而做技术经理之类的职位;程序员的角色通过培养,也能转型为算法设计师、研发科学家一类的职位;作为架构师,只需稍加熟悉了解的功夫,则几乎能承担其余各类的角色职位;作为设计师,通过培养深化,亦能转型为架构师一类的职位。我们程序员对于自己才能角色的定位,需要结合自我的性格、目前的能力、身处的环境等等因素,综合起来慎重考虑,不要被企业或者行业内简单粗暴的直线化安排迷惑了心灵。所谓管理者不能应付技术,或者技术者不能应付管理的话,盖掩饰自身能力不足的缺陷,而发出的明而皇之的借口。其实,对于一个高素质的人才而言,既会专长技术,也能称职管理。因为,高素质人才以项目是否成功为首要目标,而不以自我成功为首要目标,在企业组织中,不论管理输出也好,技术输出也罢,所核心要务还在于保证项目之成功,在这么一个共同追求面前,再加上才能的转化性质,真正的人才又何分管理或者技术,企业又何可以这般分法武断其人才?莫不是企业并非真的缺乏人才,而是因为企业不善于发现人才乎?

此外,我们讲优秀的程序员,除了这些专业素养之外,还需要具备一些人文的素养,这便自然而然的得到第三点:专业主义和实用主义的工程师文化。

其实,工程师文化的定义,很多种多样,工程师各有各的见解,这也不过我个人之见解。

关于什么是专业主义?我们为什么需要专业主义?其中的经验,教训和道理,最好读《程序员的职业素养》一书,实在没有比它所讲的,诠释得更好的了。

而至于实用主义,误解得多,各家也是各有看法,我也有份个人的解读。普遍所误解的,都取用邓小平讲的“不管黑猫白猫,只要能够抓到老鼠的就是好猫”的解释。这一种看法,于别的领域不知,但在软件的方面却是有害的。这种想法既破灭了工程师之于美的追求,也有害于对专业主义,精益工作的追求,最后只会导致一些粗略完成任务的平庸程序员们纷纷获得好评上位,而另一批默默做深入工作的优秀程序员们则被埋没,甚至无辜的为其责任背了黑锅。企业方也好,客户方也好,难辨是非,或者根本便是不辨是非,一旦那些快速开发的程序出现了问题,引发出不满的时候,就都变为了对于工程师团队的整体讨伐,殊不知到底是这类“实用主义”价值观念带来的祸事,其中的每个人都难辞其咎。事实上,在软件工程还不完备而编程技术高度发达的今天,要在软件开发的领域做一只能“抓到老鼠的好猫”,是一件异乎轻松简单的事情,即便一个非专业科目的毕业生,两三个月的快速技能培训后,都可完成一些基本的程序任务。不过现实的情况又怎会如此简单,软件专业又岂会这般粗浅?其实,绝大部分的软件程序需要适用在各类复杂的使用情景,还需要考虑升级和维护的任务,甚至还需要考虑与其他系统的交互任务,显然一个只能完成份内任务的程序是不够的,从程序到产品的蜕变,其中的复杂升级,到底有多么艰难,又需要多少专业的知识技能,读一读《人月神话》便能有所感触。

我所理解的实用主义,自然要保留工程师对于美,对于精益工作的追求,然后也要意识到现实世界的诸多限制。我们工程师应该要有能力平衡各项现实的要素,然后奔着那个美给出一个能够实现的方案。比如软件设计上,你当然可以把软件打造得足够精致灵妙或者高度的灵活定制,但现实中,有多少组织或者应用真的需要如此多“复杂”的特性呢?设计说到底还是“恰如其分”的务实,才最有利于客户利益,企业组织利益和个人利益。这个世界是复杂的,软件本身也是多变的,不会有一个银弹可以解决所有的需要,我们工程师总是在不同的现实框架限制中完成各类工作任务。承认世界的这份不完美,反而使得我们得以完美的完成一份专业的工作。

我相信,我们对于以上这两点的坚持会让我们重获属于工程师的那份荣耀,然后出于这份荣耀,我们才有足够的责任心和使命感来实现行业的变革和成长,最终有利于所有程序员的个人成长。

最后,还想要谈的,是程序员个人的学习方面。至于一些通用的学习方式方法,还是留待往后讨论学习的集子里再讲,这里不过提供一份自我总结的软件专业学习的体系结构图出来,以供记录和参考罢。

中国软件的学校教育之失败,便是败在了没有用发展的眼光看待软件教育。软件教育不能像数学、文学教育那样,教学的体系总是一成不变的持续下去,相反,软件领域的快速发展,也要求软件的教学体系要不断的快速变革,以便可以跟上行业的发展。

一上来,便是深邃难懂的计算机原理或者汇编之类,实在妨碍了人们学习计算机技术的热情,这也有悖于学习要由浅入深,从易到难的方法理论。我们可能从未思考过一个问题:为什么要有计算机原理和汇编语言之类的课程?来回顾历史的话,在计算机刚刚兴起的时候,这些课目显然都是必备的知识,那个时候,没有现在这么高级的编程工具和技术,人们必须要搞懂计算机的内部结构和原理,才能实现各类编程的任务,至于汇编语言,当年也不过和现在的高级语言一样,还是属于应用技术一类的知识,你不学汇编语言,那就只能写更加复杂的机器码编程。还有些编译原理,操作系统原理之类的课目,学习了这些贴近公理解释的知识,自然大有裨益,但在学习的初级阶段就要求掌握,其实颇有难处,特别在目前高级编程技术的发达下变得“深邃高远”,不可循迹之后,理解和实践都很是艰难。更坏的结局是,费时费力之后,发现从这些知识到实用的技术,还需要一段时间的转化才行,而外部残酷的现实却并不认同也并不打算承担这些你个人转化的成本。

那么现在,我们何不换个思路来重新定义软件的教育呢?首先从一些简单的趣味性开始,慢慢的引领人们加入软件的行业,并且抛弃那种要一步登天达到精湛技艺的幼稚想法,而是通过循序渐进的学习实践,来逐步的达到工艺水平的成熟。我想这才是真正有效的学习方法吧。

我所思考的软件学习体系,这第一步却是从人文知识开始的。比方说历史的方面,《浪潮之巅》、《奇思妙想:15位计算机天才及其重大发现》之类的书籍;科普的方面,《编码》、《图灵的秘密:他的生平、思想及论文解读》、《穿越计算机的迷雾》之类的书籍,这一类科普的效用大大强过计算机原理教材的深邃解释,特别适用于计算机的入门。

在人们有些兴趣和历史基础之后,有三个方面可以并行学习:计算机哲学、IT支持、编程语言。

计算机哲学相关的,比如《松本行弘的程序世界》、《代码的未来》、《程序员的职业素养》、《软件随想录:程序员部落酋长Joel谈软件》、《人件集:人性化的软件开发》、《代码大全》、《代码质量》、《编程匠艺:编写卓越的代码》之类的书籍;IT支持则关于办公软件的使用、IT应用系统的使用、服务器或者电脑的管理、网络的架设之类等等的知识;编程语言中,至少要选择一门编程语言,长期深入的学习。

在精通某种编程语言之后,才可进阶学习用其语言所实现的各类软件技术,比如网页开发技术、自动化测试技术、网络技术、安全技术、数据库技术等等之类。与此同时的,还可并行学习一些程序员的数学知识,比起从一开始独立抽象的学习数学,这阶段的数学学习要更加事半功倍:我们可以一边操练编程的语言技巧,一边也可操练数学上程序设计的算法知识。日本结城浩所著的《程序员的数学》就是一本值得推荐的好书,还有一些《机器学习实战》、《挑战程序设计竞赛》、《智能Web算法》、《算法导论》之类的书籍也都不妨上手一试。

最后,在精通一种或数种编程技术之后,便能在软件的设计上,比如《大象:Thinking in UML》、《软件框架设计的艺术》、《.NET设计规范:约定、惯用法与模式》、《设计模式:基于C#的工程化实现及扩展》、《ASP.NET设计模式》等书籍;软件的工程管理上,比如《人月神话》、《精益开发实战:用看板管理大型项目》、《Scrum敏捷开发高级教程:使用Team Foundation Server 2010》、《持续交付:发布可靠软件的系统方法》、《Scrum敏捷软件开发》、《用户故事与敏捷方法》、《敏捷软件测试:测试人员与敏捷团队的实践指南》等书籍;编程的原理上,比如《程序员的自我修养:链接、装载与库》、《计算机程序的构造和解释》、《编译原理》等书籍;硬件的原理上,比如《x86汇编语言:从实模式到保护模式》、《支撑处理器的技术:永无止境地追求速度的世界》等书籍里面,继续深造。比起直接“突兀”的给自己填充这些知识,以为掌握的假象,我的这种待技术有所积淀后再深入学习的方式,则显然得以更好更快的对其理解和吸收。

如此一来,那些尚未坚定程序员职业信念的人,也可学习到编程的应用技术,造福世界,而有更伟大抱负的程序员们,也可继续深入学习枯燥深邃的计算机科学和工程理论,而不至于过分痛苦和抱怨。大家各得其所,各安其分,成长也是有条不紊,不紧不慢,循序渐进而随着职业经验的不断丰富,越发深厚精湛。这不正是我们所追求的企业之成功、行业之成功,以及我们个人之成功的大欢喜结局吗?

当然,软件的领域是如此庞大,没有人能掌握到所有的学识,我们依然要有所侧重,对自己专业的领域,选学术类的专著或者教材,长期深入的研习,对于自己非专业的领域,也不要遗忘,选科普的,趣味性的读物补充,既怡情打发休闲时间,也扩充了自我在专业上的眼界。《30天自制操作系统》、《图解密码技术》、《Rootkit:系统灰色地带的潜伏者》等书籍都是通俗易懂,还不失其专业性的好书,都值得推荐。

别一点在学习上,还担心有所误解的,便在于认为学习到知识便可以傲慢的想法,以为此世间再无不可成之事。其实差矣。

有知识,有才能也不意味着一定能顺利的完成任务,所谓成功,要天时地利人和,各方要素全全齐备才行。知识,不过使得我们做成功事情的机率大大提高罢了。知识以外,我们仍然需要通力的合作,努力的工作,才能在那个成功时机出现的时候,狠狠的抓住。我们要是骄傲自满,自以为是,则往往一无所获,碌碌无为矣。

最终,讲程序员的成长,讲来讲去,还是要一个综合的才能的成长。有了综合的才干,就有了更加广阔的适应性;更好的耐性;更深厚的底蕴,能耐得住压力和困境;更多的可能性,触类旁通,优势互补,潜力更大;更强的协作性,因为懂得多,与各方都能顺畅沟通。但提升综合的才能,绝不是一朝一夕之功,它的成长,前路漫漫,吾辈还要继续上下求索兮。

再者回到文题,“论”者,名不副实也,作者五年浅薄,具不过思考笔录。“论”字者,不过成全自己的职业尊严,取一份认真负责的记录态度:凡所思考有记之事,皆有深思熟虑,有根有据之所为也。也不确定行文间是否满足了此份初衷,终究还是留待读者自行判定吧。

 

附录:[译文]程序员能力矩阵 Programmer Competency Matrixhttp://static.icybear.net/%5bCN%5dProgrammer%20competency%20matrix.htm

论程序员的成长

标签:

原文地址:http://www.cnblogs.com/Athson/p/4434983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!