神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:信息时代是学习爆炸的时代,如何做好终身学习这门课是很大很难的话题,关于终身学习这件事,如何处理要学习东西太多的问题?本文探讨了软件开发中的学习问题,解答了部分疑虑。原文标题Learning without Burnout,作者Andrew Owen,Jungle Coder作者。
本文的大部分例子都会偏向于全栈或前端Web开发,因为那是我最熟悉的地方。这也是写给那些试图进入软件开发领域的人,或者想了解管理软件开发事业这方面的情况。我也忽略了很多东西,尤其是文化因素。
软件开发有一个特点,那就是软件开发人员要不断学习新的东西。至少这是外部的印象。不过,也有一些缓解的因素。
首先,一旦你学会了某一特定技术栈的基础知识,在该技术栈的类似风味之间的切换就会变得容易得多。一旦你了解了HTTP、HTML、CSS和JS的基础知识,再去学习Rails、Django或ASP.NET就会容易得多。
二是不同类型的知识有不同的保质期。其创建者正在推广的酷炫的新JS框架?那可能只持续6个月,也可能成为下一个React。前期很难判断,尤其是当你是新人的时候。值得庆幸的是,大多数工作的热度也有一定的滞后性,不是所有的工作都要求有最热门的新技术。
但是,如果你在学习HTTP状态码,或者header和auth?这些知识会长期有用,并且是所有Web应用的一部分。学习更多的基础知识会让你在调试问题时有优势,也能帮助你在早期阶段脱颖。另外,不同类型的知识有不同的获取成本。与编写一个全栈的Web应用相比,基础的JS或HTML相对容易,这比构建一个合理完整的脚本语言要容易,而脚本语言又比构建Postgresql或MongoDB等生产级数据存储要容易。
另一个因素是,在一个特点技术栈里可以深耕。比如说Rails,如果你遇到了一个领域,你的同事似乎并不是很了解,那就是一个有潜力的地方,你可以开始深入研究它的工作原理。因为这样你就能建立起一个能搞清楚棘手问题的人的声誉。你不需要对整个堆栈了解得那么详细。当你成为某一方面的达人,当你在向他人的专业领域寻求帮助时,人们会给你更多的信任。这也是与学习基础知识的协同作用,也是基础知识可以帮助你的地方。
这里面有一些取舍。首先是大多数基础性知识在简历上并不能显示出来,而且大多数公司都不擅长评估这方面(据我所知)。他们要么认为你有相关的能力,要么他们在面试时根据他们希望的工作内容来匹配你。但没有人有时间一下子学完所有的东西,即使是那个超级厉害的开源开发者或者独立游戏开发者也不行。
不要一下子什么都学。在日常工作中,你要查很多东西,即使在这个领域里工作了十几年,也要查很多。但是,特别是在你早期的时候,一定要抽出时间来学习东西。初级求职者的工作会希望你花很多时间学习东西。如果他们不这样做,他们就不应该雇用你这个级别的人。任何编程工作都涉及到至少在你参与项目的前2-6个月学习公司的代码库,除非他们遵循一个非常传统的结构。所以利用初级职位的优势,尽可能有效地学习你工作相关的技术栈。
一定要对你的第一个职位所涉及的技术进行深入的研究,试图比你正在工作的职位所要求的更深一层的了解。这不一定要发生在每一项工作任务中,但至少应该在每一两次任务中发生一次。通常低层比你想象的要简单,或者说能让你更容易理解高层。理解低层也让你有更好的嗅觉,知道什么时候代码是蓬松的,什么时候是实质的。这可以指导你的调试,增长你的基本功,加快未来工作的速度。
当在早期的时候,你需学习前期的基础知识。除非你有一些其他的技能可以让你进入技术行业(比如质量保证/测试相关的工作,或者其他领域的工程师,比如航空航天,材料设计,或者类似的),否则这就要你自己找到的时间。学习能丰富你的简历的知识,不过一般不会花太多时间在基础知识上。高校更注重基础知识,但可能会教授5-20年过时的技术。无论哪种情况,都要你想办法填补留下的空白。
对我来说,我很幸运,在高中的时候,每周周五上午都能抽出学校的时间(我是在家上学的),通过Head First C#来学习。同时,我有一个有抱负的项目,要做一个科学计较机GUI应用,这超出了我所能完成的范畴,让我突破了自己。在前一两年,尤其是在你找到工作之前,我建议以类似的方式留出一个时间段。如果生活中没有那个时间段,那你就得更主动地去安排时间了。
另外,不要空想代码,坐下来想一个计划,你要尝试做什么或学习什么。如果到了你的时间,而你没有这个能力,就出去走走,想一想,或者做一件杂事,脑海里想着你的计划。通常问题的答案都是在远离屏幕的地方。视野狭窄是软件开发中的危险陷阱。
长期保持学习节奏
一旦你有了第一份工作(或前两份工作),并且建立了自己的基础知识,那么问题就来了,如何保持所需的学习节奏,以跟上技术的发展。而这最终取决于你计划做什么,以及你的职业生涯规划。如果软件是带你走向下一个事物的垫脚石,那么你就可以多消耗一些动力和时间,把精力集中在市场热度高的地方,并努力从中获得3-5份工作,尽可能为下一步的工作做好准备。
如果你想长期留在软件行业,那么我建议你不要追热门。试着在软件开发中找到乐趣。而且,当你学会如何在构建和学习事物的过程中找到乐趣时,一定要把握好自己的节奏。我曾有过连续6周努力学习一门新语言、生态系统或副项目,随后几个月专注于其他事情的经历。
一旦你觉得自己有能力构建中小规模的项目,就不必每周都以100%的速度学习。对于网站开发来说,这大概就是你能够自己编写博客软件的时候。你应该半定期地学习新的东西。但要保持可持续性。真正有帮助的一件事是要有一个以某种方式记录你所学到的东西的过程,过去我偏向于发布代码,因为这对我来说是最简单的。
不要把业余项目作为学习软件的唯一工具。我曾经认为这是最好的学习方式,因为我就是这样学到了很多东西。然而,它也有缺点。首先,真正有用的业余项目更耗时,而且你学习的东西的内核可能只需要较短的练习。
但是,无论是通过业余项目、博客,还是建立展示编程项目的网站,我都认为,找到一种方式来发表你的学习成果是有价值的。好处是,你最终确实给雇主建立了一个信号,即你有 “激情”。这也让你可以更持续地发展你的学习成果。
我认为值去做规律的输出(比如,每周一次或更频繁),如果你的目标是成为一个合适的软件开发人员。但这并不适合每个人,而且很可能没有你想象的那么好的回报。
如果你有时间和精力的话,做一个季度,类似于艺术挑战,这是一个在短时间内学习很多东西的好方法。然而,如果你想兼职赚大钱,自由职业者可能是一个更好的选择,一旦你有技能。尽管按小时数赚钱并不是通往更高财富段的道路,但与产品开发或试图建立个人品牌相比,这是一个风险更低的方法。
尽量找到乐趣,以及可持续的长期动力。做好权衡,而不是遵循教条。使用二元搜索调试。倾听你的身体,对自己诚实。
译者:蒂克伟