他学医三年后转专业到计算机,竟又辍学当了软件工程师

编者按:这是一个学医的人如何中途换专业改学计算机然后再辍学最后成为软件工程师的故事。不过这个故事的重点不是他的个人经历,而是对如何学习以及教育方法的总结与反思。他的一点感悟非常深刻:教与学都应该以掌握基础为目的。

他学医三年后转专业到计算机,竟又辍学当了软件工程师

介绍

我大学是学医的,学了3年。经过漫长而复杂的一系列事件和领悟之后,我萌生了对计算机科学以及随后的软件工程的兴趣。于是,我决定换学院改学软件工程本科课程。

不过那课程我只学了2个月不到。

这不是因为我不想承担义务。相反,我有对目标痴迷到一门心思的本事。因为痴迷,我很容易就会意外地深入学习特定主题时忘记了社交和日常责任等事情。

对于一些人来说,痴迷学习听起来也许跟通常被归纳为“大学辍学生”(我就是)的特征不相符。

但其实这是完全说得通的。我上的课提供给我的材料既不够又不合适。而且学习的进度就像蜗牛一样,我的很多问题都没有回答(哪怕我亲自去找了教授)。我已经厌烦了拷贝板书出来的程序。我已经厌倦了只听见“面向对象范式”而不见这个“神秘”的面向对象的影子。我对只是肤浅地学习已经烦透了。

我记得有一节课后我去图书馆拿起了一本Java书。我整个下午和晚上都在看和做实验。那一个晚上我学到的东西比我在课堂上整整1个半月学到的东西都要多。那么我花钱买到的是什么?不就是个纯正的学位吗?我再也无法忍受自己上这样的课因为我在课堂上花费的时间太多而在学习上花费的时间太少了。

不过我并不认为这是课程的错,这其实是以课堂为基础的一般教育的过错。出于多个原因,课堂教育似乎没有针对能力而优化。不过除了所有那些对教学方式的不安以外,对我而言课堂教育还有一个更深层次的问题:这实在是太无聊了。有时候上课节奏太快太肤浅,有时候又出奇的慢。哪怕课程内容很深,但训练却不是。

总的说来,我发现课堂教育不足以推动学生走到那最后一步:从知识转化为可行动的理解。所谓的“可行动的理解”是指用潜在的新颖方式将知识应用到新的上下文环境的能力。如果不能认识概念在上下文中的存在的话你是不是真的理解这一概念呢?这就好比因为你能对一个函数求导(这仅仅是机械操作)但没认识到适用在什么地方,它为什么重要或者实际意义是什么就宣称你知道那导数一样。计算机就能替我们执行机械擦做。但计算器并不能看清一个问题并且利用直觉理解来推断出正确的办法。它们只能执行被命令去做的操作。难道我们不应该比一部不智能的计算器对导数的“理解”更深入地理解概念吗?我认为应该。但课堂教育似乎不同意这一点。

当我在解决问题、学习新东西,或者形成概念之间的连接时,我喜欢踱来踱去,草草记点笔记,甚至大声地向自己解释想法。我喜欢从许多不同的角度检查我的心智模式,直到找到需要修补的漏洞。此外,一旦旧主题逐渐失势我喜欢不断修正,反过来从新的角度审视这些东西,从而有机会建立我过去错失的连接,重新测试我的理解。

于是我辍学,开启了一段非传统的教育之旅。一开始,我完全按照自主的学习方式。在这一初步阶段,我把绝大部分的精力都放在了想出可靠的学习计划(不是那么简单的)这一项目上面。我知道我偶需要根据第一原则去学习,但是梳理那堆数不胜数的资源需要消耗的时间和精力太多了,所以我的学习进度变得很慢。我知道自己有动力,也能够吸收信息并且综合利用,并且严格地拷问自己的心智模式——这一切都是高效自学者的特质。我不那么熟练的是对自己制订的学习路径的坚持,因为我总认为这样是不够的:我不是这个领域的专家,所以又又什么资格替自己设计一门有效的课程呢?我不是软件工程师应该知道什么方面权威的信息来源。我需要一些指导来起步……最好是来自专家的指导。

学习资源比较

我开始去寻找非传统的外部教育资源来提供更多的指导。

MOOC

我想到的第一个非传统资源是MOOC生态体系。在筛选了无数选项之后,我意识到MOOC有一个问题跟我之前遇到过的类似:那就是几乎每一个专题都有MOOC。此外,它们在质量、深度、教学方法以及时间限制方面各不相同,意味着如果我要把MOOC作为主要学习来源的话我有很多其他因素要过滤。

就像以往一样,我需要筛选掉其中的很多,还要确定报读哪一门课,以及最合理的上课顺序,决定哪些主题是基础,哪些属于“可选”。MOOC不是一个理想的来源于是我当时放弃了,开始另想办法。

训练营

我喜欢训练营的想法,因为高强度学习对我很有吸引力。我不怕压力,并且喜欢挑战认知极限……以及成功突破。我在考察无数的训练营的时候,注意到它们都存在两个致命缺陷:

  1. 时间约束似乎太极端因此排除了迭代测试和评估一个人对主题的理解的能力。在这里是没有机会进行循环学习的。
  2. 主题传授的深度不够。即便是最好的训练营对于学生的基础知识准备得也很不充分。

换句话说,我把训练营看作是产生用户而不是开发者的一种方式。什么的用户?框架和高级开发工具的用户。我不想被局限在特定的工具集或者一些基于软件潮流的狭隘的开发原则里面,而没有根植于基础/根本性的知识和培训。当然,这条规则总会有例外,我也听说过一些相当强的人是从训练营出来的(我就见过几个)。

训练营似乎对那些已经具备技术背景只是想跟进特定专业的人更加成功,比如web app开发或者移动开发。

自学课程

我还发现了好几个由自学者创建也是面向自学者的课程。在Reddit和Medium上会时不时冒出不同的“自行设计的硕士学位”文章和要点。我看了很多。我还看了teachyourselfcs上面的课程,内容还是挺可靠的。

这些课程的主要问题不是品质(其实上面还是有一些比较全面、合理的课程的),但是我意识到,纯粹的自学在一个人有了坚固的基础知识和培训,变成内行之后才会更高效。这是因为自学缺乏对新手很关键的一个组件:反馈。

(来自那些有资格提供的人的)反馈是最强大的自我改进形式(假设你遵循的话)。特定领域的新手并不知道如何识别合格的工作或者信息。他们不知道在自己的实践中如何识别反模式。他们不知道如何解释项目(尤其是较大型的)中的微妙之处,也不知道如何让自己对特定标准负责,因为他们不知道那些标准是什么(或者哪怕理论上知道那些标准是什么,也不知道如何在实践中识别)。

Launch School

有一次我无意中遇到一个谜一样的东西——Launch School。我记得我浏览了他们的“Is this for me?(这是为我准备的吗?)”页面,这个是在解释Launch School是什么值钱专门解释Launch School不是什么的。基本上,这个地方不是给仍然在研究自己的选项的人准备的,也不是给那些想迅速找到工作的人准备的。实际上,LS对自己的“慢学习路径”感到自豪。

他们重视深度、掌握、循环学习以及坚持不懈。他们是“方便快捷”这种学习方法的反面。

他们的教学方法正是我想找的。他们称之为“立足于掌握的学习”,这是一种通过能力而不是时间来衡量进展的学习模式。在你证明自己已经掌握了目前课程材料之前是不能转到下一门课程的。

他们通过评估、访谈以及项目的组合来衡量是否掌握。通常的过程是3到4个小时的评估,里面会有各种问题让接受测试者用准确的语言来解释概念。他们的学习指导还解释“精度”是什么意思,如果有任何语言表达含糊或者过于复杂的话,给评估打分的讲师或者TA会让学生改正答案。学生绝对没有办法糊弄自己对材料的理解,因为学生的水平需要能解释概念以防止错过任何重要细节或者回答不清楚。

如果学生得分不够好,会被要求回去改正答案。如果得分低于B,他们会得到“还不行”的评价,然后至少一周的深入学习后必须重新进行评估。另一个“还不行”意味着再进行2周的学习,以此类推。

书面评价只是对是否掌握进行评估的第一部分。评估往往还会有项目及/或面试这些要素。在项目期间,学生会被赋予一套技术规范以及时间限制(通常是24到48小时)来开发出满足这些规范的应用。代码质量、结构以设计决策都会接受严格审查,并且由一位导师进打分,打分者会给学生非常充分的反馈。在面试期间,学生要在面试官面前解决问题,类似于求职面试时进行的编码挑战。面试还要求学生展示自己在开发应用是做出的设计决策。Launch School严格的评估从多方面测试了学生的沟通技能、计划水平、精确度以及代码质量等。

有导师和TA几乎可以全天候地回答问题。他们还对课程期间大量的编程作业进行无数的代码评审(记住:反馈对掌握非常关键)。

通过核心课程耗掉了我还几千个小时的学习。然后我转到了他们可选的顶点课程(capstone program),继续学习优化、算法分析和设计,系统设计。我还开发了一个项目来展示自己的思考能力、研究水平,管理复杂性的能力,以及设计深度。

顶点课程总共又花掉了我1000小时。我在纽约的好几场活动中展示了我的作品,这些作品引起了其他工程师足够的兴趣,他们都想引荐我,以至于我必须拒绝掉其中一些面试机会。在发出第一份求职书之后,我拿到了offer、面试机会,以及在2周内选择各种地点的自由。

我喜欢自己在LS的经历,因为我终于能够发挥自己爱钻研的本事了。我可以用苏格拉底的方式对一个主题刨根问底到死。

补充学习

我也利用了其他的来源学习,作为对LS课程的补充。数学这门课我几乎都没有接受过正轨培训,但是又非常重视这门课,因为它非常重要,而且还能带来智力上的快乐。这是我利用的主要资源:

  1. How to Prove It(如何证明)
  2. Discrete Math for Computer Science(计算机科学之离散数学)
  3. Linear Algebra(线性代数)
  4. 群论(同一位作者还写了一本抽象集合的书页很棒但不是必须看的)
  5. 《微积分第一卷》

我还自学了一点架构与设计,利用的是下面一些主要资源:

  1. 《Ruby实用面向对象设计》(适用一般的面向对象语言)
  2. 《Web应用架构》
  3. 《设计数据密集型应用》(此书尤其不可思议)
  4. 《Web应用安全:初学者指南》

基础的重要性

非传统背景对软件“工程师”常见的抱怨是他们知道如何编码但是“工程”方面的知识缺乏。或者换句话说:他们缺乏学生在更传统的教育课程(比如在大学里面见到的)中接触到的基础。

对于自学的开发者以及那些走非传统教育计划的人来说,很容易就会错过了学习基础的知识,以及仍然未意识到自己一开始就缺乏了一套核心的知识。太过专注于实用性的课程会牺牲掉为开发者产生强健的心智模式。这样的学习计划的问题在于构建在理论理解基础上的牢固心智模式其实是一项实用资产,因为它可以让开发者利用这些心智模式将新的信息情景化并且解决新问题。心智模式就像罗盘,辅助开发者在新的技术领域探索。

传统教育课程往往把太多的时间聚焦在理论上。因为这个,它们有时候会犯理论太过深入而牺牲了实践训练的错误。非传统教育课程往往相反:它们往往会犯实践太过深入而牺牲了理论训练的错误。不管是哪种情况,学生的准备都是不充分的:他们受到自身知识的限制而不是为其理解而赋权。这是由于错误的理论与实践的二分法。没有实践,学生对如何应用自己碰到的了理论就没有头绪。没有理论,学生就对如何将新信息适配到现有的“它是如何工作的”的模式没有主意,进而阻止了他们有效地同化新知识到真正理解上面。

缺乏理论的实践会将学生局限在他们当初受到培训的技术上(此处的适用术语是“框架用户”而不是“软件工程师”),而缺乏实践的理论会造就在接收第一本功能规范时对从何开始毫无头绪的学生。

牢固的心智模式需要理论与实践的融合。在进入你的第一个软件开发者角色前是不可能学会你作为一名软件开发者所需要掌握的一切的。总会有更多的东西要学。因此,最好的行动路线是形成牢固的基础理解,从而让你能迅速地吸收新信息,适应不断变化的行业。

传统和非传统教育都有看不见的例外。Launch School是一个非传统的教学计划但却强调心智模式、基础理解以及学习“不会改变的东西”的重要性。尽管软件业总在发生迅速变化,但基础性的东西却不会。对于毕业生来说雇佣他们从事的角色使用的是自己从未遇到过的技术是很常见的事情。

Western Governor’s University(西部州长大学)是大多数大学所遵循的标准教育的例外。我只是最近才了解到这么一所学校,并且对他们采用的所谓的“立足于能力的教育”教学方法印象深刻。在WGU这里,学生需要在特定课程证明自己具备足够技能才能进入到下一门课程。课程并没有时间限制:无论是哪一门学科,学生都要学到获得相应能力为止。

开发者培训的来源是什么无关紧要。不管是传统的、非传统的都行,他们是不是完全自学的也不要紧,需要考虑的最重要的一点是:他们是不是已经把基础给掌握了?

其他

我现在是一名二级软件工程师,正在跟一群非常有才能的工程师和总监共事。在充分掌握了基础并进行足够的实践之后,我感觉自己已经为解决复杂挑战做好了准备。我尤其喜欢现在这个位置的一点是我们所面临的其中一些挑战说没有办法在StackOverflow之类的地方找到的,因为我们是第一次尝试解决这些问题的人。

我希望立足于掌握的教学方法能逐步成为主流,因为它能防止得分在“C”或“D”档的人没完全掌握核心概念就过关了。

赶快去应用商店下载“师之app”了解最新最全的教育资讯,更有大牌入驻解答热点难题,为您带来专属的知识盛宴,快来加入吧!

他学医三年后转专业到计算机,竟又辍学当了软件工程师


分享到:


相關文章: