茉莉花新闻网

中華青年思想與行動的聚合地

计算机专业大学四年应该怎么过才有意义?

编程指北的回答

某 985 软件工程科班,如果大学能重来,我会这样努力去过:

  1. 我会在大一就开始去MOOC、B站学习,考试前两周看老师的PPT即可取得高分

(PS: 因为国内很多高校上课耽误学习,不上课考勤扣分,拿不了高绩点,耽误保研出国,课程设置不合理,实验课多,作业多,并且是写word报告,占了很多时间,但是效果却不如自学,上课PPT,考试内容全在PPT上,看书的同学没有背PPT的分数考得高,,,

  1. 什么社团、学生会之类的都不参与,只参加技术社团
  2. 学好操作系统、计算机网络、编译原理、数据结构与算法这些基础CS课程
  3. 从大一开始学C -> C With STL,然后去 leetcode刷题,毕业时刷到一千道,估计是卷王了
  4. 能去参加ACM校队的话就去,现在大厂面试必考算法,算法不过关的话基本和大厂无缘了,在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重 BAT面试官编写的leetcode刷题笔记,看完秒杀80%的题目
  5. 提高代码量,不管是项目还是刷题,现实是很多同学代码量太少,很多同学到毕业估计 几万行都没写到,但是真正想锻炼出极强的编程能力没有上 10w很难
  6. 多看经典大黑书,学习计算机一定不要想着速成,要下苦功夫,去啃那些经典书和源码,然后自己动手写,比如这些书,看完估计大厂ssp没问题:

编程指北:计算机必读的书单(含下载方式)

7. 从大一开始多动手写代码,其实现在更建议各位学弟学妹没有编程基础的话,可以尝试从Python作为编程入⻔第一课,相对来说,Python 兼容多平台, 更简单、易学一些,并且具有强大的库,可以快速使用 Python 完成一些实用小工具,激发编程兴趣,这方面学习可以尝试 夜曲编程 ,交互式学习,深入浅出地用日常场景理解晦涩的专业概念,也无需下载安装各种编译软件,直接在线就能学习、写代码:

8. 找一个女朋友(似乎在开玩笑

多去看国外一些优质公开课和做一些 Lab,像mini os、数据库这种。

我们目前大多数学校就是孤立的学了一堆 操作系统、计组、体系结构、编译原理、C、汇编,但是很少有同学能把这些课程连起来形成CS体系,这方面 CMU 的神书神课《CSAPP》又要提下了,幸好我们学校开设了《系统级编程》,教材就是这本书,其它没有开设这门课的学校建议学弟学妹们自学。

课程设置也比较杂乱,学了一堆的数电、模电、大学物理..... 想起大一被大物实验支配的恐惧,,,时间都费在这些上面了,说实话把这些课程压缩,上一些函数式编程、或者比较前沿的CS方向,我觉得对计算机专业更好!

像我们学校大二下、大三才开始计网、操作系统、数据库原理等核心课程,太晚了,这些课程至少要在大三前完成,大三再开设图形学、编译原理等进阶课程,大四直接就是实践课程为主或者让同学们自己出去找实习! 我个人觉得大概这样设置CS课程更为合理: 大一上:C/C++程序设计、高数1(初等微积分)、离散数学 大一下:数字逻辑、数据结构、汇编语言、面向对象编程(Java/C++)、高数2 、线性代数 大二上:软件工程、数据库、Java/Python Web开发、组成原理 大二下:操作系统、计算机网络、系统级编程(CSAPP) 大三:软件测试、软件安全、课程设计、密码学、图形学等选修方向 大四:实践、毕设、实习 另外,还有最大的问题就是OS、网络、数据库等CS核心课程上成了文科!缺乏一些动手实践Lab,大部分都是写实验报告,就是不写代码。

为什么美帝在数据库、操作系统、各种工业软件工程能力如此强悍?

我觉得和他们 CS 强校的教育模式有关,国外,尤其是美国,很多高校 CS 教育极其注重实践,国内也就清北复交浙等少数学校有少量的实践教学,其它都是念 PPT,课后作业就是做 Word 项目。。。。

另外,再这说下我大学学习计算机的经历吧,相信对于很多同学有帮助:

我在大一之前完全没有编程经验,高考后,填的专业前几个也是清一色的传统工科,被软件工程录取纯碎是意外。

大一开学,第一门编程语言就是学的 C 语言,怎么说呢,老师讲的,书上写的我都能看懂,但是让我写一个大的程序,我就摸不到头脑。不知从何下手,学了半学期,也只能写写课后习题,算算水仙花数什么的。

大一上考完 C 语言后,我便在心里默默念想,这辈子再也不写 C 了,但没想到的是,后来这成了我最爱的一门语言。

整个大一上,一个词语就是“迷茫”,一个字就是“混”

混到什么程度呢,王者荣耀打了几千场,线性考试前一晚才在 mooc 上刷完所有章节,因为平时上课我基本都没听的,练习题也都不做,不过好在最后考了 70 分,也算飘过:

v2 6585c570b7d2b98c429391268e0bf3fa 1440w

大一没好好学习,也是我大学最后悔的事情,抛出主观上的不努力、沉迷游戏,我分析了一下客观原因。

  1. 刚高三暑假结束,从高中进入大学,完全不适应大学学习节奏,也不知道大学要主要靠自学,尤其是CS
  2. 不知道学微积分这样的数学、计算机导论、C语言课有什么用,也没 get 到编程的乐趣...

说实话,我到后来学习机器学习的时候才知道数学的用处,比如在机器学习或数据挖掘中常常用线性代数来降低数据维度,很多问题最终都能化为求解线性方程组。

所以为了避免以后想走这些方向却被数学卡住,在大一、大二上数学课的时候就好好的学一下。

书到用时方恨少,不要现在以为没用处就不好好学,等你需要的时候,就知道后悔了。(默默流下了不学无术的眼泪┭┮﹏┭┮

另外,我大一当时也不懂绩点的重要性,尤其是对于以后要出国或者保研的同学,请务必把绩点弄得越高越好,不然后面加权排名的时候就知道哭了。。。

转变大概从大一下开始吧,那时候好几个室友都拿到了奖学金,于是,我自己也开始慢慢反思,觉得这样下去,大学可能就废了。

默默的把王者荣耀卸载(当然,后面又下回来了,反反复复十几次。。。)

当然,后面的几学期,专业课我都学得还不错,也没有再荒废了,绩点也都基本保持在了 3.6 - 3. 9 左右,也拿到了几千块的奖学金,算是从大一的迷茫成功找到了方向。

v2 2266d349a41e6eb396dcda56a89428ad 1440w

后来,我的手机了装满了各种学习软件,中国大学 mooc、网易云、网易公开课、慕课APP、学堂在线、B站(用来学习的 )等,经常我会在睡觉前打开这些 APP 看半个小时左右(主要是催眠,看一会就睡着了),我到现在印象非常深刻的几门网课就是:

  • 网易公开课上的 CS 107 (让我对 C 语言产生了浓厚的兴趣,全是底层的知识)
  • 中国大学 MOOC 上的 计算机网络(哈工大的)、编译原理
  • 学堂在线上清华邓俊辉老师的数据结构(上)(下)
  • B站上 CS 50
  • ....

跑远了,继续回到流水账。

大一下,开始学习数据结构与算法、数字逻辑、离散数学这些计算机核心课了。

此外,还学了一门当时我看来非常牛逼的语言:Java。

为啥说我当时觉得它牛逼呢?

因为刚经历过 C 语言的摧残,发现 Java有丰富的类库,各种方便的工具类。

再也没有指针了,变成了对象引用,简直是新大陆。

所以我学得很认真,还记得当时看过高琪的 Java 300集 教程,也是从那里算是正是开始了我编程学习之路。

自己也用 Java 写了不少好玩的东西,比如联机五子棋、HTTP Server 等等。 类似这种:

这让我第一次感受到编程这么有趣,俗话说兴趣是最好的老师,Java 也算是帮我解锁了对于编程的兴趣。

在学 Java 的时候喜欢在网上搜资料,但总觉得各种博客上的知识过于零散,为了“精通” Java,我在知乎搜索各种书单,先后看了《Java核心技术卷》《Java并发编程》好几本书,自觉 Java 基础还算可以,不过现在已经快两年没写了,成功转入C++阵营。

而且我有个习惯,就是每天早上基本都是六七点起床,八点多对我已经算赖床了,所以和我室友显得有点“格格不入”。

早上起太早的话,他们还在睡觉,我在寝室写代码的话,难免会发出各种声音吵到他们,尽管我做什么都是蹑手蹑脚,生怕发出椅子摩地,或者碰撞的声音,这让我也觉得不太方便。

所以,后面没有课的早上我一般都去图书馆五楼自习室了,在那看书,看书觉得烦了,就写会代码或者刷刷知乎,看看博客。

v2 60a2da0ac0442dcfb5531eecd463384f 720w

这是被我长期占领的一个位置,因为书太多,不方便每次都背来背去的,所以就找了个考研自习室。

就这样从秋天,到了冬天,桌子上多了围巾手套,还有 C++ primer(误,我从大二才开始学C++的)

v2 e272a0efa995aaf0f6715ad70b5027a8 720w

那时候,每天上午的盼头的就是早点到中午,我就可以去吃饭,然后去学校散步了,我经常把中午饭菜拍下来,感觉蛮有意思的哈哈哈:

v2 bac04d7898a89ca52e46876bde1edcd9 720w

一般我都是赶在中午下课高峰之前去吃完,然后去学校绿荫道散步

大二时,在上一些无聊的课时,我总把这本书带着,每节课可能会翻个几页,那时候看到里面的汇编、内存管理、存储器层次我是真的云里雾里,因为还没学操作系统,C 语言也学得很差。

所以断断续续的看了几章,说不上学到了什么,但让我对这种枯燥的基础知识第一次产生了兴趣,有一种想彻底搞懂它们的想法。

后来在知乎大佬的指引下,为了看懂这本书,去看了王爽那本《汇编语言》,也在上图。

重学了 C 语言(主要是指针和内存),由于已经学了汇编,指针对我再也不是问题了,同时看完了《C和指针》、《C专家编程》、《C陷阱与缺陷》,对 C 语言使用得也愈加的熟练。

大二那段时间,学院里突然刮起全员学机器学习的风气,虽然不至于全部,但是真的是很多人都在学,明明 16 年大一时客户端安卓开发还挺火的,到了 17 年各种机器学习、神经网络就席卷而来。

不能不感叹,IT 行业日新月异呀,不学习就可能被淘汰。

当然了,我也不例外的加入了,先后看了些吴恩达的视频、西瓜书。

跟着做了手写数字识别这种入门必做的项目,但是后来总觉得对机器学习、深度学习提不起兴趣,原因之一就是我觉得无法完全掌握每一步,了解每一步背后的原理,再加上自己数学也学得不太好,这让我学得很没底气。

于是机器学习之路也止于大二。

大二是学习内容最丰富的时间,当时室友用 Python 写了抢课脚本,感觉很好玩。

然后自己又跑去学 Python,学爬虫。

写了一堆爬虫,什么爬豆瓣电影、知乎回答、抢课脚本,玩了一段时间也没太大兴趣了。

时间来到了大二下,按照课程安排,开始上操作系统了。

于是我又在知乎搜索「操作系统怎么学」,不得不说知乎上各位前辈大佬的回答对我的指引作用极其的大。

顺着一堆回答,我发现原来还能跟着别人写一个 mini OS,这对我吸引力太大了。

于是我买了一本《操作系统真象还原》,这本书真的非常仔细,把写 OS 需要用到的前置理论知识、Intel手册、汇编、内联汇编全都给你讲清了。

我一路跟着书写,写到了汇编开机打印出我的名字,再到后来进入 C 语言写内核各个模块,写到内存管理我就中断了,没有继续写下去,这也算个遗憾吧。

这本八百多页的书,我花了两个月时间啃了五百多页,一下课就跑去图书馆,在我的虚拟机中跑 qemu,那时候就沉浸在类似下图这种界面:

v2 631fe6476a8a47642e24fd43091e261d 720w

当时我真的对这个入迷了,为了写 mini os我还去看了 Linux0.11 的部分代码,看了哈工大李治军老师的 OS 公开课,原因就是哈工大 OS 实验课是用的 Linux 0.11 来魔改。

还很奇葩的把我 QQ 签名改成了 jmp 0x7c00

v2 d14caf049e7ddd128874d32819a56b6d 720w

(PS: 这句汇编就是跳转到 0x7c00 地址,BIOS 开始引导操作系统

于是就这样,我越来越喜欢偏底层一点的东西,所以决定走 Linux C/C++ 路线,然而现在看来确实太年轻了,Linux C/C++ 在鹅厂好多也是用来写业务滴。。。

大二下在知乎、牛客网搜索学习路线,我大概清楚了需要看些什么书(搜索敲黑板,一定要学会主动搜索各种信息。

专注的大三

于是在大三左右开始了非常标准的 Linux C/C++学习之路:

前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度探索C++对象模型》、《STL源码剖析》、《C++设计与演化》、《Linux内核设计与实现》、《Linux内核完全注释》、《effecitve C++》 、《effective modern C++》、《程序员自我修养》、《Linux高性能服务端编程》、《Linux多线程服务端编程》(知乎陈硕大佬写的)......

顺便还看了点 Muduo 源码,自己模仿着基于 Epoll 写一个 Reactor模型的 Web 静态服务器,跟着知乎 Milo 大佬写 Json 库,总之,这段时期是写了一些小”轮子“的。

(PS:有很多朋友问我是如何看完这么多书的,其实在之前的文章中就写了,看书我会有选择的挑章节看,不会从头看到尾的,而且大三开始课就少了,我基本就在刷这些书,每天 10+ 个小时,其实时间还蛮多的?毕竟我也没参加什么社团、学生会之类,也没女朋友。。。

那时候会每天记录看书的进度,感觉特别有劲:

v2 4e287c6c1a9de023d54a88bea230f82e 720w

书看得越多,其实你越能找到自己的方向,大三上我就给自己学习定位:

深入C++语言(多线程)+ 存储(学习 Redis、leveldb)+ 网络编程(学习muduo,各种网络编程模型)+ 学习分布式(MIT 6.824、ddia、google 三大论文等)

基本上是沿着上面几个方向去展开学习的,有的看书,有的论文,也有的看博客看源码。

总之,知识面在大三不断扩充,自己开始关注学习 C10K、C100K 这样的后台服务器开发高性能、高并发的解决方法。

当然了,还有些到现在还没开始,比如 leveldb 的源码、6.824 的 lab,可能是变懒了......

也可能是学习变得不那么纯碎面向技术了,变成面向工作、面向赚钱了哈哈哈。

值得一提的是,大三上我们学院有门 System Programing 的课,教材就是使用的 CSAPP,因此我之前大二草草看完的书,得以再次翻开,这一次我把附带的是个实验也挨着挨着做了,收获良多,有位运算各种奇技淫巧,有 Bomb lab 刺激的打怪通关、也知道了buffer overflow attack.... 还有实现基本的内存管理等等。

印象最深的便是做 bomb lab,一个个 phase 的通过真的很让人兴奋,我几乎是熬夜连着把这几个 phase 过掉的,当然头发也没少掉。

当时还在简书写了个万字长文记录:

v2 9dd0881c8844eef6c99daf3d05d63d7a 720w

再到后来,我拿到了微信实习 offer,然后顺利转正。

在我大三下拿到实习 offer 后,开始做一些国外计算机课程 lab,一方面有钱赚,而且还不低,靠这个我在大三下就实现了经济独立,另一方面这些 lab 有些很有意思,对提高基础和编程能力很有帮助。

在这里列举一些我做过的觉得有意思的 lab(之前有篇文章写过):

第一个是文件系统

这个玩意挺有意思的,就是要让你自己去设计一个文件系统,比如文件、数据块、目录等等,而且你要提供创建、读写、删除、随机读、随机写等等接口,然后通过 Linux 的 VFS(虚拟文件系统) 机制挂载到 Linux 内核中,然后就可以用系统调用 open、read、write 这些来在你的文件系统上进行读写。VFS 是Linux一个机制,它规定了 IO 接口,然后你去实现这些接口,你就可以挂载在上面。通过这个东西我深入的学习和了解了文件系统,报酬也是非常值的。

v2 3bb18b22491c665c8bb3fd9fd53e5fdc 720w

第二个是SVC

就是版本管理系统,类似 SVN 和 GIT的,但是相对 GIT 做了很多简化,核心的就是创建分支、分支合并、回滚、commit 这些,通过这个我又去详细了解了 GIT 的实现原理,并且自己写了一个简单版本的 GIT,受益匪浅,也赚到了几千大洋。

v2 b78851f49339614046809318282185d9 720w

第三个是操作系统的锁实现

这个就是让你基于硬件的原子指令 xchg、cmpxchg 这些实现一个锁,这个需要内联汇编、汇编等知识,简直是硬核!!!做完这个也解开了我对锁实现的一些疑惑。

v2 8ac3dcc1381733761d128b142beb8e69 720w

Web Proxy

这个就更有意思了,要求用 C++ 写一个代理服务器,类似 Nginx 的代理功能,当然,相比 Nginx 弱鸡很多,

但是麻雀虽小,五张俱全,而且老外最有意思的是要求代理服务器对一些图片和 HTML 恶作剧,就是代理服务器随机的在原始服务器,返回的响应里 插入一些图片和文字,因为那天是愚人节。。。 不得不说老外还是很有趣的。

v2 585da1a27e987b8ef311c8ed754ad7d9 720w

还有模拟实现 TCP 可靠传输的

这个就更硬核了,人家老外老师就是给力,直接做了一个网站,这个网站你可以通过 TCP 连接上去,然后你需要运行几个节点,互相发消息,他们之间的消息都会经过老师的网站,所以通过网站上是可以控制丢包率的,也能控制节点的拓扑结构,要求就是让你基于这种不可靠的信道,做出可靠数据传输!这简直就是翻版 TCP 嘛,超时重传、ACK、滑动窗口啥的都给我上!就是像下面图中一样,圆圈就表示你可达的范围,不同节点形成各种网络拓扑,可以调节网络 丢包率 Loss chance。

v2 13c19827354a3192fe752a6007a996e2 720w

当然也有很多写算法的,数据结构实现的,图搜索的,也有做机器学习、深度学习的,反正各个方向都有。

做这些 lab 真的实实在在的提高了我的编程实践能力,也算是检验了前期看那么多书还是有效果滴。

如果你想做的话,可以看这篇文章大学期间月入上万!,符合条件可以加我微信。

最后附上大学期间买的一些书,毕业的时候大部分都卖了,因为实在不便携带:

这是带去图书馆自习室的书(常占位置)

v2 b0692dd2bfecd3abbc8da8f2fce3f7a0 720w

这是毕业整理的书:

v2 1760498178bf329f57a3b8a59ad5ed8e 720w

买这些书花了我不少钱,大家都知道计算机这些书一本就是五六十、七八十起步。大学四年光买书就花了几千块。不过我一直认为这也是我花的最值的一笔投资。

现在大厂面试必考算法,算法不过关的话基本和大厂无缘了,在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重:

BAT面试官编写的leetcode刷题笔记,看完秒杀80%的题目

鲁迅说过

人生没有白走的路,每一步都算数。

加油,共勉! @编程指北

同类信息

查看全部

茉莉花论坛作为一个开放社区,允许您发表任何符合社区规定的文章和评论。

茉莉花新闻网

        中国茉莉花革命网始创于2011年2月20日,受阿拉伯之春的感召,大家共同组织、发起了中国茉莉花革命。后由数名义工无偿坚持至今,并发展成为广受翻墙网民欢迎的新闻聚合网站并提供论坛服务。

新闻汇总

邮件订阅

输入您的邮件地址:

linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram