由 Anawaert Blog 于 2024-05-29 发布   

“Viktor Adam"与"Anawaert"的发展历程

初窥门径:接触计算机“编程”

  2017年8月的一天,我一如既往地带上我的笔记本电脑,出发前往朋友家中,准备打开Minecraft,酣畅淋漓地与朋友进行一场服务器空岛生存游戏。但我到达朋友家时,发现他正在与另一位同学游玩GTA V,心身完全投入在其中,甚至没发现我已经到了他家。我问他,何时可以开始我们的空岛生存,他说再等一下,很快就做完任务了。在不断地询问且不断地得到一致的回复后,我逐渐放弃,便打开了我的电脑,开始胡乱“玩”起来。彼时,我的心中产生了一个想法:如果我可以成为一名“黑客”,黑入他的电脑,关闭他的GTA V,这样就可以让他乖乖和我玩空岛生存……抱着这个想法,我从那天起,开始“研究”如何变成“黑客”。

  打开哔哩哔哩,搜索“黑客”的相关的视频中,第一条就是通过一些CMD命令来实现一些“黑客操作”。从此,我开始学习Windows命令提示符与Windows批处理文件,并制作了一些小程序——当时的我称之为病毒——但它们还真的算得上是病毒:可以修改注册表,把自己加入开机自启;可以删除"C:\Windows\System32"下的一些DLL文件,使得系统无法正常启动;可以无限弹窗,或者是执行经典的”%0 | %0"命令……总之,这是我第一次领略到“编程”是多么的有趣,似乎可以把一切掌握在我的手中。

  当时的我看着"Windows"、“Office"等软件,它们的全名里前面都有一个"Microsoft”,于是心生一念,我也要拥有自己的“Corporation”。并且,以后我写的所有的软件都隶属于这个组织,并把它变成一个代号。好巧不巧,在某一节英语课上,我们的单词表出现了一个词:“unaware”,意为“无意识的,未留意的”。我又想到,我的“病毒”应该就像一位潜行者,让目标用户在无意识的情况下就潜伏到Ta的电脑上,并大展身手。因此,我将"unaware"改为"Anaware"。在我当时的英语水平下,把这个词解释为"An software (you will be) unaware (of its existence)"。后来,我又把"Anaware"改为了"Anawaert",并附上中文名“安维特”。至于为什么后来又改成这个样,我记不清,也无从考证了。但我依稀记得似乎是为了去重,似乎是因为当时我在网上搜到了其他的"Anaware"。不得不说,当时的我对各种英语单词的拼读想法有些天马行空,把"Anawaert"注音为 /‘ænəwiːə(r)t/ ,而非 /‘ænəwɑːrt/ ——此处ae的发音取自了单词encyclopaedia,相当于取了英式拼读。

  后续,我便以"Anawaert Workstation"作为组织名,使用通过Bat To Exe Converter包装成.exe格式的CMD命令语句,编写了一些软件(“病毒”):如可以直接把中招电脑用户文件夹删除并锁机+删注册表删启动文件的Anawaert VF(现在想想觉得自己那个时候又好笑又幼稚,还好只是拿它来祸害过虚拟机);又如可以杀查别人的.bat/.cmd文件,检查其中是否有危险命令的Anawaert BAT Scanner(这算不算“师夷长技以制夷”?)……如此,使用CMD命令作为“编程语言”来编写程序的情况一直持续到2018年6月。

拨云见日:接触到正统桌面编程

  在偶然的一次百度搜索中,我发现了Visual Basic这个玩意。根据描述,它可以制作出一个Windows程序,并且不像CMD命令行程序一样,只有单单的文字——从按钮、文本框到图片框应有尽有。我立马就把Visual Basic 6.0从MSDN,我告诉你(旧址)上下载了下来,并立马制作出来了一个“计数器”的程序——只有个界面。这一下子就激发了我的兴趣:我也可以做出我天天下载、使用的那些有好看的界面,有各种像按钮、输入框等部件的程序了。于是,从那时起,大约2018年7月,我开始研究Visual Basic,期间也写了一些小程序,像问卷调查小程序,给我同学过生日时候写的“生日快乐”小程序等。

  但是,我又在偶然的一次百度搜索中,发现了Visual Basic.NET这个玩意——同样是Microsoft出品,“几乎”相同的语法,更美观的界面(这是重点),更好用的开发软件(我当时甚至不知道IDE的意思)……于是,凭借着在Visual Basic 6.0中积累的经验,我开始使用Visual Studio 2012中使用Visual Basic.NET进行程序编写,一度写过一些看起来好看的程序:如为语文老师写的点名程序(你敢信,全班60个人,我用了至少60条If语句把随机数转换为人名,现在想想真的好笑);又如为了代替希沃白板的定时器而写的Anawaert Time Counter计时器程序等(当时甚至不会对数取模,导致我同样用了无数个TextChange事件+If语句判断来实现时、分、秒的进位与退位,甚至在计算时压根没考虑类型转换……)。

  不知细心的你是否发现,这时候的我似乎并不热衷于做“病毒”这样的程序了。是的,或许被老师一次次夸赞而产生的虚荣心,抑或是真的无所谓当初为什么要开始接触编程了,总之,在做出计时器后,我便决定不再制作这些危险的程序,弃暗投明了。

  用哔哩哔哩知名.NET软件开发领域UP主十月的寒流,在他生活博客文章“发现更好的东西,本就不是一件容易的事情”中的话来说,我当时就是属于那样一种状态——“以为自己什么都懂,什么都会,但实际上没有什么解决问题的能力,眼光非常短浅,无知却又不自知”——到现在我都觉得自己当下也是如此,只不过自我感觉良好罢了。当时的我甚至觉得,自己学会了桌面编程,能写出让老师能竖大拇指的程序,说明我已经懂得了编程。甚至我产生了“我要将我的电脑上常用的程序替换成我自己编写的”,这样的抽象而夸张的想法。就这样,自我感觉良好着,加上中考得意,我便一直带着这样的想法与思维,来到了高中。此时,已经是2019年中。

  我也不清楚当年那个暑假,我是怎么想的,或许是想到了某些番剧的内容,我把"Anawaert Workstation"改为了"Skysail Studio",即“天帆工作室”,完全地、自娱自乐地折腾,仿佛真的有了一家工作室一般。

  真正第一位在编程方面让我心服口服的人,是Wynix(Wynix-wang的Github)——全省青少年科技创新大赛一等奖、全国青少年科技创新大赛二等奖得主。在“学术交流”时,面对他的询问,我表示对结构体、数组、指针、函数、回调等一窍不通,不明白什么是实例化,甚至不明白什么叫类型转换。随着我与他的交流愈多、愈深,我便渐渐意识到,自己似乎真的只学到了一些皮毛,就像《爱情公寓》里胡一菲造“菲克力”一样,把别人的成品融了,自己再塑形一遍罢了。一时间,我陷入了迷茫,不知道该从何开始。Wynix是做嵌入式的,主要语言是C语言,自然对C系列语言是极力推荐的;而我既想继续保持学习桌面图形化界面软件的编程,又想学习主流、正统编程范儿,至少脱离Visual Basic(.NET)这样语法“别具一格”,语言应用领域单一的编程语言。于是,在信息老师的建议,加上来自Microsoft的种种鼓励暗示下,在众多编程语言中,我选择了C#,作为自己未来很长一段时间的主要学习与应用的语言。事实证明,这个选择是非常正确的。

  单从语言层面来说,C#是一门非常优秀的语言。它融合了世界上大多数语言的优良特性,简单例子如完全的面向对象(不能像C/C++那样写一个既不是static,也不是struct/class中的函数)、安全的泛型(where约束、泛型类型安全等)与可空类型(如string?类型,““和null天差地别)等。它既能像C/C++那样全程用数组、结构体、unsafe关键字与指针写出高性能程序;也可以像Java一般依托完全面向对象特性与高并发性能,构建大型桌面客户端,抑或是互联网程序;还可以像F#一样构建函数式编程程序;甚至还可以像Python一样热重载、实时编译执行源代码,把Roslyn当成解释器……总而言之,从2020年9月起,我正式开始学习C# 7.0,也第一次学习到了Wynix说到的那些数据类型、语言特性等。

  但繁忙的高中生活,哪来那么多时间让我们这些全日制住宿生在学校,好好地学习除主科以外的这些“杂七杂八”的东西呢?彼时的我,可以说得上是不务正业:上似乎不需要听讲的语文课的时候在看《C# 7入门经典》,上自认为易如反掌的化学课的时候在看《C# 7入门经典》,晚自习作业抄得差不多以后看一会《C# 7入门经典》,甚至晚修结束,回到宿舍了也带着一本《C# 7入门经典》……以至于连班上的某位女同学都评论道:“()你真的是什么都学啊~”。这句话令我记忆尤新,但也很好地反映了我当时在学校的状态和形象。

  成绩爆炸后,我便决定不在在校时间学习C#,只在周末与假期的家中学习。非常巧的是,我发现了另一位也在接触编程的同好寂空(寂空的GitHub),他对数学、计算科学等与数打交道的领域都非常有兴趣。寂空当时在学习C语言与部分线性代数的知识,而我们俩便一拍即合,用C与C#各实现了一个解方程小程序,将内容合并,便得到最终的一个完整的程序,名为Anawaert STE (Solve The Equality)。这是我们第一次写出长达1000行代码的命令行程序,而它也包含了当时对于我们这些理科生常用的一些功能,如多元一次方程组的求解、根式的化简、带化简的一元二次/三次方程求根等。我们还将这个程序贴到了班级电脑桌面上,最后还加上了随机数、点名等“隐藏功能”。

  这一次,我再将"Skysail"改回了"Anawaert”,全名"Anawaert Studio”。同时,也将其中文名“安维特”正式改为“安维”,并一直沿用至今。

  当然,想写好一款数学领域的软件,除了在数学领域要有丰富的知识储备,在编程领域还要有扎实的基础。显然,我们就是来搞笑的,连Parser都不会写的我们,何谈运用复杂的数据结构与算法来和编写软件呢?学业为重,我也深知不自量力,于是在2021年10月起,我几乎暂停了一切与学习编程相关的活动,基本上全身心地投入到文化科的学习中,只保留偶尔与寂空、Wynix等同学闲谈,或是在可以休息的时段去图书馆泛泛速览一下相关技术书籍的活动。由于某些特殊的事情,在2022年3月底后,我更是完全与C#隔绝,每天的生活就是上课、刷题和与陪伴。

  众所周知,2022年新高考I卷的数学是顶级中的顶级。我也不例外,被打入到了“非天才”的那个分数段中,这直接导致了我的高考,不止,几乎我认识的大部分人的高考,都比预期低了30-50分。我也去了一个非常普通的学校,学习机械自动化。而她去了很好的学校,学的药学。

  经历了一些事情,也思考了一番后,时隔1年,我便再次捡起差不多淡忘了的C#与C语言,开始新一段的编程学习生活。而这一次,感觉像是步入了正轨,但愿多年后回看,我会觉得是正确的。

步入正轨:开始系统学习基本原理与必要技能

  在开学初,我加入学院的某个科技社团时,面试任务是要做出一个“通讯录”小程序,语言不限,形式不限。由于大部分人初学语言是C语言,可能对通讯录的理解便自然包含以下要素:结构体、链表(malloc)、指针、文件等。但我由于最熟悉的还是C#,我第一想到的方案是:WinForms,ListBox,TextBox,类与CSV文件。也许是这样特行其道的方案,加上疫情的缘故,我亲爱的软件部部长居然在远远超出提交期限后,仍然愿意把我拉进社团。我也非常荣幸,加入了该社团,并且成为社团唯一一位.NET coder。

  在后面很长一段时间内,我发现我身边的人,他们对C#几乎都听说过,但是完全不了解或是了解程度很浅。人人都是C/C++ coder,人人都是嵌入式编程高手,但是对桌面等“软”的编程却似乎没什么兴趣。我一开始以为,只是他们不感兴趣罢了,而不是因为像没用这样的原因。然而,随着深入的了解,发现不单止我们的技术社团内部,乃至整个学院的大部分人,都是学习像单片机、PLC这样“硬”的编程。也不奇怪,毕竟整个学院的专业都是做工程的,又不是学计算机或者软件工程的。虽然,在这段时间内,我依然保持对C#的学习,逐渐学习并掌握了C#中的一些高级特性,如泛型、异步、委托、反射、特性、接口等。但我开始怀疑,也不断询问自己,学习C#的意义在哪,它对我的专业有什么帮助吗,或是它对我未来的就业/深造有什么帮助吗——我是机械自动化专业的,而且主学机械设计——专业课程与编程都几乎没有半点关系,何况是C#这样偏比较高级、上层的语言呢?这个问题困扰到了我大概2023年7月初,也就是我开始接触计算机视觉的时候。虽然但是,这大半年期间还是写了一些自认为有用的软件吧:有可以屏蔽Windows更新的Anawaert Windows Update Blocker;有可以将他人U盘中特殊资料爬出来的Anawaert USBHDDSpy;有可以在屏幕上绘画的,像中学一体机上希沃白板一样的Anawaert Screen Painter……上述这些软件,由于一次重装系统,导致仓库不慎丢失,只有一开始就使用GitHub托管的USBHDDSpy留了下来。他们都有一个共同点,那就是:都是使用Windows Forms构建的Windows WIN32 GUI程序。

  虽然我早已耳闻WPF是比Windows Forms更“灵活”的开发框架,但是在我在图书馆,照着《WPF编程宝典(第4版)》,体验到数据绑定的强大和动画的流畅后,我彻底对WPF着迷上了——尽管初学的大半年时间内还是照着老Windows Forms使用MVC开发范式(直到今年初才借助Community ToolKit将开发范式向MVVM模式上迁移)。在学习WPF的过程中,我逐渐意识到,编程语言真的只是一个工具罢了,作为开发者,要学的东西远超出编程语言的范畴:框架的特性、环境配置、工具的使用、设计的合理性……真的是太多太多了。好比一个外交官,Ta要会的就不只是(至少—)一门流利的外语了,还有政治、文化这些与外交行为紧密相关的知识。

  但好巧不巧,当我在假期,准备使用WPF与Xamarin.Forms构建自己的ChatGPT应用的时候,我却应邀加入了一个项目组。可以说,这个决定几乎改变了我人生近两年的走向。

  为了防止泄密与不必要的麻烦,这里就不细说这个项目组的研究课题与具体情况了。我被分派到项目组中负责“计算机视觉与深度学习”这一部分——一个我从未接触过,但是十分感兴趣的领域。平地起高楼显然是不可能的,为了不耽误项目推进,我便在假期改学ROS框架与C++(C++17),暂停了与.NET相关的项目开发与技术学习,这样的学习历程一直到了2023年10月。

  国庆节前夕,由于ROS与C++学习速度可观,加上项目组招新还算顺利,所以暂时一下没有什么任务。彼时,我正好想用下WPF做点什么,恰好发现我的虚拟机里跑的Windows需要激活,于是就有了做一个KMS激活器的想法,正好当练手了。实不相瞒,当时什么数据绑定、动画、故事板早都忘差不多了,而且我跳了学习样式和命令/触发器的那几节,写出来的WPF程序质量自然也不必多说:没有使用MVVM范式,没有使用Trigger和Command来绑定用户操作与关联事件,没有用好样式系统,把动画写在了代码里……但现在重构一遍工作量也不小,故即使知道了问题,也不太想重构代码了。于是,这个项目就以提升泛用功能为主吧,下一个项目一定(怕不是永远的下一个项目哈哈)。

  直到今年1月,在看了十月的寒流关于Avalonia UI的介绍后,我看到了.NET GUI程序跨平台的希望,而且很大,因为大如JetBrains、通用电气,小如steam++团队,都是Avalonia UI的使用者。加上,Avalonia XAML与XAML语法差异不算很大,Avalonia XAML中还引入了选择器、变换的Duration这样极大方便开发者的东西,一下子吸引到了我,让我决定与WPF一起学习。

  但这个过程应该会很漫长,因为现在的我主要使用C++/Python基于OpenCV 4库开发计算机视觉的目标识别定位相关的ROS功能包,并使用Pytorch (with CUDA) + YOLO算法训练用于目标检测的深度学习网络模型,它们已经占去了我几乎七成的时间与精力。现在的我将.NET开发作为业余兴趣爱好,保持当初“最狂”时候的梦想:像一家软件公司一样,开发更多的实用程序,让它们填满我的电脑。主业还是专业内容与项目组的工作,它们是才生活的主色调。

  洋洋洒洒写了六七千字,将我在软件方面的心路历程给粗略介绍了一遍。我依然会保持对软件开发的兴趣,与大家交流、分享软件中的些不一样世界。这是我的兴趣,就好比打游戏一样,兴趣是以与主业可无关的。相信能读到这里的读者,一定是对博客内容看的十分仔细,或者是和我很熟的人。感谢各位的支持,愿我们都有未来美好,事业有成,福寿安康。

  写于2024年5月29日。