1月22日杂谈

考试完毕,自己的历史,最近和即将要做的事什么的。一点都不多。不多不多。

随着最后一门——液压的考试结束铃声响起,三周的考试周终于结束了。本学期考试如下:机电控制工程基础、制造工程基础(2)、电机与拖动控制、模拟电路B、机械设计、数字电路B、流体力学与液压传动,外加3门选修课工业工程原理与应用、设计概论、数据库原理及应用。液压是在今天上午8点开考的(时间2小时),为了这早上一门,虽然昨晚复习到3点,但还是定了一个5点的闹钟。5点闹钟响起的时候,我记得这事,从床上坐起来,但是眼睛怎么都睁不开。于是接下来一个小时就处在这种让眼睛睁开和眼睛睁不开的恍惚中,直到晓鸣的6点的闹钟响起。反正他是下床开灯看了一会的,我还在床上翻滚着。到了大概6点14分,实在不行了,只见对面灯光灭了,我索性定了一个6点半的闹钟。当6点半的闹钟响起时,我好像掐了(不记得了)。下个时间点就是怂冲入我们宿舍直接开了日光灯,6点42分。怂大喊“大家都起来啦”,然后去拍每个人的床(黄晋国的床有床帘,在怂揭开拍晋国的时候我确信听到了一记拳头落在肚子上的声音,由内而外的)。在这声音和日光灯的作用下,大家立刻就醒了。嘛,我还是躺在床上过了几分钟,让眼睛和血压适应环境,再去刷牙洗脸去考场的。


今天在博客园上看到一则题为《不要轻易在简历上写我热爱编程,我热爱学习》的新闻。其中有一段是这样的:

95 年的时候,我高中同学郭军买了一本 Borland C++ 手册,我们两个人此后两年没机会碰真的电脑,没见过 Tubro C 更没见过 Borland C++,生看这本书,看了两年,百看不厌。做不到,别轻易说,我热爱编程,热爱学习。

这让我想起了我与代码的开始。初一的时候听说初二要开始学编程,就在初一的暑假往购书中心跑了一趟。当时我什么也不知道,只会玩小游戏,以及使用 Office(嗯,其实现在再看看五年级时给自然课和数学课做的演示文稿,流程的安排、交互和界面设计综合,已经超过不少人了吧)。在书店转了一圈,看看许多语言都是好复杂的样子。突然间见到一个图形化的东西——那就是 Visual Basic。(为什么不是 Delphi 呢……话说其实后来初中的时候老师还教过一点 Delphi/Lazarus,不过还是觉得操作上没那么直观,所以一直没学好。)

也忘了怎么样选的,当时买了两本书,一本是《Visual Basic 编程实例入门与提高》,另一本是《Visual Basic 系统开发实例精粹》

当时因为老妈怕我管不住自己(玩游戏嘛),从小学一直到高一之前一直都不许我自由使用计算机(使用必须申请)。初二初三这两年是管制最严格的,几乎就没有摸过机子,有使用的机会那也是工作用,在我印象中只有一两次来常识性地写代码。此时还是严格按照书上写的做的呢,创建窗体,拖放控件,设置各种属性,甚至字体也要同样设置。而后根据书上的例子,写了第一个程序——ASCII 字符对照表。在初二这一年,基本上就是这两本书陪着我。在几乎无法实践的情况下,我将这两本书摆在枕头下,睡觉前如果有精力就看一看,一遍又一遍地啃着里面的每一行字(因为刚刚接触,不了解),一边在脑中根据书上的代码注释和图片想象着运行的情况——就像是想象粘土造人一般,一边赞叹它的神奇。在这两本书里,给我思想上影响最大的是《入门与提高》,我仍然牢记前言中“一定要不断改进代码,即使你的版本号到了99.99”的这句话;《实例精粹》那相当于一个代码库,就是有什么需要,如果有一个例子,可以去分析解明,再改造以适用于实际环境这样的东西。

到了初三,分班考中我惨败,必须参加中考,同时也让“如果进一班就可以得到一台新电脑”这样的期望落空了。这一年,在我的印象中,虽然比较苦,而且要和新同学一起只度过一年(想象一下将生油突然倒入热锅,在断生之前又突然倒掉的感觉),但是还是挺欢乐的。在这一年,我去过几次购书中心,一般是为了买一些教辅。但是选完了教辅,我就跑到IT区,在 VB 分区看各种书,看到各种书上的代码和实例,尝试去理解去记住这种“模式”。这样常常在中午去购书中心,晚上六七点才回家,中间四五个小时都是在这些代码中。我也让老爸老妈买过几本 VB 的书(我对于想要的东西一般不会好意思开口,所以每次嗫嚅“爸/妈,能不能……也买这本”的时候,都有很大的心理压力),是几本很厚的、关于控件与常用代码段(实例)的(好像是人民邮电出版社吧)。看着看着就发现那些应用性的代码中有许多的共同点;追溯到小学二年级,我也发现英语的一些词汇写法和发音是有联系的,例如“(辅音)a(辅音)e”模式。然后就觉得,到这里是一个顶点了。(其实,要继续研究下去的话,Hardcore Visual Basic 是一个不错的选择,那真是将 VB 发挥到极致。)

所以看到那一段“两年都没机会碰真的电脑”的时候,我大笑:我不是也经历过嘛!所谓“传奇的两年闷声积累”,23333333

题外话1,关于 BASIC,Dijkstra 曾经说过:

It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.

这一句话如此之有名,甚至 Wikipedia 的页面上专门将其核心列了出来:“Dijkstra also strongly opposed the teaching of BASIC”。(引用自 Dijkstra 的演讲 How do we tell truths that might hurt?,原文见这里。)这句话也常常被用来鄙视那些学习 VB 的人。(拜托,从 BASIC 到 Visual Basic 6,是有许多进步的!)

但是,我想用我这个例子对已经西去的 Dijkstra 老说:您的“practically”用得真是恰到好处,您也相信着例外的存在吧!

题外话2,搜索的时候看到了一篇博文,由此转到了另一篇博文。看完之后顺便浏览了一下作者的其他博文,狂傲书生气很重,而且看文章那是肚子里有东西的人,虽口出狂言但如果听者也有积累就会觉得有嵇康之感。顺带说一句,我们大学开 C 语言课用的就是后面那篇文章中提到的书。在上这课之前我自学过 C,也看过、写过一些代码。看到课本的时候我还说为什么前面的那些章节都要将所有的定义(结构体、函数原型、常量)都要放在main()中——在其他地方几乎见不到这种写法,而且也违背了可见性的设计。惨啊,同学们基本上是没学过编程的,于是第一,他们的对编程的理解就被限制在了“C 语言”中(其实不止他们,现在很多大学生、硕博士甚至讲师教授都有这种错误的概念),第二,他们对 C 语言的理解和代码风格被这本书坑了。要谈入门,肯定是要看老美写的那些啦。

好,回到正题。

随着高一的计算机解禁,实践的机会变多了,于是就开始自己想东西自己写程序,逐渐接触了第三方/自定义控件、Declare 调用 Windows API 等等,也认识了 MSDN。后者更是我初次见到 C 语言的跳板——因为一些书上写明了同样的 Windows API 的 C 样式声明与 VB 样式声明,借助已有的 VB 知识和书上讲的一些东西我可以部分推断出 C 的皮毛。高中三年就是这个阶段。出了成果的东西,有 Teamwork(辩论赛计时器,高一下学期)、为了网资部宣传视频写的一个程序(为了实现我当时难以制作的黑客帝国特效,通过简单代码控制界面,然后用截屏软件录像,高二上学期)、自动化演示文稿控制程序(本来是用于美术课的,结果出了配置异常崩溃了,那场面混乱的;修改后用于一次语文课的课前演讲,高一下学期)、自动对成绩列表排序并按照学号对号入座(让老师1秒完成了其他老师要干一天还容易出错的活,高三上学期,用 Excel 的 VBA 宏)。没出成果的有一个按要求排座位的程序(当时我只会用循环,还不知道各种优化算法,想想看到某人展板上写做了一个“基于遗传算法的座位安排程序”的时候,我还真以为是输入遗传数据呢),因为太复杂而且在纸上模拟得到在特定条件下会死循环而且我无法通过程序识别这种状态的这个结果,我最后放弃了。其他一些过于超前(远远超出自己能力)的东西还有 PHP 智能编辑器、桌面小工具的动态代码执行、自己的浏览器、自己的富文本编辑器(自己处理、绘制哦)、学习成绩的记录评估展示(这个点子是村长出的)。后来还是用了一点,例如:2011年新年给博导(zalazan/△AX,William J. Huang,www)的贺卡中改动了一个用 GDI+ 实现 Aero 效果的程序,让它加载、展示我想要的东西;2013年,在为 mod 队伍写安装程序的时候也用了 VB,做出一个界面不错而且不用第三方控件的安装程序(但是打补丁太麻烦,所以 hth 最后还是用了 NSIS);2009年的广州市创新大赛和2010年的明天小小科学家,我写了一个开链烷烃的结构分析程序(灵感来源于 ChemOffice 的分子自动排列),结果给一位教授看的时候她问我学过数据结构没有,我说没有,她拿出一本数据结构的教材说你实现的不就是一棵树嘛,中间用到了一个自己写的栈(但是我毕竟不知道什么是树什么是栈啊,只是觉得要解决计算问题就要设计这样一个结构而已)。不过,VB 还是我目前的简单程序原型首选,因为启动快,而且不需要过于专注于类型转换。

由于在初二参加过 NOIP(不过我的数学嘛……结果怎一个惨字了得),所以大致知道几个词(不过算法完全不能理解,一直到大学才顿悟),以及大O函数。高二的时候还准备去冲一下 NOIP,晚自习的时候看着一本从图书馆借来的《离散数学》,整本书几乎就没能看得懂的。再想想反正不过是要考图论嘛,看看图论那一块。啊原来树有什么什么,图有什么什么,怎么转换(算法)。看着书上的数学描述就头大,看了图示之后也很难推广,想想好像是那么一回事吧——但是第二天又忘了。数据结构这一块,是到了大学才重新捡起来的。

同时,面对着这么多的代码,以及放弃的 PHP 编辑器,还有一些其他的外部因素,我想知道这些代码是怎么编译的。于是在高三前的暑假,我从图书馆借了一本书——也是在图书馆里浏览了各种书后选的,Compiler Construction: Principles and Practice。在看前几章的时候,我还能看懂,但是从后面的文法(grammars)开始,又头大了。那可是严格的数学推导啊!不过,至少我理解了编译的流程(词法扫描和语法识别),知道了抽象语法树(abstract syntax tree,AST),这对于我最近的东西还是有很大帮助的。同时赞一句,在中学图书馆里借到的是一本大约 A4 大小的、深棕色封面的、有与龙书同风格的设计的影印书,排版、字体的区分简直是太美丽了。(国内编排的那些书?呵呵。)几周前在大学图书馆里的旧书区借到了这本书,不过是大概 B5 的大小,自然厚了——嗯,就是缺了一点点美感。

后来在2012年尝试 Visual Basic .NET 的开发,做一个游戏启动器(即 Z-Abby/Zinc,后来的 Astraea’s Caroline)。链接以后再补充,大多都放在了百度贴吧上。总之,我一般是有需求了,或者呆不住了,才会跳到另一门语言,不过这些跳转更是增长了我的见识,让我(在有计算机运行原理的基础上)构想了一下各个语言语法特性是如何实现的。从 VB .NET 开始,就进入了 CLR 的家族。当初看到一群人在争 VB .NET 和 C# 的优缺点,我一直是坚挺 VB .NET,认为“C# 就是 C++++”(黄秉刚老师语)、“C# 就是微软抄袭来的 Java”。C# 的属性(虽然是语法糖)和事件的支持还是挺好用的。其实现在用多了,在平常的书写上,大多数时候 C# 感觉更方便一些(例如用_varName表示类级变量、varName表示参数、VarName表示属性,但是 VB .NET 由于不区分大小写就难以只使用大小写就能区分这三者),一些东西是 VB .NET 做起来麻烦的(C# 的default关键字、volatile关键字、固定指针、直接用this Type varName来写扩展方法),当然也有一些是 C# 做不到的(VB .NET 的Handles关键字,带多参数属性)。各有千秋嘛。嗯,扯远了。

其他一些语言略有接触,不过经验和技术还是差了好多。

  • C&C++。原来写起来很困难,练多了就好了。后来准备用 SDL 来构建 EarlySpring,那就是大块的 C++ 代码,同时处理好 SDL 的 C 风格函数。
  • C++/CLI。作为 C# 的辅助用过一点,在 EarlySpring 中。灵活性不错,作为粘合剂用起来很舒服。而且,比 Managed C++ 写起来轻松多了。
  • Pascal&Object Pascal。分别在 NOIP 的准备,和初中的课堂开发中用过。NOIP 的时候还不了解程序构造,大概也只会program XXX ... begin ... end.这样一个结构,中间填什么都不怎么清楚,是longint呢还是real呢,都是什么意思……这些给我造成了严重的心理阴影。OP 一般用 Delphi 来写,主要是觉得太自由了(大小写不敏感,而且也不会像 VB 那样自动纠正到声明时的样子,看起来难受),没怎么用过。
  • PHP。高一的时候本来是想用 WAMP+PHP+PhpMyAdmin 建站的,后来放弃了。PHP 写起来也很难受,因为是无类型的,而且用得不多,自然就不熟悉语言本身和函数、库。
  • Lua。2010年在研究 Garry’s Mod 的脚本时读到过,大致清楚其语法规则,不过没自己写过。
  • Python。2014年4月不是想写一个 GalGame 引擎嘛,搜索了一下,主流的开源引擎是 KiriKiri 2、ONScripter 和 Ren’Py。后来玩到一个糟糕的游戏(就是エロゲーム啦)Sugar’s Delight(好囧,由于 PyGame 是跨平台的,所以这货也是),发现它就是用 Ren’Py 制作的。于是去研究了 Ren’Py 及作为其基础的 PyGame,自然也就看了一些 Python 的东西。Python 的跨平台、脚本和一些便捷的语言特性用来写游戏……这个应用真有趣。
  • Ruby。看了松本行弘的一本书之后,对书中不时写出的 Ruby 代码略感兴趣——和 Lua、LISP、JavaScript 类似,Ruby 也可以玩元编程;与 Haskell、F# 类似,Ruby 可以玩函数式编程——这难道不有趣么?
  • ActionScript。当初做 Flash 动画的时候用过一点,不过不知道那是 ActionScript 罢了。直到开发弹幕君的时候翻 BiliBili 的弹幕文档,看到里面一直用的是“ECMAScript”而非“JavaScript”,就去搜索了一下,发现 ActionScript 还是实现了 ECMAScript 3 的呢。
  • JavaScript。由于上一个玩意儿(花园与 Bangumi 的结合)的需要,要在浏览器中实现各种操作。最简单强大的方法就是脚本,于是我就接触了 JavaScript。从一个 BangumiCore 开始,我踏上了学习 JavaScript 的旅途,并在5天内完成了从解构、封装为跨域到加上界面的原型的过程。中间通过百度云网盘助手的SimplePanel类见识到了 JavaScript 的原型编程。嘛,算是语言入门了吧。(借用花园上一位前辈的话:你这都开始研究操纵浏览器的通信过程了还叫入门?!我:我刚刚学,不过是为了要解决一个碰到的问题,就轰开一条路过去了,当然是入门。)

说了这么多,我还是不敢说自己够努力,爱学习啊。近处有程序美工日语通杀的lansure,远处有早在初中就学习量子力学、现在在 MIT 实验室设计 CPU 的zalazan(嗯,两年来他在班级群里没说过话,我也没去 Facebook,直接交流也少很多了,估计再交谈的时候除了技术差距,还有社交差异了吧)。我就一渣渣,怎么敢说爱学习!


想想看,1月6日花园关闭,1月8日确立分布式 tracker 服务器这个目标,到持续到1月14日的讨论,到1月22日 KeiSystem 的原型初步完成(之前,1月8日开始写,历时4天的 GardenTracker 被严重打击了……)等待双机测试和多机测试,配有通信规范(第一次写……),我真是在一边玩命复习考试一边玩命写代码啊。二者神同步,当然,代价也很大。舍友评价我在过“大西洋时间”。

为什么是 KeiSystem?一个原因是考期看的《银河机攻队》(<銀河機攻隊マジェスティックプリンス>)(画外音:你疯了?明明是考期!),挺喜欢ケイ(虽然日笠陽子配的角色通常十分没节操,不过这里还是很正常的)。另外,直接发音不就是K么。那谁谁。顺便,此片附带制作访谈,这是我第一次看制作访谈,见到真的那些制作人员及其分工(索尔应该看多了吧)。


在昨天(1月22日)的凌晨恍惚间,我好像看见了消失的“BT”字样又回来了,可是刷新一看,什么都没有。一片空白。不过是一场梦。

快回来吧。


寒假要干什么?

  • 和数字大神的合作,VR 的东西……
  • 美赛……
  • 学日语……看动漫总是要字幕还是不爽的。虽然现在能解构一部分,但是对于正常对话而言还是太少了。而且总是被各路大神压着打,更不爽……
  • 尽量继续写众人小传,能写多少写多少吧。三年了,可能很多东西都忘记了,得在继续忘记前将它们留下。
  • 有时间的话要继续 EarlySpring 的开发。现在先专注脚本这一块,所以那个 repo 肯定不是最新的。写 JavaScript 的时候触及了其原型链,通过这个应该可以解决一些我之前没法解决的东西。
  • 通过 IronJS 项目,结合 CLR,学习 F#。

手机上还简略记录了一下去年的技术历程,从4月开始(更早的记忆好像没了)。有时间再贴上来吧。

分享到 评论