当前位置:首页|资讯

【杂谈日记】学习循序渐进,不等于教材可以摆烂

作者:楪筱祈ぺ发布时间:2024-09-03


刷视频的时候看到了这个吐槽高中信息学教材内容质量低的视频,评论区那叫一个群魔乱舞……

虽然因为我更新少,粉丝一直在掉,但如果还是有在高中需要学习编程相关,或者在大学需要些代码的朋友,我希望还是能够给大家一点正面的引导的。

首先给原视频定个性吧,原视频不但没骂错,我觉得还骂得轻了。

评论区说教材没问题的,有一个算一个全在瞎说。

我来说一下原视频中,教材犯的错误相当于什么性质吧。

1、不进行格式化,不加空格:

不进行格式化,相当于你打一篇几百字的文章,完全不分段,全部堆在一坨。

不加空格,相当于你说一句话,不加标点符号。

这个事情的严重程度取决于语言而定,如果语言本身是带有严格的格式分隔符的,比如java或者c之类,要求语句结束带分号,代码块用大括号包围的,这类顶多就是可读性差得爆炸,尤其是java这种调用链可以长达几十个方法的。

如果语言本身依赖格式化来进行语句和程序结构体划分的,比如Python,有可能就会代码本身出错,相当于你写两个英语单词中间忘记加空格,计算机就不认了。而且这种排错是非常困难的,因为你所有地方都写成了一坨,找错误的时候还得将这一坨给拆开才能查找问题。

具体的严重程度就,你找个小说粘贴下来把标点符号和分段全删了,你再去读,差不多就这种感觉。

举个例子,我贴个没有没有格式化的代码,对比有格式化的,可以对比一下辨识难易度,上下两个部分的代码是一样的,只有格式化与否的区别,可读性之间天差地别:


2、命名不规范:

命名规范这个事情其实是方便自己,因为现代编辑器会根据命名规范来帮助你检查你是否有错误。具体什么位置用什么规范是个人的自由,只要统一就可以,但如果你用的东西不符合任何规范,那么编辑器就会抓瞎,相当于浪费了纠错功能。

有人说你可以自己写一套检查机制,但初学者是绝对没有这个能力的。

而用一套公认的命名规范,对于个人来说其实并不需要增加什么学习成本,但是在遇到稍微大一些,需要协作的内容时,就能够提供不少的便利性。

简单点来说就是,你命名规范了,变量都说清楚了,你就可以偷懒了,简单的功能就不用写注释了,事实上更省事了。


3、为什么不建议对于非专有名词使用拼音命名?

拼音命名的问题主要有两个:一个是可读性差,一个是同样会令字典纠错功能失效。

先来说字典纠错功能的问题,现代编辑器基本都有基于字典的纠错功能,这个功能对于英语比较好使,对于中文不太好使但能用,但是面对拼音就基本完全不起作用。

为什么呢?因为编辑器读到的是英文字母,他就会理解为英文单词,适用英文的字典,拼音,它是读音标记,而不是一种直接被使用的语言,性质类似于英语音标和中文注音符号,自然也不会被当做单词处理。

你说你手动加字典行不行?行,但是很坑。

这里有几个问题,编辑器对英文字母的断词依靠格式,驼峰或者蛇形,而你拆分拼音的方式无论是按词拆分还是按字拆分都事实上没用,按词拆分你需要给字典加一个非常恐怖的量,如果没有人整理的话意味着你要手动导入,而且你在实际打的时候逻辑也和实际用输入法有很大的区别。而按字拆分更是相当于将纠错功能扔掉了,比如柿子和私自,按字拆分的话两个拼音都不会报错。

说到底,拼音和具体的字义不是一一对应的,但是单词和词义是一一对应的,这种情况下纠错功能才能生效。

而且很多人吧,会说话就不代表拼音能读准了,进一步增加其他人的理解难度,以及给编辑器上强度,比如有一个判断是否为面包的数值,中文“是面包”,用拼音有可能就拼成“SiMianBao”了,因为你给每个单字都添加了字典,“Si”不属于没有字可以对照的字音,所以不会报错,这种情况很难避免,因为单字的拼音太短了。而“isBread”拼成“isBraed”,下一秒就给你标出来拼写错误了。

这是独属于拼音的问题,不是中文汉字的问题。

因此还不如使用支持中文的现代编程语言和编辑器,直接用中文命名,至少中文的汉字字形和这个字是一一对应的,你写面包不会被理解成米饭。

除了纠错功能之外,拼音的辨别可读性也极差。

当你用拼音命名的时候,其从文本转换成具体含义的流程是:

①看到拼音文本的视觉信息

②根据拼音内容读出对应拼音的音频信息

③根据音频查找匹配上下文的具体中文文本

④找到匹配中文文本的字义

第二步的读音频,正常情况下的速度等于默读的速度,第三步还多了一个匹配上下位的索引,因为同音词实际上是非常多的。

当你看中文的时候,实际上的理解流程是:

①看到中文文本的视觉信息

②找到匹配中文文本的字义

这个过程因为日常熟能生巧,延迟基本是没有的。

而用英文命名的话,大多数人实际理解的处理流程是:

①看到英文文本的视觉信息

②根据英文文本翻译为中文文本

③根据中文文本获取匹配的字义

具体阅读速度取决于英文文本的翻译速度,英语水平只要不是太差的,都不会比默读拼音的速度慢,实际阅读速度是远快于读拼音的。

好,如果你说,我就是英语非常差,怎么办?

那么英文标记+中文注释的可读性也比用拼音强,此时的阅读流程是:

①临时构建英文单词的图像与中文注释字义的关联性

②获取英文文本的图像信息,转换为中文注释

③将中文注释绑定到对应的字义

其中第一步只需要在阅读当前代码块的时候进行一次,后面就是图像对含义的映射了。而当你读多几次的时候,哪怕你还是不会拼这个单词,看到的时候都能认出来了,第一步就直接跳过了。

各种记忆法为什么都强调图像记忆?因为人脑处理图像的能力是本能,跳过图像对文本的编解码过程本身就是可以减少时间的。中文的阅读效率比英文高很大程度上就是因为中文是固定的图像编码而非字符串编码,人脑的逻辑和计算机有很大的区别。

用拼音命名是无法做到直接将拼音和具体字义挂钩的,因为拼音对于阅读者而言是一种已知的编码,人脑会自动进行解读流程,正常来说这个被动的解读流程是很难被主观打断的,也就是哪怕你想直接构建拼音命名对具体字义的直接映射,实际也很难做到,因为这是反直觉的。

有一个很类似的例子就是外放的弱智短视频比工地噪音更容易令人心烦,就是因为弱智短视频的音频传到你耳朵里你人脑就开始自动进行信息解读了,这个被动过程除非你有极强的专注力,否则是无法主动打断的,而噪音是无意义的信息,人脑反而很容易就过滤掉了。

综合上面的几点来说,哪怕你英语真的很差,没办法用英文单词来给变量命名,用拼音也绝对不是一个好的选择,从个人可读性的角度来说,在确保有注释的情况下,用数据类型缩写+序号来命名都比用拼音强,从多人协作的角度来看,用百度或者其他翻译软件翻译一下,然后写个注释,等你多看几次注释,说不定你单词就会认了。

不用拼音最大的根本原因在于读拼音这个流程实在太慢了,而且看了不读反而是违背本能的。

用拼音,或许少写两行注释,少背两个单词,牺牲的是日后重复阅读的效率,这笔买卖其实是非常亏的,而降低重复阅读的效率,其实就是习惯说的“屎山代码”的其中一点,降低重复阅读的效率。


4、教材做好格式化会增加初学者的准入门槛。

这个是我在视频评论区看到最离谱的发言。

教材不做好格式化就相当于语文课本的课文不分段不换行,数学课本的图例完全不符合实际内容,英语课本里给你塞一大堆口语化谜语人缩写。

这部分发言似乎将对教材编写者的要求和对学习者的要求给搞混淆了,认为学习者要求不需要那么高,所以教材给人的临摹对象就可以乱来一样。

计算机编程初学中非常重要的一环就是临摹,也就是将课本上的代码敲到电脑上,看能不能跑,给个排版乱七八糟的代码块,就相当于在小学生临摹字帖的时候,给一本歪七斜八写得一塌糊涂的字体让小学生模仿。

不是,哥们儿,你不要求写得完美,不代表你让人模仿的对象可以瞎搞啊?

对于这种强制性普及性的教育,无非最终有两个结果:

学生不感兴趣,对于这部分学生来说,格式化的代码,哪怕你用的TXT去写,学完整本教材也不过多敲了几十次Tab,百来次空格,作为应付式的学习来说,也多不了什么麻烦。

学生如果感兴趣,那么将来他更进一步学习接触到现代编辑器的时候,他就能直接无缝享受到现代编辑器自动格式化带来的便利,而不会因为不知道换行,不知道加空格这类问题在日后阅读代码和代码纠错中无谓地折磨自己。

5、国内的大公司开发真的会用拼音命名吗?

可以这么说,大公司哪怕用n1、s2之类的方式去命名,大概率也很少会用拼音命名。

因为拼音的最大问题是无法自动适应现代编辑器的自动纠错功能,而且大多数人根本没有这种英文阅读障碍,也就不会浪费时间去专门写一套匹配的纠错,而且完善的注释根本不需要主动去学习单词词义,多看几遍自然就记住了,哪怕忘了下次见到注释也能想起来。

真正经常用拼音命名的,往往是低代码,但又不支持中文的流程,而不是代码开发本身。

所谓低代码又不支持中文的流程,一个典型例子就是图片素材,制作图片素材的美工不需要接触英文环境,某些时候说不定日语比英语说得还好也不是不可能。

但是文件路径这玩意,用中文不一定支持,就算支持,在计算机路径辨识里也很多时候需要使用转义符来变成一个串,一个中文汉字,在网页链接里转义出来的是6个字符甚至更长,这就导致很容易路径长度爆炸。

简单点来举个例子,假如我有一个素材需要命名为“蛋糕”,使用中文、拼音、英文分别的长度为:

中文:18字符“%E8%9B%8B%E7%B3%95”

英文:4字符“cake”

拼音:6字符“dangao”

在这种场合下,才会折中去选择拼音。

而且这个拼音大概率在实际代码中也可能不会出现,因为素材需要注册,注册之后的关键词可以直接写成“cake”,这个“cake”对应“dangao.png”这个文件名就可以了。

也就是说真正可能会频繁出现拼音的地方,在代码编写中很可能只会用一次,只要这一步没错,以后也不会出错,就算出错,也只需要排查一次就够了。

另一个常见的弱英语编程场合是游戏制作,一些小游戏公司的策划岗需要同时负责一部分代码的编写,这些策划的英语水平可能确实不好。

但现代的游戏引擎基本都支持中文啊,有不少还支持可视化编程,这什么意思呢,就是很多需要写代码的地方都帮你封装好了,你给参数命个名,然后填个数值就行了,根本不需要涉及到英文编程的部分。

实际上的实现就在于现代编程语言支持面向对象特性,把很多复杂的东西都给你封装了。

比如说你设置一个名为“金钱”的整数数值参数,实际上引擎可能是调用了一个如下图所示的类的封装好的实例来实现你的需求。这部分是引擎本身就内置好的,不用用户自己写。

具体到创建过程的部分代码其实可能就是,你在屏幕上点了一个增加属性按钮,然后输入了名字和数值确认,然后引擎自动帮你创建了一个属性。

具体的代码本身不存在中文,至于字符串的解读问题,那就是交给系统环境来解决了,跟代码的稳定性什么都没关系了,用户是不需要具体编写代码的,用于记录名字的字符串是封装好的内容的一个属性而已,而不是内容的标记,自然就不会存在任何问题。

以上代码仅作为举例,不代表实际生产中是这样写的,更大的可能是用表直接对应一对字符串名字和数值,但那样写起来还需要解释什么是表,所以用了更简单的代码,尽量能让更多人理解吧。


6、拼音命名的不必要性与教材的脱离实际。

计算机编程,哪怕是Python这种号称简单易懂的解释型语言,实际上对于完全没接触过的人来说,理解起来也是困难的。

正规的学编程,肯定是从数据类型开始学起,哪怕简单如Python亦是如此,自动类型不代表不需要类型,而这一步其实就已经劝退90%的人了。

可能这个数字有些夸张,但本质上想要理解数据类型就得先搞明白数据类型和二进制的关系,哪怕不去研究计算机为什么用二进制,前半部分也需要比较多的时间去理解,而这在两三百页的计算机基础课本里只不过是一两页而已。

也就是说,作为一门不计入应试的副科,根本上就是无法做到教会每一个人的,本质上更多的人只能是模仿加死记硬背,考试能及格就算了。

真正的入门编程其实可以抛开这些内容不讲,但那些就不是正经的编程语言,而是专门为培养兴趣而设计的,比如面向小学信息学竞赛的PC Logo,对于编程的普及教育,能够让人理解条件判断、循环、递归这些其实就已经够了,而这是不需要复杂的参数命名的,用ijkm、s1s2之类的简易命名完全就已经够用了,甚至你用dg来表示递归方法,也比digui要强,除非是拼音缩写入脑的部分人,否则拼音缩写在未指定含义的时候大脑大多是当图像处理的,注释加上就没问题了,不用默读,就比需要默读效率更高。

但是编教材的人多半是拍脑子想说要教正经编程,但实际上课时又不允许教那么多内容,实际上左删一点右删一点,删出来的问题就是四不像,大多数人学完也等于没学,少部分能学进去的也学了一坨坏习惯,为日后的进一步学习埋雷。

如果真想普及,那就别好高骛远直接上Python,如果只是为了有这么一门课,那也别把以后真想往这方面发展的学生给坑了。


Copyright © 2025 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1