0%

推荐

许多事情并不是立竿见影的影响,而是不断经历失败后再次看到之后才发觉原来如此。

Why Functional Programming Matters 阅读笔记

本文是 Why Functional Programming Matters(为什么函数式编程很重要)的阅读笔记,用相对通俗的语言解读了这篇论文,并对我觉得重要的一些点做了一些解释。

为什么函数式编程很重要?随着软件变得越来越复杂,良好地组织软件也越来越重要。一个组织良好的软件更容易编写调试,这种软件提供了一组可以复用的模块(module),这也降低了未来编写代码的代价。本文将说明,函数式编程语言的特色,尤其是高阶函数和惰性求值(high-order function and lazy evaluation),将会对模块化非常有利。因为模块化是软件开发成功的关键,所以函数式编程会在软件开发过程中具备很大的优势。

模块化的过程是将问题分解成子问题,求解子问题,再将子问题的解结合(glue)起来的过程。怎么分解直接依赖于编程语言提供了怎样的结合方法。所以要增强模块化能力,需要提供新的结合方法。

模块化对编程很重要,模块化(modularity)不仅仅是模块(module)。

Teach Yourself Programming in Ten Years

为什么每个人都这么着急?走进任何书店,您将看到如何在24小时内自学Java,以及无穷无尽的变体,可以在几天或几小时内教授C,SQL,Ruby,算法等。

结论是要么人们急于学习编程,要么编程比其他任何东西都更容易学习。Felleisen 等。 在他们的书《*如何设计程序》中对这种趋势表示赞同,当他们说“错误的编程很容易。白痴可以在21天内学习它,即使他们是傻瓜*。” Abtruse Goose漫画也受到了欢迎。

  • 自学:

    在24小时内,您将没有时间编写几个重要的程序,并从它们的成功和失败中学习。您将没有时间与经验丰富的程序员一起工作,也不了解在C ++环境中生活的感觉。简而言之,您将没有时间学习很多东西。因此,这本书只能说是肤浅的熟悉,而不是深刻的理解。正如亚历山大·波普(Alexander Pope)所说,学一点东西是一件危险的事情。

  • C++:
    在24小时内,您可能可以学习C ++的某些语法(如果您已经知道另一种语言),但是您对如何使用该语言的了解却不多。简而言之,如果您是一名Basic程序员,则可以学习使用C ++语法以Basic风格编写程序,但是您将无法了解C ++的优点(或缺点)。那有什么意义呢?

艾伦·珀利斯(Alan Perlis)曾经说过:“一种不影响您对编程的思考方式的语言,是不值得了解的”。一个可能的观点是,您必须学习一小部分C ++(或更可能是JavaScript或Processing之类的东西),因为您需要与现有工具交互以完成特定任务。但是,那时您不会学习编程。您正在学习完成该任务。

十年自学编程

在下棋,音乐等众多领域中发展专业知识大约需要十年的时间。写作,电报操作,绘画,钢琴演奏,游泳,网球以及神经心理学和拓扑学研究。关键是商议 练习:不仅要一遍又一遍地做,还要挑战一项超越您当前能力的任务来挑战自己,尝试一下,分析执行前后的表现,并纠正任何错误。然后重复。再重复一次。似乎没有真正的捷径:即使是4岁的音乐天才莫扎特,也花了13年的时间才开始创作世界一流的音乐。在另一种类型中,甲壳虫乐队似乎爆出一连串的#1热门歌曲,并在1964年的埃德·沙利文(Ed Sullivan)演出中露面。但是自1957年以来,他们一直在利物浦和汉堡的小型俱乐部里打球,尽管他们颇具吸引力在早期,他们的第一个重大成功就是Sgt。Peppers于1967年发行。

马尔科姆·格拉德威尔尽管他专注于10,000小时(而不是10年),但他已经推广了这个想法。亨利·卡蒂埃·布雷森(Henri Cartier-Bresson,1908-2004年)的另一个标准是:“您的前10,000张照片是最糟糕的。” (他没想到数码相机会在一个星期内达到这个目标。)真正的专业知识可能需要一辈子:塞缪尔·约翰逊(Samuel Johnson(1709-1784))说:“任何部门的出色表现,只有靠一生;不应以较低的价格购买。” 乔uc(1340-1400)抱怨说:“莱夫(lyf)太短了,手工艺品那么久了。” 希波克拉底(约公元前400年)以“ ars longa,vita brevis”的摘录而闻名,它是“ Ars longa,vita brevis,occasio praeceps,experimentum perculosum,iudicium difficile”较长引语的一部分,在英语中译为“生命”。是短, 当然,没有一个数字可以作为最终答案:假设所有技能(例如编程,下棋,下棋和玩音乐)可能都需要完全相同的时间来掌握,这似乎是不合理的,也不会所有人都花费完全相同的时间。正如K.Anders Ericsson教授所说:“在大多数领域,即使是最有才华的个人也需要多少时间才能达到最高水平。令人难以置信的是,10,000小时的小时数使您感觉我们正在谈论多年每周10至20个小时,有些人会说这些是天赋最才华的人,仍然需要达到最高水平。”

我想成为一名程序员

  • 获取感兴趣的,因为他很有趣,确保保持足够的乐趣,以便令我愿意投入十年/10,000小时的时间。
  • 程序学习的最好方法就是边做边学。从技术上讲,“在一定范围内,个人的最高绩效不会根据扩展的经验而自动获得,但是,即使是经验丰富的个人,也可以通过有意改进来提高绩效水平。 ”
  • 最有效的学习需要对特定个体具有适当难度级别的明确定义的任务,信息反馈以及重复和纠正错误的机会。
  • 与程序员交流,阅读其他程序,这比任何书籍或培训课程都重要。
  • 如果需要,可以在大学学习期间获得一些实习,无论如何,仅靠书籍学习是不够的。“计算机科学教育不能使任何人成为专业程序员,就像学习画笔和颜料怎么可能使某人成为专家画家一样。”
  • 缺乏创意吗?与其他程序一起从事项目。在某些项目中成为最好的程序员;在其他人身上最糟糕。当您处于最佳状态时,就可以测试自己领导项目的能力,并用自己的远见激发他人。在最坏的情况下,您将学习大师的所作所为,并了解他们不喜欢做的事情(因为他们让您为他们做)。
  • 了解别人编写的程序。看看当原始程序员不在时需要理解和修复它的过程。考虑如何设计您的程序,使那些在您之后维护它们的人更轻松。
  • 学习至少六种编程语言,包括一种强调类抽象的语言(例如Java或C ++),一种强调功能抽象的语言(例如Lisp或ML或Haskell),一种支持语法抽象的语言(例如Lisp),一种支持声明性规范的语言(例如Prolog或C ++模板)。 ,并且强调并行性(例如Clojure或Go)。
  • 计算机科学,了解计算机执行一条指令,从内存中获取一个单词(有或没有缓存未命中),从磁盘读取连续的单词以及在磁盘上寻找新位置需要多长时间。
  • 语言的标准化,良好的意识,尽快开始语言标准化工作。考虑到所有这些,仅通过学习书籍就能取得多大的成绩值得怀疑。在我的第一个孩子出生之前,我阅读了所有“ 如何做”书,仍然感到自己是一个笨手笨手的新手。30个月后,当我的第二个孩子到期时,我是否又回到书店复习了?否。相反,我依靠自己的个人经验,事实证明,与专家撰写的成千上万页相比,这对我来说更加有用和令人放心。

弗雷德·布鲁克斯(Fred Brooks)在他的论文《*无银子弹》中* 确定了一个由三部分组成的计划,以寻找优秀的软件设计师:

  • 尽早系统地确定顶级设计师。
  • 指派职业指导者负责潜在客户的发展,并仔细保存职业档案。
  • 为成长中的设计师提供互动和相互刺激的机会。

假设某些人已经具备成为优秀设计师所需的素质;工作是适当地哄骗他们。更简洁地说:“每个人都可以雕刻:米开朗基罗必须被教导如何不做。伟大的程序员也是如此。” 佩利斯(Perlis)说,伟人的内在素质超越了他们的训练。但是质量从何而来?是天生的吗?还是他们通过勤奋发展?正如奥古斯特·古斯托(Ratatouille的虚构厨师 )所说,“任何人都可以做饭,但只有无所畏惧的人才能做得好。” 我将其更多地视为愿意将一生的大部分时间投入到思考实践中。但也许 无所畏惧是一种概括的方式。或者,正如古斯托(Gusteau)的批评家安东·埃戈(Anton Ego)所说:“并非每个人都能成为一名伟大的艺术家,但是伟大的艺术家可以来自任何地方。”

因此,继续购买那本Java / Ruby / Javascript / PHP书;您可能会从中受益。但是您不会在24小时或21天内改变自己的生活,也不会改变自己真正的整体专业知识。如何努力在24个月内不断改进?好吧,现在您开始有所建树…

参考文献

附录:语言选择

先学习哪种编程语言。是没有答案,但可以考虑以下几点:

  • 使用你的朋友*。当被问及“我应该使用哪种操作系统,Windows,Unix或Mac?”时,我的回答通常是:“使用您的朋友使用的任何软件”。从朋友那里学习所获得的优势将抵消操作系统之间或编程语言之间的任何内在差异。还请考虑您的未来朋友:如果继续,您将成为程序员社区的一部分。您选择的语言是一个正在成长的大型社区还是一个濒临灭绝的社区?是否有书籍,网站和在线论坛可提供答案?您喜欢那些论坛中的人吗?
  • 保持简单*。诸如C ++和Java之类的编程语言是由经验丰富的程序员组成的大型团队设计的,这些团队关心其代码的运行时效率。结果,这些语言具有针对这些情况设计的复杂部分。您担心要学习编程。您不需要那种麻烦。您需要一种被设计为易于由单个新程序员学习和记住的语言。
  • 玩。宁愿学习弹钢琴的方式:通常的互动方式,即敲击琴键后便会听到每个音符,或者是“批处理”模式,即在完成整首歌曲后才听到音符?显然,交互式模式使钢琴和编程学习变得更加容易。坚持使用交互式模式的语言并使用它。

给定这些条件,我对第一种编程语言的建议是**Python**或 **Scheme**。另一个选择是Javascript,不是因为它是为初学者精心设计的,而是因为有许多在线教程供您使用,例如 Khan Academy的教程。但是您的情况可能会有所不同,还有其他不错的选择。如果您的年龄是个位数,则您可能更喜欢 AliceSqueakBlockly(年龄较大的学习者可能会喜欢)。重要的是您选择并开始。

书籍和其他资源

计算机程序的结构和解释(Abelson和Sussman)可能是计算机科学的最好入门,它确实教授编程作为理解计算机科学的一种方式。您可以在本书中在线观看讲座视频,以及在线全文。这本书具有挑战性,将淘汰一些可能通过另一种方法成功的人。

如何设计程序(Felleisen 等人是有关如何以优雅和实用的方式实际设计程序的最佳书籍之一。

Python:Python编程:CS入门(Zelle)是使用Python的不错的入门。

Python:Python.org 上提供了一些在线教程

计算机编程的概念,技术和模型(Van Roy和Haridi) 被某些人视为Abelson&Sussman的现代继任者。这是一门编程的大创意,涵盖了比Abelson&Sussman更大的范围,同时也许更易于阅读和遵循。它使用一种广泛使用的语言Oz,但它是学习其他语言的基础。