三周前,正值手头事情忙得不可开交之际,接到右总邀稿,要我谈谈程序员发展的几条出路。我思考再三,索性趁此机会干脆行文一篇,把自己多年来给团队的唠叨整理整理,也算不负他人之托。
事先声明,本人并非专业的职业规划师,也不喜欢给人的职业生涯出谋划策,这里所写所言只不过是一位经历还算得上丰富的老程序员的所见所得。各位只需看看就好,若能引起共鸣,那更是不胜荣幸!
选择大于努力?
有段时间经常在朋友圈内看到类似“选择大于努力”的论调,甚至看到不少朋友还不断的转发和点赞。一开始我受到影响也心有戚戚焉,但后来觉得似乎哪里不对:
- 如果没有丰富的阅历和经验做支撑,根本不可能做出很好的选择,而前者不会从天而降。
- 有的选择机会是有门槛的,不努力的话,连门槛都达不到。
- 一目了然的选择也不太可能是好选择,因为大家都会去选它,自然会引发激烈竞争。
- 选择并不意味结束,它只是开始,在执行过程中不全力以赴,也是枉然。
- 退一万步,就算有贵人相助,但除非含着金钥匙出身,要得到贵人的认可和相助也不是件易事。
鉴于以上几种原因,不努力,大概率也会导致不会或很难有好选择。可以说,不论走哪条路,发展的起点都要努力为先。之后,在执行过程中,按照自己的兴趣和机缘会各自走上不同的道路。
尽快确定方向
但是,光靠努力并不能让你就一定得到很好的结果,如果没有目标或方向,那就是白费气力,心中的阴影面积会越来越大。所以呢,你第二个要解决的紧要问题就是尽快确定方向。但是,你不要指望这个问题可以一蹴而就,半个小时就能搞定。作为人生三大问题之一,到哪去,只能“listen to your heart”。放在程序员发展之路这个背景下,我的建议:
- 多跟长者交流和学习
- 多跟朋友交流和学习
- 多跟不同背景的人交流和学习
- 多看看行业新闻和动态
- 多看看图书市场的出版动态
- 多看看招聘网站上的职位动态
基于这些信息和数据,我相信你也不会是木头,没有任何感触和想法。有了想法,就尝试,但不能一遇困难就退缩,否则你将很难判断出是自己能力不足,还是因为确实不喜欢这个方向。如此往复,即是死循环,永远原地打转,无法升级。找方向的过程是一个不断尝试和渐入佳境的过程,在这个过程中多交些朋友,多参与些社区,他们将会成为你的良师益友和支撑下去的力量。
环境会影响成长
环境,也是一个不得不说的因素。孟母三迁已经说明了环境的重要性,这里我也就不再展开讨论。简单的说就是:环境会影响你的成长。在我看来,环境可以用这样的三元组来表示:(城市,公司,团队)。其他更细微的环境,如办公环境,不在此处讨论之列。我认为好的环境包括下面的要素:
- 机会多,包括:升职机会、培训机会、工作机会等
- 氛围好,包括:积极的学习氛围,融洽的人际关系,公平的竞争机制等
- 有将来,包括:朝阳行业,快速赛道等
这里我没有列出加班或薪水之类的因素,是因为它们根本就不是决定你是否成长和发展的关键因素,并不值得作为首要考虑的条件。当然,不是所有人都那么幸运地可以身处不错的城市、优秀的公司和好的团队,三元组的顺序则可以作为你选择的优先级,即:城市 > 公司 > 团队。
好的方法 = 如虎添翼
有努力的意愿、确定了明确的方向、选择了好的环境,这些已经让你站在了一个比较高的起点,但如果拥有好的方法,则会让你如虎添翼。好的方法应该是可以习得的,而且能够让你快速入门,并不断提升。所幸,我们并不需要自己去发明所谓的“好方法”,因为业界已经有很多值得学习的方法可供借鉴和拿来即用了:
- 敏捷方法,熟悉敏捷开发的朋友可能会觉得很奇怪,觉得敏捷方法跟个人的修炼的成长关系不大。如若有此印象,只能说你的想法太局限。敏捷方法本质上是一种杜绝浪费的经验实践,一种发现浪费并消除浪费的思想。既是如此,为何不能将其应用于个人的学习和成长之中呢?尤其是其中的 TDD ,本身其实就是先树立目标,接着快速实现,然后不断优化的实践。将其应用于新知识的学习过程中,不仅可以学习实际的知识,还可以锻炼对新知识的洞察和理解,否则光树立目标和如何验证都做不成。
- 设计思维,相对于敏捷方法而言,设计思维更侧重于做什么,借助于更优的沟通技巧和手段、快速地原型设计和验证,迅速拿出一个可行的方案。这也是为何我个人认为设计思维在前,敏捷方法在后的原因。比较而言,敏捷方法更偏目标确定之后的工程实践,设计思维更偏在正式工程之前找到最优方案。利用设计思维,有助于锻炼所谓的“移情”能力,这是很多成功者具备而大部分程序员不具备的能力之一。
- 视觉化表述,一图胜千言,而且做一个会画画的程序员应该很酷。
- 系统思维,整体全面地看待问题,很多人都希望如此,但实际中做到的很却不多。大多数原因都是虽然对此有认识,但从没有系统性地学习和掌握这方面的理论和工具。彼得圣吉的《第五项修炼》的江湖地位已不再需要过多描述,同时我还推荐一本实操性比较强的《系统思考》(丹尼斯舍伍德著)。虽然这类书籍被划分到管理类,但它们本质上属于思维改造类资料,我建议广大程序员在敲代码之余可以去看看。
相比起行业技术,以上方法是经得起时间考验的,并不会出现一朝被行业抛弃的情形。掌握这类方法将深刻改善你的认知和见识,相比起零星地碎片化学习,这些知识值得静下心来专门学习。
体验的重要性
最后,我想谈谈【体验】的重要性。如果你想提升你的见识,不去体验生活,几乎不太可能获得真正有用的体验。这也是陆游所言:纸上得来终觉浅,绝知此事要躬行。关于体验,作为过来人,我看到和做过的:
- 参与社区,融入社区,有机会就分享,这是一个思想交流的机会。
- 写文章、翻译文档,通过写作来整理思路,形成自己的观点,不要人云亦云。
- 参与开源项目,体验不一样的协作模式和开发方式。
- 对于公司内的机会,也不要错过,应该将它们作为你的首要目标,不要舍近求远,先去看外部机会。
修炼,就是折腾自己,在这个过程中才能真正成长。
总结
最后总结一下吧。
在这篇文章中,我既没有像其他文章一样去告诉大家程序员有哪些职业发展方向,如前端、后端和架构师等;也没有谈你的人生规划,如是创业、做个自由职业者,还是打工?这是因为我认为外面已经有很多文章谈到了这些,再写下来也没什么意思。
而且,我觉得授人以鱼不如授人以渔。你告诉他的这些所谓的职业规划和方向,只不过是当下环境下特有的职位和方向而已,未来可能不复存在。况且,提前说明这些,反而有可能事先将你的思维方式局限住,不如干脆讲些“元知识”,然后由你自己去决定自己的路如何走。
整篇文章先从态度(即努力)说起,再言及“方向”,进而谈到“环境”、“方法”和“体验”,所有这些都是我认为对于个人成长和发展非常关键的要素和条件,通过这种层层递进地说明,希望能起到为一些还感到迷茫的朋友解惑的作用,谢谢!