当初填志愿的时候,好多人问我计算机专业主要学什么,我那时候随口回答就是敲代码做软件,真坐进教室上课之后,才慢慢意识到之前想的太简单了。

第一学期的课偏基础,高数占了很大一块,还有一门计算机导论,课本很厚,里面东一块西一块,一会讲硬件发展,一会扯网络的简单原理,代码只碰一点点C语言。机房里的机器反应很慢,敲完一小段程序,运行报错的时候,盯着黑色控制台发呆,找不到错在哪。旁边同学已经调试完了,转头跟我说,这个专业不是写代码那么纯粹,后面还有一堆别的东西要啃。

离散数学上来的时候,有点懵。

之前总觉得数学就是算数计算题,离散完全不是一个路子,全是逻辑证明、集合、图论那些内容,作业写起来特别磨人,有时候一道题卡一晚上,草稿纸写满半张也推不出结果。那会还会钻牛角尖,怀疑学这些跟写程序有什么关系,写代码好像根本用不上这些推导,上课的时候偶尔走神,盯着PPT上的符号发呆。

C语言持续学了挺久,慢慢能写简单的分支循环,写排序,写结构体。上机实验课要按时交程序,经常出现代码语法没错,但跑出来的结果乱七八糟,排查问题要花很久。同一个题目,班里有人写的简洁,有人写的冗长,老师也不会强求统一写法,只要功能能跑通就行。那段时间以为后面的课程都会是这种写代码的模式,心里还暗自松了口气。

再往后课程一下子铺开,操作系统、计算机组成原理、数据结构陆续排进来。组成原理要记寄存器、总线、指令集这些硬件层面的东西,要弄懂数据在机器里面是怎么流转存储的,课本上的结构图密密麻麻,很多概念抽象得很,光靠想象很难吃透。数据结构倒是和代码贴得更近,链表、栈队列、二叉树,还有各种查找和排序算法,不光要把代码实现出来,还要理解效率差别,同一个需求,不同写法跑起来速度差很多。

网络课又是另外一套体系,分层模型,各种协议,IP、端口、数据包转发,上课听的时候好像听懂了,合上书本就容易混掉不同层各自负责什么。实验课会用工具抓包,看着屏幕里一串一串的报文信息,大部分时候只能看懂一小部分,剩下的只能对着资料一点点对照。

也会接触数据库,学SQL语句,建表,写查询,设计简单的表结构,要考虑主键、外键还有冗余的问题。一开始写查询语句很随意,多表联查经常写出来特别笨重,数据量稍微大一点,执行起来就很慢。还有面向对象的语言,换到Java之后,思维方式要跟着改,不能再沿用C那种思路写东西,类、继承、封装这些概念,花了不少时间才勉强适应。

选修课的方向差别很大,室友选了图形相关的,要学图像变换,矩阵运算多到头疼;我选了偏向web开发的,学着搭简单页面,写后端接口,调样式的时候经常被浏览器不同的显示效果折腾。不是所有人走的路线都一样,同一个专业,到后面每个人熟悉的东西差别能拉的很开。

课程之外还有不少时间耗在实验和作业上,小组项目要分工,有人负责写逻辑,有人负责文档,有人调界面,沟通不顺的时候进度卡很久。不是所有内容都有意思,有些理论课枯燥,要背不少概念,考前突击的时候,厚厚的笔记翻来翻去。也有开心的时候,自己写的小程序顺利跑起来,完成一个小项目,那种感觉挺实在。

这些只代表我自己在读期间接触到的内容,别的学校课程安排不一样,侧重方向也会不一样,有的人课程里面嵌入式多一点,有的人人工智能相关内容更早接触。

期末周收拾书包的时候,把几本厚厚的专业书摞在桌角,封皮上沾了不少笔记的墨迹,才慢慢接受,这个专业从来不是只学写代码一件事。