layout: post comments: true title: 从日本编程书籍《我的第一本编程书》中译版看中文例程如何扬长避短——标识符(一) description: date: 2019-11-18 13:00:00 -0700
日本作者平山尚在前言归结了本书的三点独特之处:
第一点,优势是一个项目主体贯穿全书,但同时很考验编排顺序,以及技术覆盖范围。个人很赞同”想要体会到一件事物的必要性,需要了解没有它时的窘境才行“和”我会在你感到走投无路时才介绍需要的工具“的教学思路。
第二点,作者”提供了专门的工具。无论是编程语言、开发环境,还是具体的用语和概念,我都为新手的你准备好了“。使用一个专用的编程语言环境的缺点不言而喻,但作者的这段话有当头棒喝之感:
说的好听些,你不需要查阅其他资料。说得不好听些,你想查也查不到。既学不到查阅资料的技术,也无法通过查阅资料学习他人优秀的解决方法。我已将这种学习方式完全排除在外了。 因为我认为这对你是很有必要的。
第三点,一是不依靠其他书籍,这与第二点有关,因为它不需依赖任何市面上的编程语言工具。二是尽量降低了入门门槛,包括:
等到真的需要英语时再学也不迟。很多人都有”先学好,已备不时之需“的心态,但我并不认同。在没有感到必要性时,我们是不会认真学习的。
相应的缺点就是,教学过程比较啰嗦,另外最终做出的程序规模较小。作者作了这个比喻:
人人都能爬上去的缓坡,其高度肯定不会很高。
下面,就看看这本作者自称”到 2 层需要走 100 米缓坡“一般的书,特别是其中的中文例程(辛苦译者,将原本的日语例程全部翻译为中文了(包括关键字、和标识符。为什么日文的例程就要翻译标识符,而其他英文书籍的例程就不翻译标识符呢?)。
作者在第一章,全书第十页就贴出了最后成品的完整代码,不到 180 行:
第一感觉是,满眼都是“存储区”。细一看,主程序(无限循环)中的”存储区“还是出现较少,业务逻辑相对较集中。大多数牵涉存储区的”底层操作“被封装在”堆积“”方块“”挪动“等等方法中。但由于项目本身是算法较密集的游戏(超级玛丽/僵尸大战之类的应该就会有更多的日常词汇),个人觉得母语命名的优势尚未充分体现。
第二,有些方法命名值得推敲。比如”将 6 个数字存入存储区“,鉴于方法本身代码的功能一目了然,更加简洁的命名比如”存六个数“就足矣。还有”事先保存好各个类型“,目测是初始化几种方块组合形状。那么”初始化形状“之类似乎更加可读。
第三,其中不少大数字常量,如 999999,990000,6000,50006 等等,如果有常量名称,应该会更可读。
第四,代码中不少重复代码似乎可以用循环代替,比如这段:
堆积(存储区[0], 存储区[1])
堆积(存储区[2], 存储区[3])
堆积(存储区[4], 存储区[5])
堆积(存储区[6], 存储区[7])
应该可以改成(如果语言支持):
序号 -> 0
只要 序号 < 4
堆积(存储区[序号 * 2], 存储区[序号 * 2 + 1])
”移动方块“方法中的两块代码应该也可以类似处理。
如作者前言所说,为教学自制基于母语的编程语言工具的一个优势,就是可以使得所有术语都用母语表达。也可以根据作者的喜好设计不同层次(比如存储区[65050] -> 999999
就能将视图中某个位置的点变为白色)。
同时,这个编程语言的特性直接影响了代码写作风格。在代码可读性方面,一个大风险就是写出的代码不如饱经实践检验的市面常用编程语言来的好读。
也许,在语法设计方面有明显贴近母语的优势的话,可以增色一些,但那样对语言设计和实现又是一个不小的挑战。
下面摘自书末的结语,虽然本系列还未结束(也许?),但提早了解作者的初衷也不错。因此借用在此:
在我们看来,读书写字稀松平常。但是在有的时代就不是这样... 我希望编程也能变得这样,掌握它们的人恒河沙数,没有任何特别之处...为什么现状不是这样呢? 常听人说”适合的人不教都能上手,不适合的人再教也没用”...难道没有什么解决办法吗? 我便开发了 Sunaba【本书中使用的编程工具,日语意义是”沙地“】,并将其带到了课堂上。然后我发现,“再教也没有用”这种话根本就是骗人的。....“程序是什么”“应该如何思考”这些本质上的内容不是教不会的。
后续: