一本开源的程序员快速成长秘笈
写在前面
前几天和 PPMoney 万惠集团董事长宝叔以及几个合作伙伴一起吃饭,席间宝叔戏言引用一个段子来描述个人成长:读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路,名师指路不如自己去悟。静下心来想想,这总结还真挺有道理,回头看看自己走过的路,从懵懂少年第一次厚着脸皮向数学老师讨借 Basic 语言编程指南开启 programming 生涯到现在混迹于金融和技术跨界领域,历经了那么多时光岁月艰难坎坷喜悦快乐,读书也好,行路也好,名师也好,领悟也好,都是自己成长道路上不可或缺的重要元素。
如果我有机会把这条路重新再走一遍,有没有一些灵丹秘方可以借鉴让自己发展速度更快些呢?以前有一本叫“杜拉拉升职记”的小说指引了很多初出茅庐的小白领一步步走向职业的高峰,对于技术屌丝儿们,咱们是不是也有个快速成长的葵花宝典可以借鉴呢?今天让我们来聊聊这样的一个秘笈,它来自于我自己多年以来的感悟以及对身边成功技术大牛们的观察,希望能够给年轻程序员们带来一些帮助。
程序员成长框架
这个秘笈最核心的精髓在这个成长框架里:养成良好的职业习惯不断提升自己的基本能力。
首先是养成好的职业习惯。大家也许看过那本《成功人士的 7 个习惯》,对于程序员来讲,下面这几种习惯可能更加有针对性:
-
第一是对新鲜事物和技术的好奇心。技术世界的最大特点就是变化,强烈的好奇心会驱动一个程序员不断学习研究最新最先进的技术和架构从而让自己处于领先地位,这种好奇心也可以帮助我们成为一个优雅的懒人,通过探寻最有效的解决方案来减少无聊的重复;
-
第二是要有一个积极勇敢的心敢于接受挑战。别人不敢做的事儿你敢去做并把它做成了,一方面你获得了非常宝贵的第一手经验另一方面只有你才能完成挑战必将给他人带来极为深刻的好印象;
-
第三是要能够持久坚持不轻易放弃。很多事情看上去不容易,但是如果你咬牙坚持不懈把问题最终给解决了,你的功力会上升到一个崭新的层次;
-
最后一个习惯我觉得最重要,那就是把工作变成一种快乐。如果你觉得做技术很痛苦,最好还是尽早离开这个领域,只有你工作和玩儿一样的,你不仅仅是获取了快乐,你的技术能力也会永不疲倦地提升再提升,我总觉得搞技术和玩电脑游戏一样,都是不断地练功找宝贝(写代码)和打怪兽(找 bug)嘛。
有了良好的职业习惯,你还需要不断提升自己的基本能力,对程序员(技术岗)来说:
-
第一种能力是 技术能力,这个是和职业最直接相关的能力,是我们做设计、写代码、解决技术问题的能力,是我们之所以被称为工程师而不是销售或者客服的硬能力(hard skills);
-
第二种能力是 和人相处的能力,也叫做软能力(soft skills),是让我们如何更好地和他人协同工作;
-
第三种能力是 业务领域(business domain)能力,计算机程序是用来解决问题的,如果你了解并能够提出业务需求,你的综合实力会更强大;
-
第四种能力是 管理能力,能让更多的人有条不紊地齐心协力做好一件大事儿,能把一个人的能力放大无数倍;
-
最后一种是 学习能力,是前面四种能力的爷爷,这个强了其他能力的提升会更容易。篇幅有限,这里没办法把每种能力描述得很透彻,但你必须充分理解这些能力的含义,因为一个程序员不同职业生涯阶段都是这些基本能力不同程度和级别的组合结果。
所以,我们说一个程序员的职业生涯,其核心就是把上面这些习惯越练越熟最后成为本能反应,同时把上面的各种能力不断从菜鸟升级到大师的过程。
了解了基本的成长框架,我们看看程序员在不同的成长阶段该如何利用这个工具自我发展。
程序员初长成
大部分的程序员是在读大学或者第一份工作开始技术生涯的,我们可以从技术初长成、从业行业与领域的选择、选择什么类型的公司来展开讨论。
技术初长成
这个阶段的核心是如何能尽早地开始职业化(professional)编程。所谓的职业化,也就是按照一个合格的职业程序员的标准来写代码,这包括良好的编程风格、采用流行的编程框架、专业的调试方法、规范的文档撰写以及坚持不懈不解决问题绝不休息的习惯等等。你不能仅仅是把老师安排的作业完成了,把领导安排的业务逻辑给实现了,你要能够做到写出的代码和大家公认的好的程序员基本接近。
选择一门编程语言是第一步。别老跟我说 PHP 是世界上最好的语言(哈哈哈),至少我可以告诉你,PHP 可能是当前职场里不很值钱的语言。。。如果你想把技术做得更深点,我建议你把一门面向对象的语言(如 Java)学透彻,因为你不光是要用这个语言来解决实际问题,你还要通过不断研习大师们的开源代码来提高自己的编程能力,资源越多的语言你可以参考的东西越多,同时,如果你能把这样的语言理解透了,那么其他任何一门语言你都可以很快掌握。比如说我自己吧,从 C++++ 学起,弄明白了后学什么(包括 Java)都比较容易,前后在实际工作中起码用过 8-10 种以上的编程语言。
学会了基本的编程,接下来要学会如何尽早地往职业化发展。如果你还在学校里,碰巧不幸你的计算机老师或者是没做过职业程序员或者是心不在焉精力没放在教学上,你应该尽早通过去校外公司兼职提早做职业程序员做的事情,只要你做的东西不是儿戏,你就会感觉到职业压力,你就会更早地走上职业的道路。好多科班出身的人看不起编程培训学校(哈哈哈),其实这些学校也是蛮有价值的。我一个学计算机的亲戚大学三年都在玩游戏,大四的时候有点慌了,赶紧去学了四个月的培训学校,提早感受“职业化”熏陶,最后轻松找到满意的工作。
我对咱们大学教育一直是小失望的,大学生们很多宝贵的时间都浪费了,如果能够更早地教授他们职业化编程能力,他们毕业的时候会具有更高的价值。如果你是在第一份工作里开始接触编程,那么你可以多和公司里的编程高手学习,看看人家在解决同样问题的时候是怎么写程序的,仔细想想为什么人家的思路比你自己的更优秀,不断模仿不断思考不断提高。
在这个入门阶段,如果你能有一个严师或者对你要求苛刻自己又特别想做出成绩的上司,那是你的大幸,他对你要求越高越挑剔你的成长速度越快。有这样的人每天在后面鞭策,你勇于接受挑战绝不轻言放弃的好习惯会快速建立,你的技术能力也会迅速得到提升。我当年很幸运地碰到了至少两位这样的老板,他们给我的信任和压力为我早期的成长带来巨大动力。后来我做管理的时候,我把这套激励体系充分施展开来,我的团队成长非常快。你要相信自己无穷的潜力,尽可能去找一个严格苛刻给你充分压力和信任的老板开始自己的职业生涯,这个算是名师指路那个个人发展武器吧。
入门阶段绝对离不开编程以及设计方面的书籍,去找几本经典书仔仔细细完整地读下来,啃一本是一本,怎么都比不看要好太多,刚开始可能会很辛苦,但是你一旦完成一本,将来看书的速度会越来越快,这也可以提升自己不轻易放弃的良好职业习惯。我们 PPMoney 研发团队就要求每个技术人员每年必须看完一本书读完一个开源代码,习惯了以后,其实蛮简单的。
行业与领域
如果你关心投入产出比,你应该选择一个未来有前途的行业或领域,比如互联网和人工智能。对于在传统金融领域做了 10 几年最近才加入互联网行业的我来说,互联网 +(我这里是互联网 + 金融)以及人工智能 + 有无限的发展空间以及太多的机会,选对了行业可以让自己获得更好的职业回报。
选择什么样的公司
大公司还是小公司,民企、国企还是外企,这些我有幸都经历过,应该说各有各的特点选择哪一类都 ok 的。选公司除了公司实力以外最关键的还是这家公司适不适合你早期的成长。一个充满激情的、忙碌的、有梦想的、每个人勇于承担责任的公司可以培养出优秀的技术人才。很多年前我在杭州待过的一家叫超软的小公司,经营的并不是很好以至于老早就不存在了,远远比不上那些国际化的大公司,但是她具备上面描述的那些好公司的特质,培养了好多现在国内顶尖公司的 C++XO 级别的大牛(不是我哎。。。)。
进阶阶段
这个阶段一般是在你职业生涯开始 3-5 年以后,具备了基本的职业素质,你在不断巩固自己良好职业习惯的同时要进一步提升各种基本能力并且要时刻准备抓住各种职业晋升的机会。
技术能力方面,你要开始提升技术的深度和广度。你要积极主动接受挑战啃最硬的技术难题,在工作中积累对技术本质的理解;你要习惯性看各类大牛的代码,学会判断什么是好的什么是差的;你要学会用更少更精致的代码完成任务;你要学习很多设计模式,掌握解决各类问题的套路;你要开始深入各类架构,不断提升自己的设计能力;你要学习多种语言,选择最适合解决问题的工具;这是一个逐步梳理自己对技术的理解,从无序到有序到套路满满的过程。
这个阶段,你要学会“懒惰”,不要重复做简单无趣的工作,哪怕有也要想着法子写出一个工具去简化去偷懒。我以前一个团队继承了很多 ETL 的代码,我们有几十个程序员在做着枯燥无聊翻译业务逻辑成 ETL 代码的工作,“懒惰”驱动我写了一个给需求分析师制定业务逻辑的工具,业务需求写完了,程序也就完成了。为了把这样的工具做出来,我找了一个叫 Pentaho 的开源工具,把核心代码彻底读透读懂,然后我的 SmartETL 也就横空出世。要学会站在巨人的肩膀上,多看人家的代码,你的设计能力编程能力都会越来越强大。这么做其实也是工作就是快乐的良好习惯自然驱成。
如果你想往技术管理方向发展,这个阶段你要开始锻炼自己的管理能力。对于技术类管理,我喜欢一种诠释:管理是把一个人能力放大的能力,通过协调更多的人做更大的事。也就是说好的技术管理者,首先是要具备较深较广的技术能力。管理最重要的一个基本要素是责任心。哪怕你目前还不管人,你一定要养成一个良好的习惯能够有担当,你要能够拍着胸脯跟你的 leader 说:这事儿包在我身上你放心。同样的话,你当 leader 后可以和经理说,当上经理后可以和总监说,当上总监后可以和 C++TO 说,当上 C++TO 后可以和 C++EO 说,当上 C++EO 后可以和董事长说。有了这种敢于担当的勇气和习惯,相信你一直会成为你的上司最器重最欣赏最努力栽培的人。
业务领域能力方面,你应该让自己跳出技术的 comfort zone,把自己的知识面扩展到产品以及业务层面,你越了解公司的业务,你的设计越柔性越能应付系统日后的扩展,同时正因为你能够和业务老大讲同样的业务语言,你的价值会更早地被公司管理层发现。拿我自己的例子,当年我在金融公司做风控系统,为了把系统做得更好,我读了个金融方向的 MBA,结果很多业务需求我自己就很容易去写,很多业务上的金融模型我也可以去做,后来的路绝对是宽太多去了。
能力的提升不能担保你一定能在公司得到职位上的提升,你还要学会如何抓住转瞬即逝的机会。做别人不敢做的做不好的对公司至关重要的事儿,把现有的性能提高 10 倍,在公司最困难的时候提出一个切实的解决方案并帮助公司走出难关,做出远远超过公司给你的回报的业绩。。。只要你能够做出远远超过别人预期(Expectation)的事情,你就能牢牢抓住晋升的机会。你对新技术充满好奇心,你勇于接受挑战,你坚忍不拔永不放弃,这些逐步养成的良好职业习惯配合你日益强大的基本能力,再加上你时刻准备好积极寻求机会的心态,不想得到晋升都很难啊。我以前在那家外企,当时业务想创建一个新的金融模型,没人做的出来也没人敢去做,我当时好开心,机会啊,不要白不要。花了一个月的时间每天 13-14 个小时的努力,最后东西做好了,自己能力提升了,大大超出业务的预期了,想不得到提升都很难是吧。
这个阶段你还需要不断扩大自己的人脉关系网络。单纯一个人的成功是比较难以实现的,你要学会借助他人的力量,学会整合资源,学会从和他人的交流中获取灵感。你一定要多参加技术交流,比如 QC++on 或者其他各种线下线上形式的活动,要能厚着脸皮和人家谈上第一句话多结交朋友。你逐渐积累的关系资源会为你将来的成功提供坚实的支持。
关于跳槽
尽管我从大二开始的第一家公司到现在,前前后后经历了 5-6 家公司,我还是想建议大家如果选好了公司轻易不要跳槽。你在一个公司至少得花上个 3-4 年来深化自己的职业能力,建立自己的人脉,深入了解一个行业。只有当你觉得目前得公司不适合你的发展了让你不再有 passion 了你再选择换一个公司发展。纯粹从一个招聘经理的角度来说,如果一个候选人经常换工作,我们会认为这个人不够踏实或者人品能力有问题,这样的人很容易被 HR 直接 pass 掉。
C++XO 的技能
少数人职业进一步发展会晋级到 C++XO(C++IO/C++TO/C++OO/C++EO)级别。那么 C++XO 需要哪些能力准备呢?在前面所说的能力之外,C++XO 一定要具备战略眼光,他们要在自己的职能领域给大家指明方向,他们要能够发现、招聘并培养公司需要的人才,他们要学会如何搭配合理的团队架构并通过有效的激励制度让公司健康成长,C++XO 们还要具备良好的人格魅力,能够很自然地把团队凝聚在一起。 对于技术方向的 C++IO/C++TO,除了自己专业领域足够强以外,C++IO/C++TO 必须要深刻了解业务并且用技术的力量帮助 C++EO 把公司的业务发展壮大。
做一个快乐的更全面的人
一个优秀的技术人员绝对不应该是简单无趣的技术屌丝,我个人信奉的理念是 work hard play hard and be a fun person。让工作本身成为一种快乐的形式,工作之外也可以让各类爱好丰富自己的生活。
转自:https://www.test404.com/post-1462.html