如何充分利用计算机科学教育

大多数现代程序员在大学接受教育。 随着时间的推移,这种情况会改变,但现在的情况是,IT公司的优秀人才仍然来自大学。 在这篇文章中,Acronis 大学关系总监 Stanislav Protasov 谈论了他对未来程序员大学培训特点的看法。 教师、学生和雇用他们的人甚至可能会在其中找到一些有用的提示。

如何充分利用计算机科学教育

过去 10 年里,我一直在多所大学教授数学、算法、编程语言和机器学习。 如今,除了在 Acronis 担任职务外,我还是 MIPT 理论与应用计算机科学系的副系主任。 根据我在俄罗斯(不仅是)优秀大学的工作经验,我对计算机学科学生的准备情况做了一些观察。

30秒规则不再有效

我相信您已经遇到过 30 秒规则,该规则规定程序员应该在快速查看代码后了解函数的用途。 它是很久以前就发明的,从那时起,出现了许多操作系统、语言、硬件和算法。 我编写代码已经有 12 年了,但最近我看到了一个产品的源代码,乍一看对我来说就像魔法一样。 今天,如果你没有沉浸在主题领域,那么 30 秒规则就不再起作用了。 不然的话,不只是30秒,就是300秒也不够你弄清楚是什么。

例如,如果您想编写驱动程序,则需要深入该领域并阅读数千行特定代码。 通过这种研究主题的方法,专家会产生一种“心流感”。 就像在说唱中一样,当良好的韵律和正确的节奏的感觉出现时,无需特殊的合理化。 同样,训练有素的程序员可以轻松识别无效或简单的错误代码,而无需详细研究发生样式冲突或使用次优方法的位置(但这种感觉可能很难解释)。

专业化和日益复杂性导致学士学位教育不再提供足够深入研究所有领域的机会。 但正是在这一层次的教育中,人们需要获得一种观点。 之后,在研究生院或工作中,您将需要花一些时间让自己沉浸在学科领域的问题和细节中,研究俚语、编程语言和同事的代码,阅读文章和书籍。 在我看来,这是在大学的帮助下,为未来“打上横梁”的唯一途径。 T型专家.

什么编程语言最适合在大学教授?

如何充分利用计算机科学教育
令我高兴的是,大学老师已经放弃寻找“最好的编程语言是什么?”这个问题的正确答案。 关于 C# 或 Java、Delphi 或 C++ 哪个更好的争论实际上已经消失。 许多新的编程语言的出现和教学经验的积累导致了学术环境中的既定认识:每种语言都有自己的利基市场。

使用一种或另一种编程语言进行教学的问题已不再是一个优先事项。 课程用什么语言教授并不重要。 最主要的是语言的表达能力足够。 书 ”多处理器编程的艺术”是这一观察的一个很好的例证。 在这个现在的经典版本中,所有示例均以 Java 呈现,Java 是一种没有指针但具有垃圾收集器的语言。 几乎没有人会认为 Java 远非编写高性能并行代码的最佳选择。 但这种语言适合解释书中提出的概念。 另一个例子 - 经典机器学习课程 Andrew Nna,在 Octave 环境中使用 Matlab 进行教学。 今天,您可以选择不同的编程语言,但如果思想和方法很重要,那又有什么区别呢?

更实用、更贴近现实

与此同时,近年来大学里的实践者也越来越多。 如果说早期的俄罗斯大学课程因脱离现实而受到积极批评,那么今天的信息技术教育却不能这样说。 10年前,大学里几乎没有具有实际行业经验的教师。 如今,专业系的课程越来越多地不是由全职计算机科学教师授课,而是由执业 IT 专家授课,他们在主要工作的空闲时间只教授 1-2 门课程。 从高质量的人才培训、更新课程,当然还有寻找公司潜在员工的角度来看,这种方法是合理的。 我不认为我会通过说我们支持 MIPT 的基础部门并与其他大学建立关系来透露这个秘密,包括为可以在 Acronis 开始职业生涯的学生做好准备。

数学家还是程序员?

如何充分利用计算机科学教育
以前围绕编程语言展开的圣战已经转向哲学方向。 现在所谓的“程序员”和“数学家”正在互相争论。 原则上,这些学校可以分为两个教育项目,但业界在区分这种微妙之处方面仍然很差,而且从一所大学到另一所大学,我们都有类似的教育,但侧重点略有不同。 这意味着学生和他将继续工作的公司都必须用缺失的部分来补充知识拼图。

大学里用不同语言编写工业代码的从业者的出现,让学生获得了更好的开发技能。 熟悉标准库、框架和编程技术的实现,实践程序员向学生灌输编写优秀代码的愿望,并快速有效地完成它。

然而,这种有用的技能有时会导致那些喜欢重新发明轮子的人的出现。 编程学生会这样想:“我是不是应该再写200行好代码,正面解决问题呢?”

接受过经典数学教育(例如,来自数学或应用数学学院)的教师经常在伪科学环境中工作,或者在建模和数据分析领域工作。 “数学家”对计算机科学领域的问题有不同的看法。 它们主要不是使用代码,而是使用算法、定理和形式模型进行操作。 数学方法的一个重要优点是对可以解决什么和不能解决什么有清晰的基本理解。 以及如何解决。

因此,数学老师谈论编程时偏向于理论。 来自“数学家”的学生通常会想出经过深思熟虑且理论上优越的解决方案,但从语言学的角度来看通常不是最佳的,而且通常只是草率地编写。 这样的学生认为他的主要目标是展示原则上解决此类问题的能力。 但实施可能很蹩脚。

在学校或第一年作为程序员长大的孩子们都会带着一辆“非常漂亮的自行车”,然而,这辆自行车通常渐近地工作效率不高。 相反,他们不会给自己设定深入理论和转向教科书寻找最佳解决方案的任务,而是更喜欢漂亮的代码。

在不同的大学,在采访学生时,我通常会看到他的教育背景是哪个“学校”。 而我在基础教育方面几乎从未遇到过完美的平衡。 小时候,在我的城市,你可以准备数学奥林匹克竞赛,但没有编程俱乐部。 现在,在俱乐部里,孩子们学习用“时尚”的 Go 和 Python 进行编程。 因此,即使在大学的录取层面上,也存在着不同的做法。 我认为在大学里保持这两种技能很重要,否则要么是理论基础不足的专家,要么是没有学过、不想写出好的代码的人来公司工作。

如何为未来“打气” T型专家?

如何充分利用计算机科学教育
显然,在这种情况下,学生只是选择他最喜欢的东西。 老师只是传达了与他更接近的观点。 但如果代码写得漂亮,并且从算法的角度来看,一切都清晰、合理、有效,那么每个人都会受益。

  • IT 视野。 计算机科学学士学位的毕业生是一位现成的专家,具有成熟的技术前景,他可能已经选择了自己的个人资料。 但到了大三,我们不知道他或她会做什么。 他可以进入科学或分析领域,或者相反,他可以每天编写大量代码。 因此,需要向学生展示 IT 领域工作的各个方面并介绍所有工具。 理想情况下,理论课程的教师将表现出与实践的联系(反之亦然)。
  • 增长点。 不让自己走极端符合学生自己的利益。 理解你是“数学家”还是“程序员”并不困难。 在解决问题时,倾听第一冲动就足够了:你想做什么——查阅教科书寻找最佳方法,或者编写几个以后肯定有用的函数? 在此基础上,你可以构建进一步互补的学习轨迹。
  • 替代知识来源。 碰巧这个程序很平衡,但是“系统编程”和“算法”是由完全不同的人教授的,有些学生更接近第一个老师,而另一些学生则更接近第二个老师。 但即使你不喜欢教授,这也不能成为你忽视某些科目而偏爱其他科目的理由。 单身汉本身感兴趣的是寻找利用知识来源的意愿,并且在任何情况下都不相信激进的观点,例如“数学是科学女王,最重要的是了解算法”或“好的代码可以弥补其他一切”。

您可以通过专业文献和在线课程来加深您的理论知识。 您可以在 Coursera、Udacity 或 Stepik 上提高您的编程语言技能,其中提供了许多不同的课程。 此外,如果学生觉得算法老师很了解数学,但无法回答复杂的实现问题,他们通常会开始观看硬核语言课程。 不是每个人都会同意我的观点,但在我的实践中它已经证明了它很好 Yandex 的 C++ 专业化,其中越来越复杂的语言特征被依次分析。 一般来说,选择信誉良好的公司或大学评价较高的课程。

软技能

如何充分利用计算机科学教育
从大学毕业到任何一家公司工作,从初创公司到大公司,即使是来自顶尖大学的学生也发现自己不太适应真正的工作环境。 事实上,今天的大学“照顾”了很多学生。 即使缺了很多课、没有按时准备考试和考试、睡过头或者考试迟到,每个人都可以通过并重新参加考试——最终仍然可以获得文凭。

然而,今天学生已经具备了为成年生活和独立职业活动做好准备的一切条件。 他们不仅要编程,还要沟通。 这也是需要教导的。 大学有多种形式来培养这些技能,但可惜的是,它们往往没有得到足够的重视。 然而,我们有很多机会获得有效的团队合作技能。

  • 书面商务沟通。 不幸的是,大多数大学毕业生对通信礼仪一无所知。 即时消息通信的特殊性在于日夜交换消息以及使用对话风格和非正式词汇。 然而,当学生与院系和大学交流时,可以训练书面演讲。

    在实践中,管理者经常面临将大项目分解为小任务的需要。 为此,您需要清楚地描述每个任务及其组件,以便初级开发人员了解他们的要求。 定义不明确的任务通常会导致需要重做某些事情,这就是为什么书面沟通的经验有助于毕业生在分布式团队中工作。

  • 书面展示你的工作成果。 为了展示他们的教育项目,高年级学生可以在 Habr 上发表帖子、科学文章,也可以只是报告。 这样做的机会有很多——一些大学的课程工作从第二年开始。 您还可以使用论文作为一种控制形式 - 它们通常在形式上更接近新闻文章。 这种方法已经在国立研究大学高等经济学院实施。

    如果一家公司采用灵活的开发方法,它就必须以较小的部分但更频繁地展示其工作成果。 为此,能够简要传达一位专家或整个团队的工作成果非常重要。 此外,如今许多公司每年或半年进行一次“审查”。 员工讨论结果和工作前景。 成功的审核是职业发展、奖金的主要原因,例如在 Microsoft、Acronis 或 Yandex。 是的,你可以很好地编程,但是“坐在角落里”,即使是一个很酷的专家也总是会输给那些知道如何很好地展示自己成功的人。

  • 学术写作。 学术写作值得特别提及。 对于学生来说,熟悉撰写科学文本、使用论证、在各种来源中搜索信息以及格式化这些来源的引用的规则是有用的。 建议用英文进行,因为国际学术界还有很多好的文本,而且各个学科已经建立了展示科学成果的模板。 当然,准备俄语出版物时也需要学术写作技巧,但优秀的现代英语文章的例子却少得多。 这些技能可以通过适当的课程获得,这些课程现在已包含在许多教育计划中。
  • 主持会议。 大多数学生不知道如何准备会议、做会议记录和处理数据。 但如果我们在大学里培养这种技能,例如通过参与团队项目,我们就可以避免在工作场所浪费时间。 这就需要对学生的项目工作进行监督,以教会他们如何有效地召开会议。 实际上,这会让每个公司花费大量金钱 - 毕竟,如果几个拿着高薪的人在集会上花费一个小时的工作时间,你希望得到相应的回报。
  • 公开演讲。 许多学生只需要在论文答辩时公开发言。 并不是每个人都为此做好了准备。 我见过很多学生:
    • 背对观众站立,
    • 摇摆着,试图将委员会引入恍惚状态,
    • 折断钢笔、铅笔和教鞭,
    • 绕圈走
    • 看看地板。

    当一个人第一次表演时,这是正常的。 但你需要尽早开始应对这种压力——在友好的氛围中,在同学中捍卫你的课程作业。

    此外,公司的标准做法是让员工有机会提出想法并为此获得资金、职位或专门项目。 但是,如果你仔细想想,这与对课程作业的保护是一样的,只是级别更高。 为什么不在学习的同时练习这些有用的职业技能呢?

我想念什么?

写这篇文章的原因之一是这篇文章, 发表在秋明州立大学网站上。 文章作者只关注外教注意到的俄罗斯学生的缺点。 我在不同大学的教学实践表明,俄罗斯学校和高等教育提供了良好的基础。 俄罗斯学生精通数学和算法,更容易与他们建立专业交流。

相反,对于外国学生来说,俄罗斯老师的期望有时可能太高。 比如,在数学方面的基础训练水平上,我遇到的印度学生和俄罗斯学生差不多。 然而,他们在本科毕业时有时缺乏专业知识。 优秀的欧洲学生在学校的数学背景可能不太强。

如果您在大学学习或工作,您现在可以练习沟通技巧(您自己或您学生的)、扩展您的基础基础并练习编程。 为此,俄罗斯教育体系提供了所有的机会——你只需要正确地利用它们。

如果您在帖子的评论中分享有助于均衡教育平衡的课程和方法的链接,以及在大学学习期间提高软技能的其他方法,我将很高兴。

来源: habr.com

添加评论