写在最前面

XMUT.SE.DS2022年9月12日
  • 写在前面
大约 12 分钟

写在最前面

不想看的可以直接看这里

  1. 分享你的知识,不能分享你的工作
  2. 只有编码才能让你真正提高
  3. 刷OJ不计入最后总分,但每节课的OJ测试计入
  4. 要学会利用外部资源和正确的求助

学术诚信

什么叫学术诚信(What is Academic Intergrity)?open in new window 到我们系的各种作业、课程里,这个要求可以归结为一句话:

学术诚信

分享知识,不能分享工作

这里用一些简单的例子来说明什么是分享知识,什么是分享工作:

老师的要求分享知识分享工作
问:坦克大战地图
用什么方式来实现最合适?
想想链表和顺序表
在增删和遍历方面有什么区别
用动态数组
编写反转链表的代码你可以试试递归直接给出代码
迷宫寻路用栈应该如何实现用栈肯定是深度优先,
想想深度优先如何实现
你怎么这么笨,
这是我的代码自己看
OJ上的AVL树好难!这是我用来测试的用例,
你看看你能不能通过
这是我花50块买的代码,
25块卖给你
代码怎么都调不过你可以尝试在xx处下断点,
或者打印下这几个变量的值看一看
算了,我帮你调
考试遇到不会的题目相信自己的能力瞄一眼

我们这个课程鼓励你分享你的知识,但绝对禁止分享个人的工作。这个要求的原因很简单:你们进入大学就是为了通过这些(并不)艰苦的工作来获取你们以后所需的各种知识。这里引用南大小百合计算机系版上的一些回复[1]

提示

  • 教育除了知识的记忆之外, 更本质的是能力的训练, 即所谓的training. 而但凡training就必须克服一定的难度, 否则你就是在做重复劳动, 能力也不会有改变. 如果遇到难度就选择退缩, 或者让别人来替你克服本该由你自己克服的难度, 等于是自动放弃了获得training的机会, 而这其实是大学专业教育最宝贵的部分. -- etone
  • 这种"只要不影响我现在survive, 就不要紧"的想法其实非常的利己和短视: 你在专业上的技不如人, 迟早有一天会找上来, 会影响到你个人职业生涯的长远的发展; 更严重的是, 这些以得过且过的态度来对待自己专业的学生, 他们的survive其实是以透支南大教育的信誉为代价的 -- 如果我们一定比例的毕业生都是这种情况, 那么过不了多久, 不但那些混到毕业的学生也没那么容易survive了, 而且那些真正自己刻苦努力的学生, 他们的前途也会受到影响. -- etone
  • 我们都是活生生的人, 从小就被不由自主地教导用最小的付出获得最大的得到, 经常会忘记我们究竟要的是什么. 我承认我完美主义, 但我想每个人心中都有那一份求知的渴望和对真理的向往, "大学"的灵魂也就在于超越世俗, 超越时代的纯真和理想 -- 我们不是要讨好企业的毕业生, 而是要寻找改变世界的力量. -- jyy

本系虽然不一定有多少信誉可供你们透支,但你的每一次不诚信,都在给后续的学弟学妹树立错误的榜样。这种错误榜样的影响,甚至老师们好几年的努力都无法挽回。

因此如果还有人来问:这么搞至于吗?我们的回答是下面的三点:

  1. 对认真学习、努力提高自己的学生不公平。
  2. 对抄袭的学生不负责,教不严,师之惰。
  3. 对其他学生的学习风气、学习态度和学习热情都有极大的负面影响。

曾经我们觉得第一点是最为重要的,因此花很多时间进行查重。但现在我们的想法改变了,第二点,第三点才是我们最为关注的,因此我们会花更多的时间进行查重。

我应该如何学习这门课?

数据结构我们只解决三件事:

  1. 编码能力
  2. 编码能力
  3. 还是TMD编码能力

请回想一下你网页设计的痛苦回忆,其实所有的痛苦都可以归结为一句话:你的编码能力不足。你眼睛会了,但脑子不会;或者你脑子会了,但你手不会。

因此请编码、编码、再编码

有很多同学错误地把高中的学习模式迁移到大学学习中来,认为可以靠背诵、刷以前的考题、考前快速复习来达到学习的目的。遗憾的是这种他们认为的事半功倍,或者说如上文中jyy提到的“最小的付出获得最大的得到”的做法,反而是效率最低的做法。

究其原因,大学的教学目标是使你掌握能力,而不是让你得到高分。可以说这点与高中的教学很不一样。成绩是你能力的体现,而且我们会努力做到让成绩体现你的能力,而不是你的记忆。

所以OJ是你学习本课程中不可获取的一环,如果不是最重要的一环的话。我们每实验课都会进行一次OJ的测试。以去年的经验,OJ刷的多 == 实验课高分 == 期末考试高分。实际上去年OJ分数排名前几位的同学都取得了95以上的卷面分数,而90以上的同学绝大多数都是OJ的高分段(只有两位不是,其中一位自己刷了leetcode,实验课的分数很高)。

所以事实证明,如果你通过编码把学过的内容都过了一遍,那么你会获得能力和分数的双丰收,事半功倍。如果你觉得可以通过只看书来学习本课程,你的能力得不到锻炼,你需要付出更多的精力在学习、背诵上;你理解概念和知识的能力也要远远慢于动手写的同学;而且这个课根本没法给你留下什么东西,等学算法、考研的时候,你又要来一次。十足的事倍功半。

我编码真的很烂,您看我还有机会吗?

取决于你能不能从现在开始花比别人更多的时间编码,把你的差距拉回来。

我们的OJ非常友好,难度属于胎教级别,用例错误还会告诉你是哪个错误,虽然不能像leetcode那样告诉你用例的内容和你的结果,但也比C语言的高不知道哪里去了。甚至你还可以拿partial的回答来问用例的数据。

你还有什么不敢写的呢?

OJ要怎么用,如何评分?

有两个OJ,一个在校内,在开课后启用,方便你们刷题并进行考试: 校内:http://172.16.163.31/ 校外:http://1.117.205.76/

校内的用户名是学号_姓名(例如:2100000001_庄体育),密码是你的学号。 两个OJ的题目是一样的,但数据不同。校外刷的数据建议你迁移到校内一份,有助于我们评判大家学习的进度和状况。做题用的OJ到时会公布。

你们应该完成所有Low的题目。对于想考80+或者90以上的同学,建议你要完成Mid High留给那些想要挑战的同学,这些题目除了需要对书本知识掌握足够扎实,还需要一些更高层次的编码能力(例如:合理规划函数,正确debug等等)。

如你所见OJ有排行榜,不过这个分数不计入总分(也不会计入平时分,我们有其他的手段),然而追求高排名显然是个令人愉悦(头秃)的过程,能在图表上出现的童鞋需要进入前10。以去年的数据为例,有6位同学刷满了77道题目,1位同学76屈居第7,剩下的三位同学分别少刷了4、4、6道题。请以此为目标努力。和C语言OJ不同的是,这个OJ设计出来就是为了让所有人都可以刷完的,你有足够的能力刷完所有题目,这里的题目难度都不算特别高

每次实验课,我们都会出三道题目来在线考核,你需要在两节课的时间内完成这些题目,每道题目100分共300分。这部分分数计入总分,初步预计是占30%~40%。这三道题有可能是原题,也有可能是新题目,请注意。我们很不讲道理地要求三个班的实验课都排在同一个时间段,就是为了可以同时进行考核。

我不行,我需要帮助!

要学会如何求助。

请允许我引用一下别像弱智一样提问open in new window里图来演示一下你在提问之前,应该做什么:

如你所见,在提问之前你至少有四个可能的选择,不要一遇到问题就到处求人,这不仅是为了节约大佬和老师的时间,他们有的可能在为最后一道OJ题目掉头发,有些可能在为礼拜如何出一道即让你们头疼,又不至于让你们窒息的题目而掉头发。更重要的是,你剥夺了自己锻炼的机会。相信这点在网页设计上已经体现得非常明显了。

如果你不得不求助大佬,请自己阅读下面的这篇名著,他出现的时间可能在你出生之前:提问的智慧(How to Ask Questions The Smart Way)open in new window

如果可能,我还是建议你自己解决问题,自己解决问题带来的提高是其他任何方式所无法替代的。这种提高既有技术上的,也有精神上的(例如,你的自信)。面对困难,你选择退缩,那你下次也可能继续退缩。如果你选择迎难而上,说不定你会发现,其实也没那么难。关键是你必须跨出第一步。

这里不得不提一下在网上搜索资料的技巧。很多同学会觉得在baidu中搜索令他心力交瘁,我承认这是对的,因为我也常常心力交瘁,所以停止使用baidu进行技术搜索,你可以选择bing,或者这里open in new window

其次,不要在中文的舒适圈里摆烂,扩大到英语站点。事实上你对比下bing的国内和国外搜索,就能发现两者的区别。没有谁一开始就能流利阅读英语,人都是逼出来的。

另外,纸质出版物(包括pdf)通常比在线资源更严谨,建议准备一两本参考书。

其他在线资源

如果你觉得本课程的老师讲得很烂,你可以看浙大陈越姥姥的在线课程。国家精品课程的水平就是不一样的,非常棒,强烈推荐:浙大陈越姥姥的在线课程open in new window

但我必须强调,好的课程无法替代编写代码的训练。请牢记这点。

此外这里有一个可视化的网站,有利于你动态地理解数据结构: 数据结构图形化展示open in new window

我必须再次强调,上面的两个,最多只能达到脑袋会了这点(而且需要你付出努力)。要达到手会的境界,编码是绕不过的。

如果OJ已经满足不了你的水平,那么leetcodeopen in new window洛谷open in new window可以进一步提高你的数据结构和算法水平。这两个站点都是非常著名的站点,不需要我多做介绍。leetcodeopen in new window偏基础一些,是面向计算机方向求职者的。而洛谷open in new window的难度较高,是面向OIer和ACMer的,你可以只选择做其中较简单的部分。

最后是我个人的一点私货,不是必选项,我建议你们上本课程的时候,用gcc+make来跑你们的代码,用gdb来调试,并且可以开始习惯在linux下工作。你可以参考这个著名的教程: 计算机教育中缺失的一课open in new window,这里使用的工具都是工作环境中经常使用的,提前熟悉他们不仅可以早早打下基础,实际上也会大大提升你的工作效率。


  1. https://nju-projectn.github.io/ics-pa-gitbook/ics2022/ ↩︎