zoukankan      html  css  js  c++  java
  • 每个人都应该学习一门编程语言

    关键词:编程入门,编程语言基本要素
    作者:码匠信龙

    在纪录片《乔布斯:遗失的访谈》中,乔布斯谈到他20岁左右学习编程的经历:

    当时编程可以帮助我们完成工作,但没有明确的实用性,重要的是我们把它看作思考的镜子,学习如何思考。

    我觉得每个人都应该学习一门编程语言。学习编程教你如何思考,就像学法律一样。学法律并不一定要为了做律师,但法律教你一种思考方式。学习编程也是一样,我把计算机科学看成是基础教育,每个人都应该花一年时间学习编程。

    乔布斯访谈.png

    每个人都应该去学习一门编程语言,但不是让你成为程序员,而是它可以使你换一种方式思考问题,或许对你要做的事情或遇到的问题有所帮助。

    先来看个例子,在李笑来老师的《把时间当作朋友》第一章的第三小节有讲到他那本帮他实现财务自由的畅销书《TOEFL核心词汇21天突破》是如何写出来的。

    当年我在少年宫学习计算机程序语言的时候,怎么可能想象得到,在20多年后的某一天,我需要先用软件调取语料库中的数据,然后用统计方法为每个单词标注词频,再写一个批处理程序从相应的字典里复制出多达20MB的内容,重新整理……

    《TOEFL核心词汇21天》这本书是包含了TOEFL考试常考2140个词汇,而词条内容由音标、释义、例句、衍生词、同义词五个基本单位构成,例句全部来自真实文章,其他内容的来自《美国传统辞典》。

    李笑来老师为这本书编写的批处理程序,可以简化理解为解决下面几个问题:
    1.如何统计过往TOEFL历年真题文章中单词词频。
    2.如何给统计的单词排序。
    3.如何提取字典里对应单词的音标、释义、衍生词、同义词。
    4.如何按单词提取真题文章所在的句子。

    如果让你来解决李笑来老师例子的第一个的问题(统计单词的词频),怎么来用文字语言来描述你的想法,手工实现步骤要做哪些事情,读者先自己思考一下,后面笔者给出自己的思路和实现。

    如何解决上面提到的问题,如果纯人工统计和整理是件繁琐耗时间的事情,李笑来老师也表示

    在编写《TOEFL核心词汇21天突破》的过程中,倘若我没有稍多于常人的那点计算机知识,能自己编写一些批处理脚本,就不可能在那么短的时间里完成那样海量的工作。而且,如果没有这些技能,就算再花几倍的时间,也很难拿出具有与《TOEFL核心词汇21天突破》同样的质量的作品。而最终,质量保证了销量。

    编程语言就是为此而生的,它可以简化很多重复繁琐的事情。

    现在的编程语言种类繁多,每个语言都有其各自的特点,就像学习书法里有很多种字体,初学者可以根据自己的喜好来选择一门编程语言,无论学习哪种语言,一个强有力的语言都要提供下面三种机制,使我们能够在其中组织自己有关计算过程的思想:

    1. 基本表达形式,用于表示语言关心的最简单的个体。
    2. 组合的方法,通过它们可以从简单的东西出发构造出复合的元素。
    3. 抽象的方法,通过它们可以为复合对象命名,并将它们当作单元去操作。

    可能开始有点难理解上面这段话,就拿衍纸来类比:
    1.基本表达形式,由不同颜色的纸带组成的,最简单的个体。
    2.组合的方法,通过简单的个体随意地制作出你自己设计的图案。
    3.抽象的方法,把制作出的图案作为单元,去拼凑更加复杂的图案。

    衍纸常用基础造型.jpeg

    衍纸艺术.jpeg

    初学者可以创造出简单的作品,同样的素材,造诣深的艺术家却可以创造
    精妙绝伦的作品。又例如古老的围棋游戏,虽然只有黑白两种棋子,通过简单的规则,初学者下得棋局比较简单,围棋大师却可以下出千万种复杂多变的高深棋局。同样编程语言,由不多的关键字和规则构成,却可以构造出千变万化的程序,这也是编程美妙和吸引我的地方。

    现实世界的要解决的问题,到实际编程中,可以转换为处理两类要素:数据和过程。非形式的说,数据是一种我们希望操作的“东西”,而过程就是有关操作这些数据的规则的描述。这样,任何强有力的程序设计语言都必须能够表述基本的数据和基本的过程,还需要提供对过程和数据进行组合和抽象的的方法。

    一般编程语言会提供以下基本知识要点:
    1.数据类型和变量
    2.运算符和表达式
    3.控制流(条件判断和循环)
    4.函数
    要点1归类到数据,要点2-4归类到过程里。

    上面的知识要点可能初学者在学习时候会觉得有点抽象难理解,你试着带着疑问来思考为什么要有这些要点,这样会容易理解些。

    为什么要有数据类型,计算机是不知道现实世界中各种各样的事物,你必须得要告诉它,简单的如整型,浮点,字符串等,复杂的如声音、图片、文件等,这样和现实中对应要解决问题的个体的类型形成一个对应关系。如统计词频问题,会用到整型,字符串,文件等数据类型。

    为什么要有控制流, 现实生活中,总要做各种选择,编程语言对应的就是条件判断,如判断单词是否相等。我们要重复做某件事情,编程语言对应的就是循环,如统计词频问题里,要逐个阅读文章每个单词,判断前面是否出现过,并记录下来。

    这样就不难理解编程语言为什么要提供这些东西,如果每块扩展开来讲解,差不多是半本书的内容,读者可以根据自己想学的语言来学习每个知识要点的内容。

    最后,笔者给出前面提到的统计真题文章中单词的出现频率的大致流程:
    1.读入一篇真题文章
    2.逐个提取单词
    2.1判断单词前面是否出现过,如果出现过,则记录单词次数累加1,否则记录单词为第一次出现
    3.遍历输出结果

    python代码简单实现,忽略了一些特殊情况处理:

    #统计一篇英文文章各个单词出现的词频的函数
    def wordcouter(path):
          result = {}                        #单词词频字典,记录单词次数
          file_obj = open(file)              #打开真题文件
          all_the_text = file_obj.read()     #读取文件内容
          
          for word in all_the_text.split():  #逐个提取all_text文章里的单词word
                if word not in result:       #如果word不在词频字典result, 即第一次出现
                    result[word] = 1  
                else:                        #否则前面出现过,则次数累加1
                    result[word] += 1   
    
          #循环遍历词频字典,输出单词出现次数
          for key,value in result.items(): 
               print key + ":%d" % value      
    

    如果你也在为英语考试备考中,例如高考英语、四六级、研究生、雅思等,通过掌握一门编程语言,试着解决上面提到的几个问题,或许你可以为自己创作一个《XXX核心词汇21天》。

    附:名人谈编程视频

    版权声明:本文为博主原创,欢迎转载分享,只需注明作者与出处http://thinkingroom.me

  • 相关阅读:
    C# 中使用反射的优缺点
    winfrom---Window 消息大全
    Entity Framework:三种开发模式实现数据访问
    asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
    [十二省联考2019] 异或粽子 解题报告 (可持久化Trie+堆)
    [jzoj 3175] 数树数 解题报告 (树链剖分)
    [jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)
    [jzoj 5662] 尺树寸泓 解题报告 (线段树+中序遍历)
    [jzoj 5664] [GDOI2018Day1模拟4.6] 凫趋雀跃 解题报告(容斥原理)
    范德蒙恒等式学习笔记
  • 原文地址:https://www.cnblogs.com/thinkroom/p/6694093.html
Copyright © 2011-2022 走看看