哈Ha! 我向您提供“
编程学生的建议 ”
文章的翻译。
当我作为一名软件学生开始我的旅程时,我想知道很多事情。 从那时起已经过去了将近10年,不幸的是,我无法与过去的“我”分享我的经验和知识,只能与我的年轻同事分享。 这篇文章包含一些我18岁时想听听的有用技巧。
决定你需要什么
当然,如果您只是想学习如何创建实用的东西(例如,一个界面)并做到这一点,则无需熟悉形式逻辑或
类别 。 在努力,持续时间和结果上存在两种主要途径。
- 您可以快速掌握一个领域-例如在一两年内。 您不会没有用处,您会做点事情来谋生。 有足够的工作机会(至少到目前为止)不需要太多的灵活性。
- 您可以成为在基本事物上花费大量时间和精力的成熟专家。 然后您可以适应,切换职业道路变得相对容易。 您可以进行机器学习,然后进行正式验证,然后进行一些底层交易程序,或者去玩游戏开发人员。 这需要时间和奉献精神-我将评估此过程至少6-8年。
我强烈建议第二条路径,因为它更通用,更有趣并且从长远来看会带来更多收益。 技术在不断变化,因此您将需要快速切换到新技术。
数学
学习数学,因为数学很有用。 我不能强调这一点。 开始时,您可能会认为不需要线性代数,因为您不了解应用程序。 但是,对于任何非平凡的机器学习,您都将需要它。 您需要统计数据和信誉。 您将需要逻辑,组合学,集合论,各种离散数学,图论,可计算性理论,形式语法,λ演算,形式语义,拓扑,类型理论,数论,组,环,字段,类别。
新技术不断涌现。 其中许多是基于现有数学模型的。 如果您精通基本数学,那么您将获得很多好处:
- 新型技术之间的选择将变得更加容易。
- 您将了解应在何处应用新方法,而不应在何处应用。
- 您将了解为什么解决方案才是真正的解决方案。 然后,您可以修改它们以更好地适合上下文。
例如,我给人的印象是,很少有人理解为什么您不必总是使用最小二乘法来评估您的线性回归与数据的匹配程度。 当误差以相应的平均值正常分布时,这是必需的。 如果不是这种情况,您将盲目地应用一个不足的解决方案,甚至不会认为需要调整模型的一部分。
学习数学以学习数学思维。 书面证据会使您的行为严谨。 您将始终考虑程序可以执行的所有可能的执行路径,以免引入错误和安全性问题。 从证据收集中获得清晰的思维是宝贵的。 它还将帮助您编写简短的代码。
学习最好,使用最好的工具
选择您的母语。 它应该经过精心设计,即具有:
- 连贯性。
- 小核心。
- 缺乏不必要的复杂性(例如,在学习“复杂”语言时,有些事情您只需要知道或经常记住,它们并不会带来任何对学习有用的东西)。
- “用脚砸自己的脚”的可能性低。
- 高层,因为编程是问题的解决方案 ,而不是任何语言的精通。 知道您喜欢的语言的所有小功能并不意味着在编程上是完美的。
我建议选择以下一种语言:
- 方案(有一门经典的入门课程“计算机程序的结构和解释”)。
- 小话
- 艾菲尔
- ML
不要害怕被这些语言的受欢迎程度所欺骗,在编程世界中,普及并不意味着质量。
不要以Python开始,求求您! 它设计不良,前后不一致,并且不会教您严格的思考。 无需习惯“良好的,通常可以工作的”心态。 Python有其用途,但不是第一语言。
如果您习惯了低质量的语言和低质量的工具,低质量的软件以及低质量的解决方案,
那么您将不可避免地在自己的工作中重复它们 。 保持批判性,提出问题,批评一切,寻找矛盾和缺点。
例如,假设您正在学习一种新的Go语言。 谷歌“ Go语言很烂”,并阅读人们为什么批评它。 有些评论是次要的,但其他评论确实有道理。 您可能会通过阅读批评性言论,对其进行评估,然后确定它们是否重要或只是空话而获得新知识。
自己想一想
自2009年以来,我一直在向圣彼得堡ITMO大学的学生教授编程(C和汇编程序)。 许多人遇到编程问题,但由于他们不创建代码,因此从未成功学习过此问题。 当他们找到工作时,他们尝试模拟现有的解决方案,也许是从Stack Overflow中获取一些片段,然后根据自己的喜好对其进行定制。 好的,有解决方案,还需要什么?
您必须学习从头开始编写代码。 所需的技能类型与通过干扰现有代码获得的技能有很大不同!
编程是一种有意识的选择。 您处于状态A(您可以访问许多语言功能/库,并且知道如何组合它们); 您想要获得状态B(组合了语言构造以解决问题)。 您如何建立从A到B的路线? 现在这是真正的编程,可以
解决问题 。
当您从头开始编写程序时,会有些困难,但是绝对有必要学习如何从头开始构建程序。 为了提高解决问题的能力,研究算法和数据结构非常重要。 拿一本好书,在线解决奥林匹克竞赛问题。 我向初学者推荐Dasgupta的算法,然后是Cormen经典书籍。 我保证,所有这些将为您打开一个全新的世界。
软件创建过程的另一部分是软件体系结构的开发。 如果不创建0到100的程序,就不可能学习如何正确构造程序。
开阔眼界
每天编程,始终做第三方项目。 对于作为老师的我来说,这是一种非常简单(且几乎是准确的)的方式,可以理解我的学生很有可能成功。 一个问题:您在空闲时间会编程什么?
您的老师根本没有足够的时间来谈论所有事情。 最后,离开大学后,您必须继续自己学习,直到退休。 如果您对自己的工作充满热情,那么您将学习各种不同类型的软件来娱乐,这将给您带来比不那么积极的同行更多的经验和技能。
理想情况下,您应该尝试所有事情:编写自己的编译器,也许是玩具OS,http服务器,数据库引擎,游戏,rakecasting,创建某种神经网络,编写简单的移动应用程序,编写内置程序...,您可以继续自己。 将您所有的项目都放在GitHub上并为此感到自豪:您的未来雇主可以看看它。 将此投资组合用于您自己的目的。
众所周知,招聘优秀的程序员非常困难。 许多申请工作的程序员在编写FizzBuzz之类的琐碎事情时遇到了麻烦。 如果您已有托管在GitHub上的项目,则雇主将更加确信您适合他。
使用不同的工具和语言进行测试。 如果有人告诉您所有语言都是相似的,那就是一种简化或缺乏经验。 让我解释一下。
计算模型是由基本操作和将它们按创建复杂算法所需的顺序粘在一起的方法组成的集合。 有些语言具有非常相似的计算模型,有些则相差很大。
编程远不止于基于相同原则构建的著名C / Python / Java / C ++ / C#/ Go / Javascript:命令式,结构式,一点点的OOP和语法糖来模拟其他编程样式。 编程的世界是巨大的。 怎么样:
- 具有复杂且经过深思熟虑的典型系统的工业功能编程语言(Haskell,Ocaml)。
- 具有依赖类型的功能语言不仅允许编程,还可以记录证据(Coq,Agda,LEAN)。
- 衔接语言(第四语言)。
- 逻辑编程(Prolog,Refal)。
- 有限状态机(正则表达式,Promela)。
- 强大的可扩展语言,使您可以实现几乎所有语法构造,例如Lisp,Forth,Camlp4 / 5,Rebol。
- 特定于域的语言(JetBrains MPS,XText)。
每个新的计算模型都很难理解,因为它是一种新的思维方式。 但是付出的努力和时间是值得的。
善于交际
我很幸运认识一些很棒的人。 我的助手帮助我提高了技能,学习了新知识,并从不同的角度看待世界。 从长远来看,与自己保持隔离不会对您有任何好处:您需要其他人进行讨论才能了解他们在做什么,在想什么。
如果您的朋友读了一篇有趣的文章并告诉您,您只是节省了很多时间,因为他给了您处理的,具体的知识。
坚持热情,聪明的人,并尝试向他们学习。 与与您分享工作或研究细节的同志共进午餐时,您会惊讶地学到了多少东西。 各种各样的想法是Google之类的公司为您提供免费食物的主要原因之一。
询问比较擅长代码审查和阅读代码的人员。 通过学习别人的工作,您可以学到很多东西。 代码审查将帮助您学习如何更好地编写代码。 这也许是非常非常快地成为更好的程序员的最有效方法之一。
编写测试
非常重要,因此您需要单独的文章。 测试是创建软件必不可少的一部分,即使像我这样从事正式测试软件的人(这意味着它必须在数学上严格地形式化)也要编写测试,尽管您可能会认为证据提供的保证很大更强。
我希望这可以帮助某人获得更好的画面,更快地学习并成为更好的程序员。 如有任何疑问,我们将竭诚为您服务。 祝你好运