做程序员十六年了,带过很多新人,闲着没事就把之前给新人们做培训的资料整理出来,分享一下,希望能给想做程序员的新人们给以建议和帮助。

1、心理准备。

程序员的世界是一个外面看着光鲜亮丽,但是实际里面十分辛苦的职业,虽然说现在每个行业都不容易,但是程序员这个行业因为科技发展的速度,他的知识迭代速度是最快的,新技术每天在都出现和更改,所以基本上学习速度是很快的,所以就辛苦程度来说,是排位靠前的行业。可惜这个职业在外面看是美好的,但是真真去做就未必是那么回事了

在这一情况下,想要做这个行业,就得先有辛苦的准备,如果你没有这样的心态,那就乘早去做别的行业吧,不喜欢学习和琢磨的人在这个行业绝对是受苦,没有快乐的,早些放弃是对自己的救赎。所以要在这一行发展,先得有这个心理准备,没有过硬的意志,你很难坚持下去的。

如果有上面的心理准备,那么恭喜,你的心理准备算是合格了。但是如果你有看着代码编辑器等同于看到游戏画面的能力,那么恭喜,你有成为程序员的优秀才能。

当年上大学的时候,我有个同学,一晚上能够盯着FPE研究7个小时,最后用FPE给暗黑破坏神的主角修了一把屠夫的菜刀出来,如果你有这样的恒信和兴趣,那么你就用友天生成为程序员的材质,恭喜,你还算做这行的料。

顺便说一下我。我当年用FPE给李逍遥修改出来拜月教主的绝招,遇见啥都是一招结束战斗。在修改游戏这条路上,我们算是过了第一关。

第二点,习惯很重要。

也许你开始对程序感兴趣是来源于游戏,但是当你习惯了修改游戏之后,后面的事情也许才是更重要的事情——你希望能修改一些高于游戏的规则。

如果你读过烟雨江南的《亵渎》、《罪恶之城》,或许你会很容易理解我所说的 ,因为其实我们从这一条路线走上程序员道路的人都有一个共同点,就是希望能够修改一切表象背后的东西——规则。

这样是不是显得很高大上?

没错。

特别当这种事情成为了你的习惯的时候,恭喜,打破规则、建立规则的基本概念你是具备了,而我想说的是,当打破规则——重建规则这一过程成了你最重要的习惯的时候,你才具备了一个程序猿所需要的能力。

为什么这么说?

因为程序员入门其实比较简单,但是根据我所看到的,很多程序员卡在破立的能力上,这导致他即便是如何程序员的门,也一直在初级程序员的泥地里面挣扎,没办法向更高更深的方向发展。虽然说勤能补拙,但是看到他们天天加班还无法获得胜利着实让人心疼,所以没有将破立(也就是创新能力)培养成习惯的人,我还是建议谨慎选择这一行,这样的人做程序员会很辛苦。

2、有了思想准备,我们就看看自己的职业规划

程序之路必须有规划,否则短短二十年过去,你会发现一事无成。

从职业素养或者职业等级上,程序员分为初级程序员、中级程序员、高级程序员。如何界定三者,我是这样区分的:

初级程序员,能完成代码编写工作,这些代码不管是前端还是后端,反正都是中级程序员或者项目管理者给布置好的,比如说项目管理着给的N个页面。一般来说,一个合格的初级程序员只是执行者,而未必拥有设计能力,一般他们是项目中人数最多的苦力。

如果你能完成上级交给的任意编码工作,那么恭喜,你是一个优秀的初级程序员。 那么什么时候你能到中级程序员呢?这一个标志是你能够独立完成一个模块从设计到编码实现再到测试的完成过程。

为什么这么说?

中级程序员最明显的标志是出于代码而又高于代码的,这个是什么意思呢?从工作上,如果你是一个合格的初级程序员,当你到达优秀阶段的时候,你会发现其实80%的代码在不同的项目之间往往是雷同的,这时候你会突然想一个问题,那我做了半天辛苦工作是为什么呢?你会开始关注如何能通过移植在尽可能少的工作量下完成工作,久而久之,你会开始接触模块内的设计,例如如何利用一个mybits的底层完成尽可能多的查询,这种为了偷懒而开始发展的设计能力,便是中级程序员所需要的最重要的能力:设计能力。

换句话说,从初级程序员到中级程序员的那一道龙门,即是“模块设计能力”。

有这个能力,你可以胜任中级程序员的工作,完成高级程序员给予的模块开发工作,并能顺利地将你所编写的模块在多个项目里面移植来移植去,也能和别人很好的合作完成项目。

从中级程序员到高级程序员,他们之间也是有一道坎的。这道坎就是项目整体把控的能力。如果你简单的把模块拼接起来就看做这个坎完成了那就错了,因为其实把这道坎放大之后,他是分好几种能力的:

第一个:规划能力。软件是一个工程。在不懂软件的人看来,软件好像只是实现几个功能,但是麻雀虽小,五脏俱全,再小的软件都有自己的生命周期,再小的软件写不好也会在运行时bug百出,加之很多软件在交付的时候跟客户的预想也会有差距(实际上客户的思想也会不断变化),后期的变更就避免不了。有的软件还会有一期二期的功能扩展,在这种情况下越是优秀的软件就越需要良好的架构,而作为项目的把控着,高级程序员在软件的规划中起着举足轻重的作用!

规划能力也是模块设计能力的一种扩展,但是他总体上来说是高于模块设计能力的。

第二个:沟通协调能力。

其实从中级程序员开始,沟通和协调能力就已经是你的工作内容了,项目设计出错了、技术不合理、需求变更等等内容都是需要你处理的,联系程序员、测试、项目经理、客户,其实各方面你要打理妥当才能完成任务,到了高级程序员的阶段,只不过这种能力放大了使用范围而已,从模块的协调沟通,变成了项目的协调沟通而已,顺带着还要把你对项目的理解变成整个项目的开发计划、开发规划,然后分给你的小弟们去做而已。

越到高级程序员,沟通协调能力越重要。

营销学上有一个统计,人与人面对面沟通时,一次沟通的信息传达率只有60%,也就是你的原意被你对面的人理解并正确执行的最高比例只有60%。如果有其它因素干扰,比如说对方遗忘、多工作、理解偏差,这个比例还会更低,别相信电话,电话的信息传达率只有35%左右。

想一想,在面对面沟通最高信息传达率只有60%的情况下,你怎么能保证你的小弟们能完全明白你的项目设计?

对,唯一的办法只有提高你的沟通能力,因为不善于沟通的话,程序员不听你的,他们做出来的东西就有可能完全不是你想要的,这种情况下,就算你作为高级程序员,也会被老板或客户骂个狗血淋头。

第三个,管理能力。

中级程序员大多数只是带一个两个或几个初级程序员工作,但是作为高级程序员你可能是带领几十个人协同完成工作,此时管理能力就凸显出来了。你会配置几个前端什么时候开始开发页面?有需要几个java程序员开发服务端?测试什么时候介入?他们之间的工作怎么接驳?关于项目的一切都是要管理好的,技术预研怎么做?如果程序都要集成测试了,这时候某个中级程序员才告诉你他在某个中间件的使用上还卡着呢,我估计这时候你听到这话不是疯了就是要打人。

管理上有句话,如果项目出错了,那么最终都是管理的错。

所以,为了自己不被老板骂,管理能力是必须的。

当然,管理能力并不只是协调和规划项目的能力,管理能力如果被细分的话,他也基本上分为三点:一个是资源管理能力,包括人力资源和项目资源,后面再说;第二是技术管理能力,后面再说;第三个是项目管理能力。

第四个,自身的技术能力。

这一点是跟管理能力有部分重叠的,在后面详细说。

从职业规划上,一般我们在软件技术上分为初级程序员、中级程序员、高级程序员三步走,在职业落地上,具体是要分为 实习生>初级程序员>中级程序员>小组组长>项目经理>系统架构师>开发经理(业务经理)这几步走的。

具体落地大概是这样,这还要看每个公司的条件、个人条件、人际关系等,在这里就不详细说了。

下一篇我们讨论具体怎么开始你的程序员生涯。