NoCoder:一个本科毕业生对程序员职业生涯和进阶的一点浅见

时间:2022-09-14 13:11:10

我的困惑

六月欢戚而度,毕业,终于到了不得不离开学校的时候了。

想想自己半路出家,大二时从土木工程转专业到计算机科学与技术专业,与IT接触也走过三年了。而那年十月还在不明就里之时,稀里糊涂的就签了工作,到现在一步走,一步看,天天在感受,天天在感悟,困惑却从来没有减少过。

工作初入之时,基本没有培训就进入了项目组。部长的意思是从来没有招过本科生,一时也不知道该怎么做,就以项目带新人,从实践中学习和接入项目组了。我猜大概有两个问题项目组没有考虑清楚。一是要不要给我们刚毕业的本科生进行专门的基本培训并留出工作适应期;二是不管培训不培训,怎样让新人,特别是一个本科生接入项目组中。后来我才意识到整个公司的技术类和研发类人员都是硕士学历,本科生是公司第一年招生,新鲜的很,没招应对也是正常。

初进入项目组,就能感觉到本科生和硕士生在能力上的巨大差异了。毕竟硕士一进门就是可以工作的,而本科生少了三年的经验,的确不行。

我是和另一名硕士生A君一同进入一个项目组。A君来的第一天就自己打开了VS2010的项目工程目录,查看文档资料,大概浏览了一下源代码。而我虽然以前也有使用VS进行团队项目开发的经历,但是对于直接阅读源代码这种事情,毕竟本科阶段训练太少,不由得少见多怪,感叹了一下刚开始时本科生和硕士生的差距还是很明显的。随后A君点评了一下看过的源代码,说写的不够规范。我当然丈二的和尚摸不着头脑,源代码我都没看过,也没太在意他给出的这种评论。只是后来觉得A君自己倒是应该加强一下写代码时候的规范。这样说倒不是对A君不满,只是后来因为工作不得不阅读源代码,亲见工作一两年的师兄写过的代码,已近工作十年的项目组长那一级别程序员写的代码,个人代码的写作好坏和水平对比明显。A君自己的代码的确不如更有经验的师兄们写的规范和方便别人阅读。而自己,当然是掉渣,只能一方面学习,一方面更加仔细,注释写的比谁都详细,在格式方面多花功夫,争取养成好习惯,希望以后写出一手漂亮的代码来。在如此明显的差距之下,A君提点了我一下,他有一套程序员综合素质提升的经典书籍,介绍了给我。大概有《程序员修炼之道》、《程序员的自我修养—链接、装载与库》、《代码大全》、《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs 2ed)这类很经典的书籍。当时由于一个问题,我想要了解C语言的printf()是如何实现函数将数据输出到控制台的,他说是使用了系统调用,这个原理在《程序员的自我修养—链接、装载与库》一书中有讲解,所以我就开始看了这本书。不得不说这个本书比较高深,涉及很多底层的原理,远远不是看一遍就可以理解掌握的。我也只是求个了解,解除一时的困惑。也因此而引出更大的困惑来。

因为这一套程序员综合素质提升的书,我自己去查了更多的和程序员基础素质相关的书籍资料,这些书籍包括《深入理解计算机系统》(Computer System A Programmer's Perspective 2nd.)、《重构 M.Fowler - Refactoring - Improving the Design of Existing》、《Unix编程的艺术 The Art of Unix Programming》等等,以至于不断追寻到了计算机的底层理论,我甚至花了时间看《计算机系统要素-从零开始构建现代计算机》,而现在还在看《计算理论导引》。也许说这么多都没有说到重点,我的困惑是什么?列为看官所能感受到的只是我刚刚工作之时的各种迷茫和散乱的补习。

对,这就是我要说的问题:程序员迷茫着不知何去何从,不知道怎样系统的,有目标的提高自己,而是散乱着进行各种散乱的学习,以至于功倍事半。

所以我的困惑是程序员要走出怎样的一条路来?到达怎样一个目标?

更迷茫的是要怎样找到这样的目标,怎样找到一条实现目标的道路?

迷茫之时却想要把迷茫之处表达清楚,真是难上加难。程序员的迷茫更是如此,这个时候理清问题最好的方式就是问题拆分细化。于是,我多问自己几个这样的问题。

1.程序员怎样从代码小工进阶为编码专家?我说的纯粹的编程能力。实际开发中的需求往往是,这个项目我们将选用这种技术来进行开发,语言成为首要议题,那么问题更实际一点,程序员如何精通一门语言及其开发工具集?

 

2.精通一门语言和开发工具集之后,仍有疑问。

我拼死拼活的学习了一门语言,要担心的未来仍然不减。

就拿C++来说事吧,C++的复杂度和学习成本在业界“有口皆碑”。虽然学习了C++可用之处还是不少,饿不死人。但是问题是,程序员的精力有限,学习了C++就没有多余精力来学习其他语言和开发工具集了,这样程序员容易被某一种语言和其技术集绑定。被绑定的程序员往往只能硬着头皮继续在该语言和技术方向上奋战,直到发生重大变故,你放弃了它们。这里的问题在于,程序员的未来似乎也被无形的绑定了。一旦入了C++的船,无形中C++可能是垫金石,也可能是挡运墙。做项目的时候考虑你已有的开发经验,你很可能被派去继续做C++相关项目;工作几年,你欲换工作时已不如刚毕业时对你没有要求,公司可以培养你,拿捏成为公司想要的大器。如果你一直都是C++相关的项目经验,不好意思,你最好的首选还是以C++开发为基础的工作。混来混去,你会发现自己一直在一个很有限的领域内活动,换不走,也换不开,更多的是,更怕C++终于修炼有成而又正是而立之年时却经不起从头再来一次的苦学,再来一次的厚积薄发。

马屁股决定航天飞机火箭助推器的宽度的故事所导出的路径依循原理在工作中任然起着某种类似的作用,或许可以称之为职业生涯的起点依循。

欲成事者,深耕厚积,日夜苦学。人生却只有一个二十岁到三十岁。

那时你正是工作几年,婚姻家庭,升职加薪的最好阶段,你需要利用前几年的积淀来成就一番事业,此时换掉熟悉的C++的代价太大,哪怕你从一开就很讨厌C++。而这正是我担心的,因为我真心不喜欢C++的复杂,但是因为工作的原因,不得不学习和使用C++。怕只怕,以后正的很难跳出C++的世界,又或者到时代价太大,不敢轻易为之。这种不得不面对的技术对于生活和工作的未来的不良绑定,程序员对未来这样的困惑又该如何应对呢?

 

3.也许上一段议论引出一个更简单的问题更好一些。程序员应该怎样选择一门自己深下功夫,修炼至于精通的语言及其技术集呢?

不要再给我说什么“语言只是工具,语言和IDE这些东西和具体开发都应该是高度解耦的”这样的谎言了。工欲善其事,后面一句是什么?是“必先利其器”。招人时蒙骗小孩子的话,再说就掉渣了。不修利器,一个程序员这里捣鼓一下C/C++,那里捣鼓一下Java/PHP,能成器么?看看IT企业社招的时候就知道了,不都是Java Web三年以上开发经验,精通一门常用语言,熟悉Linux系统等名目么?人家要的是解决问题的利器,专家,不是什么都懂点,什么都搞过却成不了核心的打杂人员。所以程序员成长的道路上需要选择一套适合自己的武功,深下心血去修炼。

选择,再次摆在了面前,何去何从?

That’s the problem,not easier than programming.

 

4.如果做了选择,甚好。但如果只是做到这个程度,那程序员显然也是熬不到头的。程序员不应该只是编码的工具,程序员的进阶之路必须要跨越编码的局限,走向更高层的管理或者设计、架构类工作。只是从程序员如果走到那一步去呢?目标在何处?路在何处?一步一个脚印,下一个脚印该踩再哪里?天地如此苍茫,没人悉心指导,有多少人工作了10多年了,也还是个程序员而已,这不是魔咒所致,而是迷茫,在原地任年华流逝,踟蹰不知所行。

 

5.问题和困惑总是会存在的。目标有了,道路也有了。还有其他的问题。

 “武无止境”,程序员一路疯狂修炼前行之际,又该怎么面对眼花缭乱,层出不穷,甚至可以说各种乱七八糟线团式的新技术呢?追或者不追?如果要追,有该怎么个追法?

 

总结来说,我的困惑就是程序员怎样摆脱生成底层Coder的命运,在IT的江湖修炼到更高阶层中去,一展拳脚,笑尽英雄。

只是,

目标何在?

道路何在?

又该如何坚持?

 

有这些问题,那是因为你若把Programming,把IT江湖当作一生一世都要奋力作为的舞台,你必先明白自己的处境和未来可能遭遇的变端,这些问题关系着你的定位,你对自己人生的设计,你对这个江湖的期待。你也将发现这些问题你不得不面对,不管你意识到了而着急困惑或已成竹在胸,腹有良谋,还是未曾意识到而乐天知命,它们都将划过每个人的人生的轨迹,施加属于它们对我们生活和命运的改造。

 

自顶向下方法

目标、道路这是最紧要的两个要素。

我以我浅薄的见识以为,IT业的发展最终将出现各种技术和应用聚集成为相对稳定的领域型划分,即相关的技术和产业聚集成为一个产业域,各个产业域之间相互开放的交流并用,进一步推动整个行业的向前发展和重新组合。以对外提供的服务视角来看,IT业划分的基本单位是应用、服务、产品,如搜索应用,地图服务,新闻客服端产品等。这些小的单位可以组合出更加强而有力的应用、服务和产品,同时也能造就各种盘然大物般的各种明星公司。据说Google起家的故事中有一句话是“积累技术,做好产品”。这真是摸准了骨子,找对了道路。这话对要创业的道友或有启悟。对于程序员进阶呢?

既然,如果,IT产业的组织和划分单位是应用、服务、产品,那么,何不,尝试,从顶层进行分析,自顶向下的来找一条道路连接未来和现在。因为你想要进阶的未来正是架构和设计出出色的应用、服务和产品来,而你现在只是个Coder。两者之间存在十分隐秘的关系。

就程序员进阶来说,管理方面非我所思,也不敢多说,若是一直向着技术方向发展,最后进入系统工程师,架构,方案设计、优化,顾问,咨询等这一个级别则是许多程序员的目标。一句话“优秀的程序员也必定是业务专家”。业务最终也都会转接到该业务所涉及的基础应用、相关服务和产品上去。也许程序员对自己要成为怎样的人,以后具体从事怎样的工作,在那个职位上打拼并不那么肯定,但找到自己很感兴趣的IT业务,应用,服务和产品的应该不难。这就是一种目标,一种非直接关联到程序员进阶成果的目标,只是个人的兴趣所在而已。从这个目标,这个兴趣下手,将其技术起底拆分,从前台拆分到后台,从整体服务拆分为子服务,拆分出其系统架构,拆分出其使用的运行平台、开发语言和工具集,所涉及的技术焦点等等。

如果是如我一样刚刚进入IT业的程序员,如果拆分到开发语言和工具集这个层面的时候会不会豁然开朗了一些呢?这样困惑中的第一个问题和第三个问题,语言及其技术集的选择问题就渐渐明朗起来。

技术焦点,在语言及其技术集已不再是问题的时候,程序员进阶的正真磨刀石就来了。掌握了技术,程序员才能正真算是在跨过Coder,进入高阶Programming的道路上前进了一步。将技术焦点一个一个,从高到底一层一层拆开,各个击破,也许修炼起来这招能叫“百步穿杨”,保证每次修炼都在进步。最终的目标就是将这些拆开了,在学习后焦点后够融会贯通,不仅能组合出原有的服务,更能明了什么时候用什么焦点,什么招式来解决问题。

以云计算为例来说,作为云计算的整体来说,可以说是一个产业域,有各种不同类型的服务,应用和产品。选取Sina App Engine来说,其对外提供了网站开发、托管等一系列服务,其前台主要以其官网为用户提供账户和应用管理接口,其后台依托云计算提供了高效,简洁,方便的网站开发和托管服务。不关注前台,拆分出自己感兴趣后台部分,如分布式存储,Web服务池,数据库服务,计费系统,对JavaPHPPython支持等。再拆分出其系统运行平台LinuxWeb服务池构建平台Nginx,负载均衡,容错管理,分布式文件系统等焦点和信息。进一步可以选择Nginx服务器进行进一步的拆分,拆分到合适的层次,就可以作为一个阶段性的学习目标。而实际上拆分的过程不仅找出了具体的目标,也为进阶之时指明了道路。

当然其实最为基本的一些修炼根本是不需要进行拆分就应该明了的,自顶向下的拆分只是更加明显指示出学习的必要性,比如LinuxTCP/IP,基本的数据结构和算法等等。

以兴趣的导向,寻找非直接的目标,进而进行拆分,找到直接目标和道路,需要在所选定的领域进行一定量的拆分之后才能有良好的理解,才能找到合适自己的目标和道路。如果对云计算感兴趣,仅仅如上对Sina App Engine进行拆分那是不够的。如果只是对Sina App Engine感兴趣的话,对其他同领域或者同类型的应用,服务和产品进行拆分同样是不可或缺的过程。

 

NoCoder & LTE

在困惑中前进之际,我也曾在网络中积极搜寻前辈们的访谈或自谈的经验,但大多也是说说高屋建瓴的学习原则,或是针对某个具体技术点的学习方法,少有为困惑者指出一种具有普遍实用性的寻找各个阶段目标,找出学习路径的方式方法。(我深深怀疑对前辈们这样的非议,只是我一人的浅薄之见。毕竟江湖中卧虎藏龙,根据墨菲定律,我所说的问题和解决方案决然已近存在于这个网络之中了,只是我尚未遇见。)

我以为程序员永远不应该满足与现状,永远都要有危机感,在这个迭代如此之快的IT江湖,一个不小心就会变成扫地僧,失业失心。

NoCoder之词,是我仿造NoSQL造出的词语,意为 Not only a Coder,程序员必须抱着如此信念不断进阶以求生存。

LTELong Term Evolution,长期演进,借用于3G4G演化的通信术语。程序员的进阶修炼绝非一朝一夕之事,必须长期的坚持,才可能获得期望的收获。

 

而关于第五个问题中所说的关于层出不穷的新技术(请原谅我用了“乱七八糟”这个词语来对之进行形容),有时候一眼望去新技术领域还真是乱七八糟的可以。技术、语言的更新迭代都是常事,并不奇怪。物维新,才能应变,才能得以发扬光大。我相信面对各种高大上的新技术,新语言必有不少的程序员像我一样对之跃跃欲试。然而,实际工程中追求的首要目标是稳定,而后才是性能,最后才是花哨。新技术在业界中有大规模实际的应用,从其出现必然要经历一段足够长的时间,特别是要能应付企业级和工程级的开发与考验,更是需要全世界程序员大量人力、物力的投入,为之完善其框架、平台和其他工具集。所以在深修所选之时,我以为对于这些出现的新技术了解了解就好,不必太过于着重于心,等到真有必要深入学习之时为时不晚。自己的核心任务还是修炼自己所选好的道路,等到学有所成,再谈其他。当然,学有余力的道友可以不必在意我这种与你们自身实际不合的论断,更应该大刀阔斧、披星戴月的学习新技术,占得先机。

 

任然存在的问题

也许仔细一点看下来,会发觉我所困惑的第二个问题和第三个问题是一对自相矛盾的问题。第二个问题怕太过深入,一辈子吊死在一棵树上;第三个问题却是又怕三心二意,不能下定心思修炼一门能力,最后一无所成。之所以会这样,那是因为我以自身为例,个人情绪上对C++的确不感兴趣,不想深修,但因为工作的缘故不得不接触C++。所以不想吊死在C++之上,但是却被赶上了树;本来想要好好学习的JavaLua,就成了三心二意的选择。这是工作需求和个人心愿的不协调造成的矛盾。我相信很多人或多或少都会面临与我一样的处境,只是可能那时你所面对的不是一门语言而是其他。这样的矛盾实际中有太多,又岂止于程序员对语言及其技术集的偏爱,又岂止于工作之中呢?生活到处都是这样子的矛盾。人,对之毫无避免之策,也只好宽心应对,能两全最好,不能两全,也只能看个人的行动和决策了。

 

关于读研和本科直接工作

就个人感受而言,如果把刚毕业的本科生和硕士生放在一起基本不具有可比性,一般情况下硕士生可以胜得毫无压力。若时间上求个公平,等你工作三年,再和刚毕业的硕士生比。在IT业混了同样的年限后,个人觉得要说硕士生还能轻松取胜那毫无根据。但有一点是明确的,工作中三年的学习很累,不可能比得上在学校念书的研究生学的那么轻松,理论上也很难达到他们的高度,但是比技术时你很可能会笑到最后,就看同样的三年在工作之余你能付出多少在理论和技术两个方面都去提高自己。

 

关于基本的修炼

网上有很多前辈们的经验分享了,便不再多言什么。

再给个链接,特别推荐一篇:

给计算机系学生的建议 (转)http://blog.csdn.net/xfunny/article/details/5272214


2014.10.31  晚