选课类别:课内实验 | 教学语言:英文 |
课程类别:专业选修课 | 开课单位:计算机科学与工程系 |
课程层次:未知 | 获得学分:3.0 |
Project报告写了7万字,187页,还有近百次实验。我在南科大上过的最开心、最有收获的一门课。
这门课看似是在讲C/C++,其实我认为是在讲计算机系统。C/C++是一门底层语言,因此势必和内存、体系结构、编译、操作系统有些关联。因此在学的时候,如果我们只关注它的语法,抱着来学单片机编程等语言心态的话,这门课可能还是要求太高了。看到今年改名为计算机高级程序设计,感觉还是有点道理。
占课程大部分时光的5个Project,可以从系统的角度来理解。表面上我们在设计一个计算器,但是其实我们写程序的时候,可以感受到,C程序是一个底层、细粒度的语言;Java与C的对比,其实就是在告诉我们,C是一门更底层的语言,进而让我们明白,什么程序适合用C;SGEMM让我们接触到SIMD、循环展开等操作,让我们看到,C的底层所带来的加速,与其构建的庞大的系统库;矩阵类的设计,让我们看到在这样的系统库中,如何调度、协调各种组件,如何在保持高效的同时做出系统;CUDA让我们看到,这些年来,GPU的兴起让这门古老的语言依旧充满活力。
5个Project的设计,也是从系统设计、系统优化、系统应用这个思路去设计的,在明白这一点之后,自然就明白自己应该在Project里做什么了。
由于C/C++里边有很多和底层非常接近的优化,我顺着看完了《计算机体系结构:量化研究方法》。这本书虽然有600页,但是大部分都是像讲睡前故事一样,认真看可以收获很多知识。另一本适合这门课的书是《深入理解计算机系统》(CSAPP),里边的练习更丰富、细致,碍于时间只看了100来页,但是我推荐选课的朋友优先看这本书。关于Project中并行计算的部分,我看的是台湾清华大学周志华老师的平行程式,讲了体系结构的基础概念,MPI和OpenMP,分布式计算的一些算法,还有CUDA Programming,讲的非常精彩。
在Project上我花了很多精力,去读了Postgresql、OpenBLAS、OpenCV、NCCL的部分代码,看了大概几十篇好玩的文章,然后去尝试写自己的实验和代码。老师评价有些地方有点流水账,我没有很好地组织好语言,因为可能时间确实有点不太够。大部分实验和做出的图表,比如测10组数据,我至少会失败3、4次。更多时候是跑完数据了,发现不严谨,我又重测。尤其是Project 2 我跟着 Intel 的一篇论文做的结果复现与比对,磨了一个周末。当时早上4点,我想,跑不出来就算了,反正已经很精彩了。结果最后那一次,突然发现bug在哪里了,终于跑通,分析。这样的事情发生了太多次,基本是失败——找原因——继续失败——找原因的过程。
没有探索时的那一丝好奇,或许我早已放弃。但是,每次我做Project时,都非常快乐,充满激情,跟《在路上》那样说的那么疯狂。总是觉得,这方面我不知道,我还想看看,那方面我也想学学。我从来不会想着老师要求我做什么,Project到多少是90分,而是我想我应该学什么,我还有哪些问题我没有得到解答,那我就展示我所了解到的内容。在知识探索中,逐渐发现自己的兴趣,逐渐觉得,系统很有趣,很好玩,是可以一直看博客、看文章、看书的地方。
期末考更多会在PPT上内容,所以要好好复习。不过,从选了这门课开始,我个人就不是很在乎成绩,对于我而言,我已经获得了我想要的东西。怕大家说我卷,我期末就不咋地,拿个B吧(笑)。
这门课的工作,我至今在学习、比赛、科研都受益无穷,现在手里的研究很多都是那时候搭起来的。
欢迎大家来我的github给个小star:
https://github.com/HaibinLai/CS205-CPP-Programing-Project
我也把报告丢在我的博客里:
https://www.haibinlaiblog.top/index.php/sustech-cs205-cpp-programing
先说老师。于仕琪老师讲课的风格很棒,是个很有趣的人,平时在群里也会有比较有意思的互动。讲课时经常通过现场演示bug和debug,用比较刁钻的语法(自己为了避免歧义/错误一般不会那么写的那种)展示这门语言的特性,真正做到了让台下学生学得越多,不懂的越多(褒义),PPT和随堂样例代码非常完善,详情可以访问这个仓库:https://github.com/ShiqiYu/CPP,在bilibili也可以找到于老师的频道,那里有录制好的C/C++课程,和课程主线内容一致。在GitHub上也有许多历届同学的优秀project,可以参考但请对自己负责。
再说课程内容。第一周一般是劝退课,虽说是hello world但是拓展讲了很多周边知识,劝退效果极佳。这门课的内容其实更适合已经对C/C++有一定使用经历的同学上,因为进度会相对比较快,简单的部分转瞬即逝。于老师对C/C++的指针和内存管理等特性有着深刻的认识,讲得非常清楚。对于计算机系以外的朋友,个人建议抱着一颗真正想要学好C/C++的心来学习并且做好心理准备,或是避开这门课程。
再说project。一学期五个单人project,占比65%,可以说是这门课程的灵魂所在:) 于老师表示project给分都是凭感觉给,但做得好的给分不会差,同时也说明这门课存在严重的内卷情况,你的分数是可能受到其他人的完成情况影响的,所以外系的朋友请三思而后选,计系的朋友请给同行和外系的朋友留条活路,做人不用做那么绝。project平均分和中位数每次会公布,大概就是八十五附近的样子,所以这门课要拿A-及以上其实相当有难度。如果希望了解project,也可以去上面的仓库里看看,有项目要求和往期优秀项目展示。
最后说考试。每节课有随堂quiz,占5%,quiz取n-1次得分最好的计分。没有期中考试,25%是期末考试。期末考试挺有意思,时间不赶但考得很全面,最后一题小型手写project可以说是认真完成project后就是送分,但project摸鱼的话就相当有难度的一题,祝君好运。
官方推荐环境是vscode+wsl2,这学期还给每个同学发了一块eaidk-310开发板用于project跨平台的实现。
后面想起来有什么要说的再补吧,有疑问也可以回复我/
by 咕桃 2023.1.16
最新战报(来自QQ群2024Spring CS205 C/C++ (non-official)):
2023 vs 2024
- Quiz : 82.9vs81.3
两年题目完全相同,但分数出现了下降,说明基础知识点的掌握没有提升。- Project: 78.8vs80.1
解读:在ChatGPT和Copilot帮助下,非常低质量的报告和代码变少,平均分上升。我评阅报告和代码时,从Project1到Project5,明显感受到ChatGPT的气息越来越重,但我并未针对ChatGPT扣分。- Final exam: 66.0vs61.0 (期末考试难度相当)
解读:在试卷批阅中,我明显感觉到基础知识点掌握的薄弱,关键知识点的掌握的不如往年。实事求是的说,真正理解和掌握指针和内存的同学,不超过10%。这个学期的成绩变化非常有特点:我教这门课4年,前3年成绩逐年上升,今年成绩第一次出现下滑。在ChatGPT的帮助下,学生做作业的效率大大提升,花的时间和精力少了,但知识不会自动跑到脑子里。ChatGPT生成的代码和报告,掩盖了知识盲区。
当然,我没有针对ChatGPT的带来的变化,及时调整考核方式,是主要原因。
本人为非计算机系的工科学生,能力中等,计算机先修CS112 Python程序设计基础,无任何c/c++基础,本学期被计系同学诓骗学习于仕琪老师的C++,虽然先前有所耳闻,但还是没能避免绩点悲剧。
总体而言,很难吧,特别是刚刚开始的时候,非常痛苦,主要是教学内容量比较大,外加上本人一点不熟悉c/c++,想必如果没有gpt的话,我大抵是已经退课了。每节课最后都有计分的签到quiz,lab有练习题,难度也比较大,曾经在lab课上写到崩溃过。
但是于老师确实讲得的确很好,上课认真负责,内容颇有调理,把c/c++最重要的内存管理与类都讲得非常清晰。和学习c语言程序基础的同学交流以后发现于老师的确讲了很多内容,当然学生有没有接受到又是另一回事了。
但是于老师也很会搞学生心态,模糊打分只是一小部分,常常遇到花三周构思的项目被低分打回,原因是程序运行效率不加,参数传递不够谨慎等等。若是不能理解于老师对项目的深层次要求,那么分数必然是非常惨淡(80左右乃至以下)。于老师支持使用GPT,但是后果自负。
最后如果有同学和我条件类似(非计系专业中位数水平),那么我并不推荐非得攻克名为yu++的大山,其实本课程是开源在GitHub和bilibili上面的,所以如果单纯只是因为如单片机,嵌入式开发等目的学c/c++的话,于老师的网课会是不错的选择。如果对多线程加速,CUDA等感兴趣的话…,可以考虑尝试,但最好同一学期其他课程难度不要太大。
参考难度:两个半的信号与系统
这学期(2023秋)当了一学期郑老师的CPP助教,感受到了课程间的质量差距,再加上前几天于老师这门课申遗了,推荐一下想学CPP的同学下学期选计系精品课于++。
于仕琪:深圳市推动“全市高校课程互选、学分互认”,我报了名。2024年春季学期,以这个内容为基础的南科大课程“C/C++程序设计”会向深圳高校学生开放选课,到南科大教室里上课。欢迎选课。
于老师的上课思路挺贴合计系学生:先讲语言特性,然后表演一下怎么写bug,然后再讲产生的原因,最后讲如何避免/解决方案。如果上课的时候听的比较认真的话,应该能避免入门C/CPP大多数的坑(
再讲讲project,于老师非常喜欢矩阵/计算相关的东西,一度让我怀疑他的xp是不是矩阵。project难度在线,内容有趣,如果好好按着要求写能学到不少东西,给分也会相对美丽。
考试的话客观题主要是看有没有复习quiz做的东西,大部分都是里面的内容。主观题如果project好好写的话不难。
最后讲讲总评,主要扣分的地方还是project,最后总评一般来说会比project均分高点。
总之总之欢迎真的想学的同学选于老师的C/C++,如果只是想轻松飘过还是等秋季学期选zf的吧(
答:问就是计系刘德华——于仕琪。难度个人感觉比javaA甚至还低些(最主要我javaA纯自学,太痛苦了,c++我好歹听着课按着老师大纲来,而且学过java有些基础了)。
先说结论,于老师的课给分好,收获多,泛用性强,总体属于超大杯。
下次还填非常简单
这门课的内容主要涵盖了 C 语言基础、C++ 基础(主要是 C++11 以及之前,含模板、智能指针、RTTI、异常等内容)、Cmake 项目管理、性能优化、CUDA编程(新增的)。据 ysq 的发言以后还可能有 rust 相关内容。虽然通常称这门课为 Cpp,但是 C 语言在这门课实际上也占有相当大的比重,你可能会写半学期的 C,才能见到第一个 Cpp 项目。
这门课的优点其他人都说得差不多了,但是给分不好的缺点也劝退了很多人。因此这里讲解一下,如何在这门课中取得一个不错的分数。
低分主要源自于这门课的精髓: 5 个没有评分标准的 proj ,占据 65% 的分数。项目要求通常伪装得非常简单,只有寥寥几行,比如“实现一个计算器”或者“尝试优化一个矩阵乘法”,但是你实际需要做的会比它多得多。
根据观察,项目评分会综合考虑你的报告内容、代码质量、工作量,一个满足所有要求的项目只能获得 80 分(也基本是平均分),因此你需要重点展示你额外做了哪些内容。老师未必会运行你的代码,所以你一定要在报告中充分展示你实现的东西,即使是没有出现在最终代码里的尝试或者解决问题的过程也都可以写进去,不要花大量时间写代码然后在报告里一笔带过,写十几页甚至几十页都是正常情况。
工作量足够的项目基本都能拿到 85-90 pts. 更高的分数则要看代码实现的质量,比如代码和注释风格、实现的效率和安全性、报告是否清楚明白等。这部分只靠课上的东西是完不成的,不过于老师的项目都比较常见,你可以在网上找到大量的资料来帮助你完成。老师对糟糕实现的容忍度很差,比如循环内多余的边界检查、可以简化的多重循环、多余的结构体成员、甚至是可读性差的报告等,都可能成为扣分项并被挂在 ppt 上拷打。打磨好这些细节,拿到 95pts 以上并不困难。
由于工作量决定分数,请不要拖到接近 ddl 再开始项目,一定来不及。另外,使用 ChatGPT 不会影响你的分数,但是你需要自己把关 GPT 产出内容的质量,它不一定能达到及格线。
quiz 和 lab 共占 10%, 都是取 n-1 次最高分,容易拿满。期末考试占 25%,平均分60左右,覆盖很全面但是难度还好,并不比 quiz 难多少,最后的写程序题如果 proj 都认真写了那基本就是白给。
5 个 proj 如果要保证高分,每一个都需要占据大量的时间,这在其他任务比较重的时间段(尤其是期末周)几乎是不可接受的,因此选课前请斟酌其他课程的任务量,以决定是否选课。如果你真的认真做了,不仅能在这一门课收获不错的分数,也能大幅提升你的代码能力和编程理解,这些收获可能还要高于你在课堂上学到的东西,它们一定对得起你付出的时间。
内容包括C++常用语法以及特性,尤其是指针和内存管理等。老师讲得很细致也很清楚,干货很多。听网课、做Lab,按部就班认真学就行了,学习曲线并不陡峭。但期末考试很难(均分61),无样卷,做好心理准备。
总而言之,这门课程project的精髓是:在半开放性项目、主观性评分、高强度同学竞争压分的多重外部高压之下,驱使学生提高自学能力。这是一个提高你的自学能力和效率的好机会。楼主大一,除了JavaA外没有什么编程基础,做前面几个项目时错误地把大量时间花费在自己埋头写代码上,结果往往是效率低下,事倍功半,得分与付出完全不匹配;后来逐渐认识到自学的重要性,通过网上找到的若干大学的课程slides、大神写的blog以及相关书籍进行学习与模仿,不仅学到了更多有趣的知识,加深了理解,得分也更加理想。
这门课程的总评平均分大约在77;你的最终成绩,和你在这门课上付出的时间,的比值将是很低的。适合想要通过外部高压来加强自身自学能力的同学选择。
属实是我在南科大上过最有用的课之一。ysq老师讲课内容也非常深入浅出,还会水群。给分一般,但是真的有用。
本人之前没有c或c++基础,本来只是想选这门课学一下语言的,结果绩点爆炸了。
于老师上课讲的很清楚、很全面,每个c和c++所有重要的部分都有所概括,每个知识点老师都会给相应的例子和反例,上课是一边讲解一边讲示例进行的,只要认真听都能听懂。
给分方面十分恐怖,这也是我给的评分比较低的原因。课程65%的评分来自project,一共5个project,一个project占13%。每个project的介绍页面都很简单明了,换句话说是介绍的很模糊。于老师不会给出具体的给分点,之后在project上介绍你应该实现哪些功能。对于project的评分,很大部分都取决于于老师的心情。于老师会因为project 的 report不够美观或者某个方法的实现他觉得不够满意等理由进行扣分,5个project的平均分都在80分左右。然后还有25%来自期末考试以及5%来自每节课都会有的quiz。期末考试的题很难,于老师会抓住知识点里的一些偏僻的情况或者极易混淆的情况进行出题,想要得高分必须足够细心且对各个知识点都有深入了解。
总结:不建议像我这样之前没有基础,且只是抱着学习c语言心态的学生选修这门课。如果硬要选的话建议做好绩点爆炸或者投入大量时间的准备。只是想学c语言的话可以看看于老师的网课。
老师讲的很好,上课也会结合具体代码来进行授课,平时问问题也解释的很详细,邮件也回得勤,每节课后都有quiz来帮你巩固知识。唯一就是,project没标准,所以不知道卷到什么程度停,想拿高分也挺难的,每次project分数中位数在80-85之间