各位若觉得我年幼无知、缺乏阅历、不知天高地厚,尽可直言 —— 这些评价,真没毛病。
要是觉得有些ai味,没错,实在不太善于表达,写完之后用豆包润色了一下
这是我的项目 CsGrafeq

自我介绍

我是上海一所高中的高二学生,就读于 xx 大学附属中学。
常听人说高中生活 “卷”,但我很庆幸生在上海:这里的升学环境相对宽松,父母为我提供了优渥的生活条件,学校更从不会克扣双休与法定假期。
更幸运的是,我有一台属于自己的办公本 —— 这是我敲开编程世界大门的钥匙;而还算不错的学习成绩,又让我能在完成课业后,有余力钻进代码里琢磨。

自我"们"介绍

其实在我身边,像我这样的中学生编程爱好者并不少。
有人是为了冲击信息学奥赛,有人是被 Scratch 启蒙后,对其底层的 “HTML5+JavaScript” 产生了好奇;也有人是玩网页小游戏时想 “作弊”,搜代码时意外栽进了编程坑;还有人是因机器人社团入门,或是单纯向往 “黑客” 的酷,又或是想靠技术 “装个小逼”……动机虽千差万别,但我们对编程的热爱是纯粹的:不管是用 QT 还是 Node,用.NET 还是 Java,哪怕暂时说不出这些工具能 “干出多大事”,至少能靠自己的手,敲出一个能跑的小玩意儿 —— 这种 “从 0 到 1” 的快乐,足够让人满足。
[PS:插个小推荐 —— 同学做的课表工具真的 “小而精”,不仅功能全,还支持课程拖动、修改,感兴趣的可以看看→https://github.com/DuguSand/Class_frame]

我作为高中生,因而遇到的问题

1.知识储备:非科班的 “先天不足”

作为一个纯靠自学的 “野生程序员”,我的知识储备短板太明显了:曾经不知道 APK 文件本质就是压缩包,至今没搞懂 Git 命令(全靠 GitHub Desktop “傻瓜式” 操作),看了无数教程也没摸透 GitHub Action;
没有专业老师带,我的 “老师” 是博客园的技术帖、菜鸟教程的入门课、GitHub Discussion 的问答区,还有在 QQ 群、论坛里问 “蠢问题” 的勇气 —— 比如 “为什么myelement.innerhtml获取不到元素内容?”
但这些 “不足” 也意外锻炼了我的学习能力:现在的我,不会对着一篇技术文档、一本专业书晕头转向,更不会因为 “学不会” 就轻易放弃。遇到陌生的知识、卡壳的 bug,我第一反应不是慌,而是打开搜索引擎,把问题拆解开,一点一点找答案。

时间不足:挤出来的 “编程窗口”

我终究不是全职程序员,没法把所有时间扑在代码上。
即便在上海,我的高中也有晚自习,每天要待到晚上九点半(当然,比起河南、河北那些 “卷王” 省份,已经算轻松了)。
我确实很喜欢编程,如果你质疑我的热爱……我好像也没法证明…… 总之我的确抓紧一切有空的时候,投入学习,对我来说,能安安静静敲会儿代码,本身就是一种放松。

3.动力不足:最磨人的 “自我怀疑”

比起知识和时间,我想对我们来说最糟糕,最头疼的其实是 “动力不足”。
知识能补,时间能挤,但当我陷入 “我为什么要写代码” 的迷茫时,连敲键盘的手都会变重。
我们这种 “高中生开发者”,身份没优势,技术也没成熟到能赚钱(唯一一次接近 “创收”,是差点靠写脚本赚 50 块,最后也没成)—— 当然,作为脱产学生这点钱什么也做不了;
可如果自己写的东西没人用,GitHub 上的 Star 全是自己开小号刷的,难免会钻牛角尖:“我花这么多时间写代码,放弃了打游戏、和朋友出去玩,到底收获了什么?”“没人在意我的作品,我这是在自娱自乐吗?”
每次 emo 到想放弃时,我都会跟自己说:“自娱自乐,也没什么不好。”想通了其实很简单:比起打游戏,我就是觉得写代码更有意思。那 emo 过去之后,继续敲键盘就好了。

谈谈我的自学经历

我的编程启蒙,说起来有点 “偶然”—— 始于网课时期。
那是很多同学第一次长时间接触电脑,我某天不知从哪儿下了个 VBS 脚本(后来才知道,VBS 所属的 ASP 技术,早在十几年前就不流行了):

t()
function t()
dad=inputbox("叫爸爸")
if dad="爸爸" then
msgbox "好儿子"
wscript.quit
end if
msgbox "不乖!"
t()
end function

这个脚本的逻辑很简单:不输入 “爸爸”,就一直弹窗。
当时我特别好奇:为什么只能输 “爸爸”?输 “dad” 或者 “爹” 行不行?
于是我用记事本打开脚本,试着把t()改成d(),把 “不乖” 改成 “abcdef”—— 没想到真的能跑通!后来又发现,只要改if dad="xxx" then里的 “xxx”,程序就会按我的想法执行。
那一刻的激动,我到现在都记得:就像突然拥有了一个 “新器官”,我的意识居然能 “指挥” 电脑做事。
从那以后,我开始追着各种问题问:“VBS 是什么?”“字符串是什么?”“为什么算判别式时,bb-4ac会报错?”“函数和子程序有什么区别?”“递归、循环、if 语句到底怎么用?”
慢慢摸索着,我写出了人生中第一个 “完整程序”—— 一个解一元二次方程的脚本:

a=inputbox("a")
b=inputbox("b")
c=inputbox("c")
delta=b*b-4*a*c
if delta<0 then
    msgbox "无解"
else 
    x1=(-b-sqrt(delta))/(2*a)
    x2=(-b+sqrt(delta))/(2*a)
    if delta=0 then
        msgbox "有一解"&x1
    else 
        msgbox "x1="&x1&" x2="&x2
    end if
end if

当时当然写不出这么“优雅”的代码,要比这粗糙很多。
可没过多久,我就陷入了迷茫:VBS 其实也有很多可学的内容,比如 WMI(Windows 管理规范)。然而vbs网上的教程大多是 2000 年到 2010 年的,里面全是 DHTML、JavaScriptLet 这类古早技术,jquery在里头都是新东西。为此我也花时间学习JavaScript。
于是我遇到了 VBS 的 “兄弟”——被微软忘记的干儿子JScript。我偶然发现,JScript 有个.NET 版本叫JScript.NET,至今还在.NET Framework 里 “低调” 发布。这是我第一次接触.NET 框架。但JScript.NET的资料太少了,几乎找不到教程和示例。我在一个技术论坛上求了好久,才拿到一个批处理脚本(后来我还在那个论坛上写了不少关于JScript.NET的帖子,算是 “反向输出” 了):

jsc.exe /target:xxx /out:xxx xxx.js

靠着这个脚本,我第一次体验到了 “编译” 的神奇:黑窗口里跳出 “Hello World”,生成的 EXE 文件用记事本打不开 —— 这种 “神秘感”,又把我勾进了新的领域。
那段时间,我还学了 VB6.0 和 HTA(HTML Application),甚至花了一整个学期做了个 HTA 编辑器,成品真的能用,感兴趣的可以看看我的vbs编辑器
再后来学 PowerShell 时,发现用Add-Type必须写 C# 代码。我索性把 C# 代码摘出来,单独建了个.cs 文件,试着编译、运行,再对照菜鸟教程一点点琢磨。也就是从这个 “小项目” 开始,我才算有底气说:“我是个业余程序员。”

我的第一个开源项目

真正让我沉下心做 “完整项目”,是因为被 Desmos 的函数图形吸引 —— 我觉得 “把数学公式变成图形” 太神奇了,于是决定自己做一个函数绘图工具,也就是我的开源项目CsGrafeq。 \

这个项目的开发过程,说起来有点 “笨拙”:一边写代码,一边查资料,一边改框架 —— 从 Winform 换成 Avalonia,表达式编译从用 CodeDom(调用 csc.exe)改成 DynamicMethod 和 ExpressionTree,每一步都走得磕磕绊绊。
我试着啃过 Jeff Tupper 的论文,虽然没怎么看懂,却顺着参考文献一路查下去,最后实在超出了我的能力范围,才不得不放弃。
但好在,我还是做出了一个能用的函数绘图器 —— 虽然运行起来有点卡,但至少实现了核心功能,现在还放在项目的 OldVersion 文件夹里。
之后,我又在这个基础上做几何画板:当我写出一大堆继承于 Shape 类的对象时,用同一个函数调用不同的内容,突然懂了 “面向对象” 的美 —— 原来代码也能这么 “规整”,这么有逻辑。

我对未来的期望

说实话,我从没想过靠编程谋生,只希望它能一直是我的爱好,而不是一份 “必须完成的工作”,或是 “需要死记硬背的知识点”。
我知道,能对一件事保持纯粹的热爱,有多难得。如果有一天,我觉得写代码是负担,那才是真的对不起现在这个为了一行代码兴奋半天、为了一个 bug 熬夜调试的自己。
未来的日子,我只想把这份热爱保留下去:不管走哪条路,不管学什么专业,都能在空闲时打开编辑器,敲一段自己喜欢的代码 —— 这样就够了。