PH-UY 2023: ELECTRICITY, MAGNETISM, & FLUIDS (S2026):
这门课同样安排在早上8点,地点在Tandon校区。从时间安排上来说,这意味着我可以享受相对轻松的通勤节奏:7:30从家里出发,7:50左右到达学校,正好赶上8:00的上课时间。这比起那些需要跨校区上课的同学来说,已经算是相当幸运了——他们往往需要6:50就起床,7:10出门,才能在7:50赶到学校。
然而,理想很丰满,现实很骨感。第一节课我还是迟到了,原因说起来有些尴尬:我在衣柜前纠结了整整10分钟,不知道该穿什么去上学。纽约的冬天天气变化无常,早上出门时可能很冷,但教室里的暖气又开得很足,这种温差让人很难决定穿多少合适。最终这10分钟的犹豫让我错过了准时到达的机会。
授课教授是Perez-Giz,从第一节课的表现来看,他是一位非常有趣且富有活力的教授。他的教学风格强调互动,这一点从他准备的教学道具就能看出来——他给每个学生发了一张小卡片,上面只印着A、B、C、D四个选项。当他提出选择题时,学生们可以举起卡片来回答。有趣的是,有时候正确答案是E,而卡片上根本没有E选项,这种小小的”陷阱”设计让课堂气氛变得轻松活跃。
第一节课的内容安排比较常规:教授首先带我们过了一遍syllabus,详细介绍了课程的评分标准、作业要求、考试安排等等。然后他选择从流体力学(fluids)这个topic切入,作为整个课程的开端。这节课的具体内容相对基础,主要讲解了液体压强的计算方法——包括压强的定义、计算公式(P = ρgh)、以及在不同深度下压强的变化规律。
对我来说,这部分内容并不陌生。我之前学过电磁学和流体力学的相关知识,而且我的AP Physics C: Electricity and Magnetism考了4分(虽然不是满分,但也算过得去),所以这些基础概念对我来说相对容易理解。顺带一提,我的AP Physics C: Mechanics考了5分(满分),所以力学相关的内容我掌握得更加扎实,用起来如臂使指。
客观来说,第一节课的知识密度并不高,基本上就是非常简单地介绍了液体压强的计算原理,没有涉及太多深入的推导或复杂的应用。但这并不意味着课程质量不高——恰恰相反,Perez-Giz教授的授课方式让我印象深刻。他上课时充满活力,语调抑扬顿挫,肢体语言丰富,时不时还会穿插一些幽默的评论或生活化的例子,让原本可能枯燥的物理概念变得生动有趣。
这种教学风格和我上学期遇到的AI课程教授形成了鲜明对比。那位教授虽然看起来和蔼可亲,但整节课几乎没有任何互动,唯一的”互动”就是偶尔问一句”有什么问题吗?“然后在沉默中继续讲下去。更让人难以接受的是,他上课时一直盯着屏幕,很少和学生有眼神交流,这种单向输出的授课方式让我感觉自己像是在看录播视频,而不是在参加一堂真正的课程。到了后期,我基本上放弃了认真听讲,转而选择自学课本内容。这段经历让我对那门AI课程产生了很深的怨念,也让我更加珍惜像Perez-Giz这样用心教学的教授。
另一个让我感到意外的点是,Perez-Giz教授明确鼓励我们使用AI工具来辅助学习,包括大型语言模型(LLM)。他认为AI是一种强大的学习工具,可以帮助我们更快地理解概念、检查计算错误、甚至生成练习题。这种开放的态度在当前的学术环境中并不常见——很多教授对AI工具持谨慎甚至抵制的态度,担心学生会过度依赖AI而失去独立思考的能力。Perez-Giz教授的这种态度让我想起了我在Unix课程中遇到的困惑:Sterling教授完全没有提到AI工具的使用政策,这让我不确定在那门课中使用AI是否合适。相比之下,Perez-Giz教授的明确表态让我感到轻松了许多。(虽然很多课就算是禁止我们也会继续用罢了)
从课程设置来看,这门Physics课程似乎不需要编写代码。虽然物理学和计算机科学有很多交叉领域(比如计算物理、数值模拟等),但这门课显然更侧重于理论推导和概念理解,而不是编程实现。这对我来说是个好消息——考虑到我同时还要应对Unix课程的高强度编程作业,能有一门不需要写代码的课程来平衡一下学习负担,还是挺不错的。
总的来说,第一节Physics课给我留下了非常积极的印象。Perez-Giz教授的教学风格、课堂氛围、以及对AI工具的开放态度,都让我对这门课充满期待。虽然第一节课的内容相对简单,但我知道后续的电磁学和流体力学部分会逐渐深入,难度也会相应提升。我需要保持目前的学习节奏,及时复习和预习,确保自己能够跟上课程进度。同时,我也打算充分利用教授鼓励的AI工具,看看能否在学习效率和理解深度上有所提升。
Programing in Unix:
早在开学前,我就从各路学长学姐那里听说过Professor Sterling的”传说”。甚至我上学期的Intro to Game Programming的教授(他们的代词是they,是一位非常友善且年轻的教授,基本上没有代沟,上课时经常和我们讨论游戏应该如何玩以及当下流行的游戏设计理念)也特别提到过Sterling教授。所有人对他的评价都惊人地一致:课程节奏快得让人喘不过气,作业标准严格到令人发指,代码规范要求高到几乎苛刻的程度。总之,这是一位让人又敬又畏的”怪咖”(weirdo)教授。
昨天怀着忐忑的心情去上第一节课。然而,纽约的地铁系统似乎总是在关键时刻给人添堵——F线地铁在East Broadway附近莫名其妙地停了整整15分钟。我坐在车厢里,看着手机上的时间一分一秒地流逝,心里的焦虑感不断攀升。本来就对这门课充满紧张感,现在又要面对迟到的风险,这种双重压力让我的心情雪上加霜。好在最终还是赶到了教室,虽然比预定时间晚了几分钟,但总算没有错过课程的开始。
教授首先简单过了一遍syllabus。这门课的全称是Unix Systems Programming,从课程名称就能看出它的核心定位:在Unix环境下进行系统级编程。具体来说,课程内容包括以下几个主要部分:
首先是用C语言在Unix环境下编程。这不是简单的”Hello World”级别的C语言入门,而是要深入理解C语言在系统编程中的应用——包括指针操作、内存管理、结构体设计等等。教授特别强调,我们需要写出”good, reliable code”,这意味着代码不仅要能运行,还要健壮、可维护、符合规范。
其次是实现标准Unix工具。我们将从零开始实现一些经典的Unix命令行工具,比如env(显示环境变量)、ls(列出目录内容)、du(磁盘使用情况统计)以及shell(命令行解释器)等。这些工具看起来简单,但实际实现起来涉及大量的系统调用、错误处理和边界情况考虑。通过重新实现这些工具,我们能够深入理解Unix系统的工作原理。
第三部分是网络编程和多线程。这是课程的进阶内容,涉及socket编程、TCP/IP协议、进程间通信(IPC)以及Pthreads多线程编程。教授甚至提到会教我们如何在单线程环境下同时处理多个I/O操作(“Wait, you can do that?”我当时心里想)——这显然涉及到非阻塞I/O、select/poll/epoll等高级技术。
整个课程的重点始终围绕两个核心:代码风格(code style)和错误检查(error checking)。Sterling教授对代码质量的要求近乎苛刻,这一点从他在syllabus中反复强调就能看出来。他不仅要求代码功能正确,还要求代码结构清晰、命名规范、注释完整、错误处理全面。这种严格的标准虽然让人压力山大,但从长远来看,确实能培养出良好的编程习惯。
必读教材是Michael Kerrisk的《The Linux Programming Interface》,这是一本厚达1552页的大部头著作,被誉为Linux系统编程的”圣经”。好消息是,我们似乎并不需要购买这本书——教授提到学校图书馆有电子版,或者可以通过其他合法途径获取。坏消息是,这本书的厚度意味着我们需要阅读和消化大量的技术细节。
成绩分布相对简单明了:作业占30%,期中考试占30%,期末考试占40%。作业允许最多5天的延迟提交,但会有相应的分数惩罚(具体惩罚比例教授有详细说明但是不在这里写出,因为我认为这并不是很重要)。这种设置既给了学生一定的缓冲空间,又通过惩罚机制鼓励大家按时完成作业。
过完syllabus后,教授没有浪费任何时间,直接切入正题——从Linux/Unix的历史讲起。他首先放了一张Linus Torvalds的照片,然后是那张经典的”Fuck You, NVIDIA”图片(Linus在某次演讲中对NVIDIA竖中指的照片),引得全班哄堂大笑。这个开场既幽默又点明了开源社区的某些文化特征。
接下来,教授详细讲解了Unix和Linux的发展历史。我了解到,Linus Torvalds最初只是写了一个内核(kernel),而Unix则是由AT&T的贝尔实验室开发的。真正意义上的”Linux”其实是Linux内核加上GNU项目提供的各种工具和库——这就是为什么有些人坚持称其为”GNU/Linux”的原因。后来,随着POSIX标准的制定,各种Linux发行版(distribution)如雨后春笋般涌现,包括Ubuntu、Debian、Fedora、Arch等等,它们都基于Linux内核,但在软件包管理、默认配置、用户界面等方面各有特色。
然后教授讲到了GCC(GNU Compiler Collection)和C语言的关系。GCC是一个非常有意思的编译器项目。早期,每当有人开发了一个新的Unix系统,就需要给贝尔实验室发邮件,然后实验室的工程师就得手动为这个新系统编写GCC的适配代码(笑死)。这种手工适配的方式显然不可持续。后来,GCC实现了”自举”(bootstrapping)——用GCC编译GCC本身,这样只要有一个能运行的GCC版本,就可以在新平台上编译出适配该平台的GCC,大大简化了移植工作。
上课上到这里,我突然恍然大悟:这门”Programming in Unix”本质上就是深入学习C语言和POSIX系统调用的课程。Unix系统编程的核心就是通过C语言调用操作系统提供的各种系统调用(system calls),从而实现对文件、进程、网络等资源的底层操作。这和我之前学过的高级语言编程(比如Python、Java)完全不同——那些语言都有厚厚的抽象层,把底层细节隐藏起来;而C语言和Unix系统调用则要求程序员直接面对内存管理、文件描述符、进程控制等底层概念。
Sterling教授的授课风格确实名不虚传。整整一小时,他像开了机关枪一样密集输出知识点和金句,几乎没有任何废话和停顿。他的语速很快,思维跳跃性强,经常在讲解一个概念的同时穿插相关的历史背景、设计哲学或实际应用案例。这种高强度、高密度的授课方式非常吸引人——你能感受到他对这门学科的热情和深厚的知识储备,但同时压力也确实很大。稍微走个神,或者低头看一眼手机,就会完全跟不上他在讲什么topic,然后就需要花额外的时间去补回来。
根据课程安排,我们会从C语言基础开始,逐步深入到系统编程的各个方面。有一个细节让我感到有些困惑:教授在讲解syllabus时特别强调要遵守NYU的学术诚信准则(code of conduct),但全程没有明确提到LLM(大型语言模型)或AI工具的使用政策。这算是默认禁止吗?还是说他认为这是不言自明的?我其他课程的教授(比如Physics课的Perez-Giz教授)都明确表示可以适当使用AI辅助学习,甚至鼓励我们利用这些工具来提高学习效率。但Sterling教授似乎刻意回避了这个话题,既没有明确允许,也没有明确禁止。
考虑到这门课强调”good, reliable code”和”error checking”,我猜测Sterling教授可能希望我们扎扎实实地手写代码,而不是依赖AI生成代码。毕竟,系统编程涉及大量的底层细节和边界情况处理,如果过度依赖AI,很可能会错过对这些细节的深入理解。而且,AI生成的代码往往缺乏严格的错误检查和规范的代码风格,这恰恰是Sterling教授最看重的两点。
不过,在正式开始第一个作业之前,我打算去office hours当面确认一下这个问题。毕竟,与其在模糊地带冒险,不如直接问清楚教授的态度。如果他明确禁止使用AI,那我就老老实实手写代码;如果他允许在某些场景下使用(比如查找API文档、理解概念等),那我也能更放心地利用这些工具。
总的来说,第一节Unix Systems Programming课给我的感觉是:这将是一门非常硬核、非常有挑战性的课程。Sterling教授的授课风格、课程内容的深度和广度、以及对代码质量的严格要求,都预示着接下来的一个学期不会轻松。但同时,我也能感受到这门课的价值——如果能够扎实地掌握Unix系统编程的知识和技能,对我未来的职业发展将会有很大帮助。毕竟,无论是操作系统、网络编程、还是后端开发,这些底层知识都是绕不开的基础。
现在的问题是,我需要合理安排时间,平衡好这门课和其他课程(Physics、Linear Algebra、Networking Security)的学习负担。特别是考虑到Sterling教授的作业标准之高,我可能需要在每个作业上投入比预期更多的时间。早睡早起、提前预习、及时复习——这些看起来老生常谈的学习习惯,在这门课上可能会变得格外重要。
Linear Algebra:
回顾一下我的数学学习路径:上学期刚结束Calculus 2,也就是微积分的那一套——积分技巧、级数收敛、参数方程等等。并不想继续学Calculus 3(多元微积分),而且很多课的pre-requisite是Linear Algebra,我现在反而先开始了Linear Algebra(线性代数)。I know, I am behind schedule,但说实话,当时真的是完全忘记选课这回事了,等反应过来的时候只能现在选择这门课了。
第一节课错过了,因为起晚了。
第二节课的上课地点就给了我一个surprise——居然是在一个类似影院的阶梯教室里。这种设计虽然看起来很酷,但实际体验并不理想:坐在后排的话,教授的声音会被空间吸收掉大半,听得非常吃力。好在教授也意识到了这个问题,贴心地开了Zoom直播,这样后排的同学可以通过电脑听得更清楚一些。不过从这个安排来看,这门课似乎对出勤率(attendance)没有硬性要求?至少目前还没有明确提到。
教授的授课风格偏向细致型,第二节课花了很多时间在基础概念上打磨,讲解得非常详细。目前来看难度不大,基本都能跟上,但我有种预感——这可能只是暴风雨前的宁静。线性代数后期的抽象概念(比如特征值、线性变换、向量空间)往往会让很多人措手不及,所以现在的”简单”可能只是表象。
这也是我第一次在CAS(College of Arts and Science)的教学楼上课。之前一直在Tandon或者其他校区,没想到CAS的门禁管理这么严格:迟到超过15分钟就不允许进入教室了。这个规定对我来说是个不小的挑战——我一向不是个早起的人,但看来为了这门课,我得调整一下作息习惯,早睡早起了。
从第一节课的内容来看,Linear Algebra的起点是矩阵(matrices)——矩阵的定义、运算规则、行列式等等。虽然这些概念在高中或者Calculus里有过一些接触,但显然这门课会深入得多。我觉得我需要提前预习一下后续章节,特别是矩阵乘法、逆矩阵、秩(rank)这些核心概念,免得到时候上课跟不上节奏。毕竟Sterling教授的Unix课已经让我见识到了什么叫”高强度输出”,虽然这门Linear Algebra的教授风格不同,但提前准备总是没错的。
Networking Security:
这门课安排在晚上6:30,考虑到我5点下班,中间有将近一个半小时的缓冲时间,通勤压力基本为零。事实上,这是我这学期四门课里唯一一门没有迟到的课——Physics迟到是因为纠结穿什么,Unix迟到是因为F线地铁抽风,Linear Algebra第一节课直接睡过头没去。所以当我准时坐在Networking Security的教室里时,内心甚至有一种莫名的成就感:看,我也是能准时上课的人。
教授给我的第一印象是……怎么说呢,缺乏精气神。不是说他态度敷衍或者不认真备课,而是他的语调实在太平了——整节课几乎没有什么起伏,像是一条笔直的水平线。和Physics课的Perez-Giz教授那种充满激情、抑扬顿挫的授课风格相比,简直是两个极端。和Sterling教授那种机关枪式的高密度输出也完全不同。这位教授更像是在用一种平静到近乎催眠的节奏,把知识点一个接一个地摆在你面前。
但有意思的是,课程内容本身其实挺吸引人的。网络安全这个领域天然就带着一种”攻防博弈”的紧张感——漏洞、攻击向量、加密协议、入侵检测——这些topic光是听名字就让人来劲。第一节课虽然还在铺垫基础概念,但教授提到的一些实际案例和攻击场景确实引起了我的兴趣。问题在于,再有趣的内容,配上这种波澜不惊的语调,到了晚上还是会让人昏昏欲睡。
事实上,到了课程后半段,我确实开始犯困了。晚上的课本来就容易让人疲倦,加上教授那种平稳的语调简直就是天然的白噪音。我努力撑着眼皮,试图跟上他讲的每一个知识点,但大脑已经开始自动切换到省电模式。环顾四周,我发现自己并不是唯一一个在和瞌睡作斗争的人——好几个同学已经开始频繁地揉眼睛或者低头看手机了。
下课时间是晚上9点。等我从教室走出来,纽约的夜色已经完全笼罩了整个校园。回到家之后,基本上也没什么精力做太多事情了——简单写了写其他课的作业,洗漱完毕就直接上床睡觉。这大概就是晚课的宿命吧:上完课回到家,一天的能量已经消耗殆尽,能做的事情非常有限。
不过话说回来,我对这门课的整体预期还是偏正面的。教授的语调虽然催眠,但内容组织得还算清晰,而且网络安全本身就是一个实用性极强的领域。在当前这个数据泄露和网络攻击层出不穷的时代,掌握一些网络安全的基础知识,无论是对未来的职业发展还是日常生活中的信息安全意识,都会有很大帮助。只是我可能需要想办法解决晚课犯困的问题——也许上课前喝杯咖啡,或者提前小睡一会儿,总之得找到一个能让自己在晚上9点之前保持清醒的方法。