选课类别:计划内与自由选修 | 教学类型:理论实验课 |
课程类别:本科计划内课程 | 开课单位:计算机科学与技术系 |
课程层次:专业基础 | 学分:4.0 |
本课程作为计算机科学技术专业的入门课程,采取自底向上的教学模式,跨系统地介绍计算机系统的核心概念和设计思想。从介绍计算机系统的底层基础知识开始,逐步上升到操作系统和高级语言程序的接口层,将软件和硬件联系起来,阐述从问题描述到算出结果的七个层次的转换过程:从问题到算法的转换、从算法到高级语言程序的转换、从高级语言程序到(用指令集结构描述的)机器语言程序的转换、从指令集结构到微结构的转换、从微结构到逻辑电路的转换、从逻辑电路到晶体管器件的转换。主要讲授内容包括:从MOS晶体管开始,依次介绍逻辑门、锁存器、各种逻辑结构的设计;然后围绕一个简单的计算机设计LC-3,依次介绍冯?诺伊曼计算机系统模型、指令系统设计、汇编语言程序设计和微结构设计,为初学者建立起对计算机系统的完整认识。在此基础上,介绍汇编语言程序设计、物理设备的输入和输出机制、操作系统的陷入机制和子程序调用和返回机制、以及栈和数据转换的原理和机制。
安虹老师的《计算机系统概论(H)》课程旨在从硬件层次探讨计算机的构建,涉及从逻辑电路到汇编语言等多层次内容。总体而言,课程内容较为概况,覆盖了包括逻辑电路、机器语言、汇编语言在内的多个方面。这门课通过由浅入深的结构设计,展示计算机系统从基础晶体管抽象到运转层面,是一种从底层硬件逐步向上构建的学习体验。然而,部分评课者认为课程内容重复其他必修课程,如数字电路和计算机组成原理,缺乏深入且总体关联不大的内容。
课程考试为期中、期末两次,分别占总成绩的10%和20%到25%不等,皆采用全英文试题。虽题量较大,但没有特别深奥的概念,考核内容以理解授课与阅读材料为基础。实验与作业是课程的一大核心,占总分高达50%左右,作业按时提交可得分,而实验报告和代码质量则可能显著影响成绩。每周的实验,尤其是汇编语言项目,如LC-3相关的任务被视为挑战性较高的科目。
不同于课程的有限独创性,安虹老师以其贴心的教学态度受到许多好评,同学们普遍认为老师对课堂管理和知识传递尽职尽责。这一课程还安排了一系列与业内专业人士的访谈和专题讨论,对拓宽学生视野有积极贡献。然而,部分学生反映助教在反馈和沟通中较慢而且不够详细,影响了学习体验。
学生意见对给分参差不齐,部分反映在评测标准上出现过突如其来的调整,让一些学生感到不满。此外,有小部分人指出,课程讨论课配置不足,喜爱挑战的同学可能会觉得内涵略显重复。而优秀率近50%的说法表明,课堂整体给分相对友善,认真完成实验和作业可达较高成绩。
尽管在目标与执行分配上不甚理想,对部分更高年级计算机课程学生帮助有限,但对于早期打基础的同学而言仍具启发性。从完整的学习路径考虑,该课程帮助理解计算机底层原理并不无用。对于非计算系学生或对硬件底层构建持有兴趣者,可选择此课以加深计算机系统基础的理解。
长文预警。本文还在更新,欢迎大家持续关注。
文章论点:这门课没有在前几课说的那么重要,相反在当前CS培养方案下可有可无。理由如下:内容上,这门课只是中科大CS大二必修课中数字电路和计算机组成原理的精简版,没有覆盖计算机系统结构的全貌,删去后也不会影响任何课程的学习。思想上,没有训练到计算思维。课程主旨中的level of abstraction在实验中没有体现。课程教材作者在UTexas开的课是给EE系(在中科大可以对应为6系)学生上的,并不在UTexas CS系的培养方案中,而CS和EE在系统栈是不同的。
建设性意见:我们也没有能力去改变培养方案。我只能给一些自学CS上的建议吧。入门CS推荐Berkeley的CS61系列。CS61A和CS61B分别介绍了如何将问题进行程序抽象和数据抽象,CS61C介绍了机器提供了什么抽象。注意:课程实验才是精华,请务必要做!不过CS61系列有一个缺点就是实验间不成体系。因此刷了CS61后,强烈推荐Stanford的计算机网络CS144。这门课的实验通过搭建不同的模块实现TCP协议,每个模块给的Specification ,模块间的Abstraction以及一些Implementation的细节说明得非常详细,模块也给了足够的单元测试,可以真正感受到优秀的系统是怎么搭建起来的。至于这门课,目前也已经是CS必修课了,只能在个人层面上建议大一就选课,就当适应国际优秀课程思维的过渡课程。其他网友总结的推荐课程:
https://conanhujinming.github.io/comments-for-awesome-courses/index.html
利益相关:17级计算机系本科生,本门课在没有卷bonus的情况下拿了4.0。目前做计算机系统的研究。今天来给这门课和妮可本科CS培养泼一盆冷水。
之所以这门课给低分,不是因为老师和助教的教学态度,相反,老师和助教都很用心,尤其是小邓学长,为我们精心设计了实验;也不是因为授课质量的问题,相反,这门课是本科前3个学期唯一能在形式上和世界一流大学接轨的CS课程。原因在于不合理的培养方案和授课内容。在广度上,同样的课时授课内容只有其他高校类似课程的一半,且多局限于数字电路和计算机组成原理,从计算机系培养方案中删去后不影响其他专业课的学习。在深度上,所谓的计算思维,abstraction相关能力也没有得到深刻培养。这是我本科阶段中预期收获和实际收获落差最大的一门课。至少我没见过前几节课一直反复强调这门课有多么重要多么优秀的课程,否则我也不会给低分。
我们来看看这门课程的名字《计算机系统概论》,有人就觉得这门课是计算机系统的导论课,为后续学习做铺垫的。可是这门课完全没有起到概论的作用。计算机系统不仅包括体系结构,还包括操作系统、编程语言、计算机网络、数据库系统、分布式系统和计算机安全等。当然,数据库系统、分布式系统更偏应用,很多原理性的思想来自于操作系统、编程语言和计算机网络,计算机安全也需要就具体的系统分析。因此《计算机系统概论》应该要覆盖体系结构、操作系统、编程语言和计算机网络的基本思想。可就实际的授课内容,正如 @nofear 和 @liuly 同学所言,计算机组成原理和数字电路中的内容完全可以覆盖这门课绝大多数内容。除此之外,@topusername 和 @SproutH 同学提到,这门课放在大二秋季学期学习,与数字电路同步,地位比较尴尬,降低了课程意义。我也赞同 @OREO 同学的观点,这门课可以帮助外系的同学了解计算机的最简单的硬件组成,但是给CS科班学生实在不是非常的有用,反而会占用大量时间。在17级及以前的培养方案中,模拟与数字电路、计算机组成原理、微机原理与系统B、计算机体系结构。这些课程完全能让大家学会如何造计算机from scratch。再加上这门课,体系结构学分比重实在过大,对比其他计算机领域课程学分和可怜的编程实践,显然是不平衡的。
那好,既然计算机组成原理和数字电路中的内容完全可以覆盖这门课,那么能从这上面能提炼出更深刻的思想和见解,那这门课也是有价值的。很可惜,绪论中在组成原理提过的von Neumann架构等都在组成原理里介绍。当然,这门课也有一个贯穿始终的思想level of abstraction。安虹老师也对那张从物理到应用的level of abstraction那张图说,这门课上完后什么都可以忘,除了这张图。正如李博杰学长 @boj 总结的一样,这门课介绍了从门电路到处理器,硬件给我们提供了怎样的接口和抽象。但是这门课给了我们这样的训练了吗?恐怕是没有。实验都是用汇编语言甚至是机器码写程序,优化指令执行时间和指令条数来进行记分搞军备竞赛。写满屏的jump和r1,r2命名的寄存器来写复杂的应用程序训练abstraction思维?这无非是更折磨人版本的程序设计罢了,很难从中学会减低真正系统的复杂性的方法。
这一点上看,数字电路和组成原理的Verilog实验才是训练abstraction思维的担当。前面一个实验用门电路搭造简单的可以被复用的mux等电路,经过了简单的测试证明在所有情况下都可用。等到要写register file和ALU等复杂模块,发现有些需要的功能和mux类似,我们完全可以放心地调用mux模块搭造。而时序逻辑比较复杂,状态机只写状态转移函数,其他数据千万不要在状态机模块里写,需要从状态推导出的数据调用状态机即可。这样只写简单部件,通过模块之间的组合构成复杂系统,这样的利用abstraction的Verilog代码绝对是最不容易出问题的。而不利用abstraction的Verilog代码出现bug很可能需要调半天(尤其是喜欢复制粘贴代码然后稍作修改的同学,很容易就忘记修改某一个地方)。这训练效果不就上来了吗。反观这门课,为了优化代码,我们不得不放弃一些便于我们思考的特性,如函数调用,甚至染上复制粘贴的坏习惯。大家可以看看CP-Miner这篇论文,有多少bug因为随意的复制粘贴代码而导致的。或许这门课实验的目的是为了体会逆abstraction思维的坏处,比如为什么不要用goto语句,细品图灵奖得主Dijkstra的Go-To Statement Considered Harmful吧。笑。
另外,我听说之后可能会开一门《计算系统概论B》给全校通修,具体授课会和这门课有偏差,暂不做评论。如果说全校通修的《计算机程序设计》能让学生学会如何把重复机械的工作交给计算机自动化,那么《计算系统概论》也应该让非计算机系学生理解如何分解复杂的问题使其简单化。如果《计算系统概论》实验没有达到这个目标,那还是一门平庸的课。如果反而让简单问题变得十分繁琐,那么我相信非计算机系同学看待这门课,就像非实验物理专业同学看待《大学物理实验》一样。
当然,如果这门课的内容是整个计算机系统的基础,那么提前学也是很有价值的。但事实恰恰相反。正因为系统的abstraction,无论是我们在实现OS的文件系统还是编译器的类型系统,都没有必要去考虑取指译码的数据通路。如果简单的编程需要考虑这些,恰恰是系统设计的失败。在考虑系统layer的某个特定问题时,通常只需要考虑上一个layer和下一个layer提供的abstraction即可。这才是真正的level of abstraction。并不是说知道怎么造计算机就能帮助解决计算机科学的所有问题。恕我再引用Dijkstra的话。
Computer science is no more about computers than astronomy is about telescopes, biology is about microscopes or chemistry is about beakers and test tubes. Science is not about tools. It is about how we use them, and what we find out when we do.
这门课中还提到了计算思维,引用了图灵奖得主Patterson的发言:在异构时代的程序员必须对于算法和硬件模型融会贯通。计算思维其实是由Jeannette M. Wing在2006年提出的。其中最显眼的一句话是:
Thinking like a computer scientist means more than being able to program a computer. It requires thinking at multiple levels of abstraction.
我认为Patterson实际的意思是要理解硬件提供的abstraction。举一个简单的例子,通常分析算法复杂度时,我们可以认为访问一次数据消耗的时间是一样的。但如果数据在硬盘中,我们必须以块的粒度访问数据,而且磁盘访问通常是系统的瓶颈。因此我们有了external memory algorithms,用访问磁盘块的I/O次数来衡量算法复杂度。著名的B+Tree和LSM-Tree就是典型的例子。同样,针对cache,我们也有cache-oblivious algorithms。非易失内存Persistent Memory出现后,我们的系统需要对性能做modeling (如论文 An Empirical Guide to the Behavior and Use of Scalable Persistent Memory),重新设计存储数据结构来利用它的性能 (如论文 ListDB: Union of Write-Ahead Logs and Persistent SkipLists for Incremental Checkpointing on Persistent Memory )。这些都不需要我们理解硬件的原理,只需要我们了解硬件的abstraction就能指导我们。这就是计算思维的魅力所在。
那么好,现在的培养方案达到Patterson所想的让学生掌握软硬件协同原理了吗?我想并没有。学的硬件课多并不代表能达到掌握这个原理,如果在同一水平层次上学习,仍然是无法达到进阶水平的。就大二学的硬件课《模拟与数字电路》《模拟与数字电路实验》《ics》《计算机组成原理》上来看,这些课的观点依旧停留在如何用构造电路执行程序这个层次。大二计算机系学生一直不断在这一层次上重复训练,给学生实际的编写程序的洞察相比投入的时间而言实在有点少。事实上,这种训练也达不到Patterson所说的懂硬件的层次。因为这些电路只是模型,了解ALU的工作原理并没有告诉你如何在软件层面上加速程序执行,也没有告诉你如何在硬件层面提供虚拟化和安全性。事实上,学习《计算机体系结构》才是软硬件协同的开始。比如利用Memory-Level Parallelism提出新的字典树数据结构Cuckoo Trie以及利用SIMD加速数据库。这些工作都不需要考虑硬件的底层原理。只要掌握一定的基础概念,任何人都可以进行进阶的学习。
这对于所有知识的学习都是一样的,很可惜这种事情一直在不断重演。最典型的例子是中科大不少学生对《吉米多维奇》和《电磁学千题解》类似的追捧。在大学学习中按部就班地跟着培养大纲走是有毒的,很多情况下只有进阶学习才能发现哪些基础是最重要的。在教学上典型的例子是《线性代数》,训练计算各种奇怪矩阵行列式的小技巧反而会让人忽视理解线性空间这个重要概念,导致后续学习机器学习和量子力学等课程时吃力。除此之外,低效的重复训练所带来的反而是厌恶,比如《微机原理与系统B》这门硬件课改为选修后,22年的课已经因选课人数过少而停开了。
我们再来重新审视一下实验。有一次实验要求优化汇编代码行数,有一次实验要求优化执行指令数。在汇编语言上优化应用代码确实是一个很hacker的行为。但这是正统的计算机系统学习方法吗?我觉得并不是。图灵奖得主Alan Kay 在 Normal Consider Harmful 提到一个他非常重要的观点“A point of view worth more than 80 IQ points”。他举了三个例子,达芬奇有很高的IQ,在他的时代构想了很多发明,但缺少足够的知识,达芬奇却不能够实现自己的发明。福特出生在合适的年代,那个年代积累了足够知识,得以大规模制造出汽车改变了人们的交通方式。而牛顿的微积分方法给我们一个outlook,只需用几个简单的定律就能描述物理世界,好像多了一个大脑,使得我们能更快地去掌握知识。这让现在的普通人就可以造出牛顿时代之前的最聪明的人都不可想象的事。Alan Kay也继续提到(36:35)
I believe one of the biggest problems with computing is, in a sense, we have too many smart people. It attracts cleverness and you can do clever hacks but the clever hacks don’t scale well.
我不否认中科大里聪明人很多,这点实验的复杂度不在话下。但是现实系统的复杂度已经到了聪明人也承受不了的程度。分布式一致性协议Raft的作者提及Paxos时指出
We struggled with Paxos ourselves; we were not able to understand the complete protocol until after reading several simplified explanations and designing our own alternative protocol, a process that took almost a year.
也就是说,一个Stanford的博士生理解一个现有问题的解决方案都要花一年。请问我们能指望世界上有多少聪明人帮助我们解决这么多复杂的问题呢?那么我们的CS有outlook使得我们可以方便的进行开发吗?有的,那就是通过specification和abstraction。specification是为了帮助程序更容易理解而做的约定,我们在实现时只需保证程序在约定的状态下执行。abstraction可以帮助我们找到最通用的,specification最简单的系统行为,我们先实现这些通用的系统行为,在此基础上就可以构建出更容易理解的系统。有兴趣的同学可以看看2020年图灵奖得主Alfred Aho和Jeffrey Ullman的Turing Lecture:Abstractions, their algorithms, and their compilers。
举一个简单的例子。在学习数据结构中,我们发现很多系统都要求取出当前集合最小元素的操作。比如,构建Huffman树需要找到当前频率最小的两个node,再加入一个新node,node数量最多为511。使用Dijkstra算法计算最短路径时,需要取出当前权最小的node,再更新其邻居,node数量最多为|V|。我们可以根据这个特性构建一个指定初始容量的优先队列。提供update(node, weight)和poll()两种操作。函数update的specification是改变元素node的权值weight。函数poll的specification是删除优先队列表示的集合中权值最小的元素,并返回给应用程序。这样一来,我们就构建了一个通用问题的abstraction。它的好处有三点。首先,只要有类似的问题满足指定的specification,就可以使用实现这个specification的系统,降低了我们的工作量。第二,提供abstraction构造出简单的specification非常容易进行测试,检验它的正确性。第三,具体的实现和specification是解耦的,也就是说我们可以有多个系统满足这个specification,在其中挑选任一系统,对使用这个系统的程序都没有影响。比如,优先队列的实现可以用时间复杂度为O(n)的方法遍历查找权值最小的元素,也可以使用复杂度为O(logn)的最小堆。如果我们在实现Dijkstra算法时发现O(n)复杂度的实现对于规模很大的图比较慢时,可以直接替换成O(logn)的实现,不需要改变最短路径的程序。
诚然,体系结构系统中一些问题确实对上层有影响。比如引入乱序执行,会使得我们在多处理器编程中需要考虑memory ordering,会引发meltdown安全漏洞。可惜这个课不仅没有解释这些进阶的问题,连C语言一些fallacies and pitfalls也没能很好地解释。这是上完其他高校的计算机系统入门课都能理解的问题,如https://nju-projectn.github.io/ics-pa-gitbook/ics2021/why.html。我会在下一段说明。
当然,正如 @Dune 同学所言,其他国内外知名高校CS专业都有名为ics的课程。那就让我们看看其他高校都在学什么。大多数高校都采用CMU的CSAPP作为参考教材,而这门课的内容只涵盖了CSAPP中PART I: Program Structure and Execution中2~4章的简单内容和其他的零散的一部分内容。而据我所知,大多数高校如上海交大等都能把CSAPP的12章内容讲8章以上。其他没有以CSAPP为主线的ics课程也各有特色。而我们的课程内容只能覆盖伯克利入门课CS61C近30讲中的不到10讲。再来看看国内高校南京大学的ics。不仅广度更广,还真正阐明了抽象思维,通过reading the f**king source code的方式,让学生获得了处理大型项目的能力,这才是系统编程真正需要的能力。授课内容少导致比较明显的体现就是上课节奏太慢,如 @什么昵称 同学所说,一个指令能讲半个小时。
可能有些同学还有疑问,大名鼎鼎的Yale Patt教授在UTexas 就是这样上课的。这个评论是说他上课不好吗?并不是。细心的朋友可能从网站上发现Dijkstra和Patt都在UTexas任职。Patt开的课是 EE 306 - Introduction to Computing Systems,不在UTexas CS系学生的培养方案中,而是给学电子工程的同学开设的,告诉那些学电路的同学怎么搭建通用的计算机,并在其上运行程序。这门课对于EE系还是相当优秀的课程。
UTexas CS系培养方案:https://catalog.utexas.edu/general-information/coursesatoz/c-s/
UTexas EE系培养方案:https://catalog.utexas.edu/general-information/coursesatoz/e-e/
但是,电子工程和计算机科学要做的事情是不同的。举一个简单的例子,LC3指令集默认程序从0x3000开始执行,现实中的很多指令集都是这样处理的,EE系用电路把计算机搭到这个地步就足够了。但是对于CS,故事才刚刚开始。既然是通用计算机,那就应该可以执行不同的程序。那么从一个程序切换到另一个程序执行时,我们是否需要把物理内存中0x3000开始的程序全部清除掉换成新的程序?不需要,我们可以用虚拟内存,假设每个程序指令都从虚拟地址的0x3000开始,但不同程序的虚拟地址可以映射到不同的物理地址上。这是这门课没有覆盖的,但确实是计算机系统的核心内容之一。所以,这门课只能覆盖第一个图中从电路到ISA的层次,没有达到“需要一门贯通课程,帮助学生从底层物理到高层应用,整体上理解计算机系统”的目的。
这里对Patt教授和安虹教授没有贬义的意思。这门课在2011年出现在国内确实让人眼前一亮,哪怕是EE系的课也确实值得国内CS系同学学习,这比国内一堆只在堆砌概念的课程不知道高到哪去了。十年前,科研上,计算机系统界顶级会议NSDI、PLDI、OSDI等鲜有中国大陆学者的身影。教学上,蒋炎岩博士在2009年在南京大学上操作系统课时还在写8086汇编,大学四年里没有人教profiler,trace。在这种背景下,能写出合格的系统就不错了,更别提跟上国际潮流。但是十年过去了,国内计算机系统学界进步有目共睹。我认为这门课已经不能算合格的CS系计算机系统入门课了。这里的批判不应该仅限于这门课,而是整个培养方案。我们应该思考为什么有很多同学觉得这门课能收获很大。
对于大多数同学而言,这门课是第一个可以称得上和国际接轨的课程,而且也没有偷跑学组成原理,所以很多同学收获很多。我看有些学弟学妹还提到这门课接触了linux,git,make,收获比较大。但这实际上是大一就应该学会的编程的正确方式,即使不是一开始就接触,大一第二学期的程序设计进阶课也该接触了,没接触的原因是前面课程设计偷懒。所以,我给这门课打低分的原因不是因为这门课差到极致了,而是因为这门课有很多的进步空间。如果我当年ics上课内容直接搬到当前中科大CS课程体系中,学弟学妹们还觉得这门课收获在科大CS培养方案算比较高的,妮可本科CS培养就真的不仅落后于国际一流名校,还彻底落后于其他华五高校了。
非常赞同前面几位同学的观点:
关于老师:安虹老师是我非常敬重的老师,但是不知道为什么感觉这一学期对待这门课程不像以前所说的那么用心。首先,花了太多时间将开头几章没有太多用处的东西,导致后期的实验太过紧张,只好减少到四次,最后一次实验的DDL还是考完期末考之后的那个周末 ;其次,有两到三次课都因为老师的出差而停上了,老师后来也没有补(虽然这个课没什么补的必要了。。。)
但怎么说,安虹老师毕竟还是我非常,非常敬重的老师之一。
关于助教:确实如同前面几位同学所说,这几个助教全程不知道在干些什么,期中考试的时候很多题目出的有问题,同学向助教反馈了以后助教大言不惭说没问题,快等到考试结束了又突然改条件,让人做得非常不爽。讨论课应该是其中两个助教轮流来听,有一个的助教感觉就十分不耐烦的样子,态度十分恶劣。基本上除了有一个助教长的比较帅以外,没有什么值得称赞的地方。
关于课程:本身课程不难,所以不会有什么学习的压力,甚至我感觉大部分重要的知识都不是老师上课讲到的,而是自己看书看到的,或者是做题时领悟到的。每周都有一次讨论课,安排的也十分不合理,每周都会有三四组同学讲同一个话题,到了第三组往往也就已经乏善可陈。实验确实是一大亮点,每次做完都有一股成就感。尤其是按原先的总评计算方式,大家都非常努力地在做实验。(原先的总评计算方法老师说是:期中*10%+期末*20%+实验*54%+讨论课和课堂表现*15%+签到*1%)。结课前还有汇编器和编译器两次实验有加分,似乎是各五分。但因为本人较菜就没做。
关于给分:期中考完全班哀鸿遍野,但考虑到期中只占10%,大家还是把大部分时间花在上了。期末结束我满心以为按照原先的计算方式不是优秀至少也有3.3,结果教务系统上先登了一次成绩,似乎是出错了,后来更改成绩的时候老师说总评计算方式改为(期中*25%+期末*45%+平时分*30%),其实我期末考的不是非常差(虽然也不是很好了),但好歹也有80+,但就因为期中是50+,所以总评自然不高。
其实老师怎么制定总评计算方式都可以,但是应该提前告诉学生。
而且我总是怀疑,是因为助教没有时间(或许是真的太忙了,或许是懒得看)去认真审视我们的实验代码和报告(毕竟我每次报告都写4000-6000字左右),所以就把平时分降到这么低。然而助教声称是因为我们到课率太低了所以改变总评计算方式(真是可笑之极,老师唯一统计到课率的方式是给大家一起拍张照,显然根据照片逐一排查谁来没来不现实)。
助教最后说优秀率还是有百分之五十以上,如果真的是这样的话,我估计优秀的人大部分都是做了加分实验加分加上去的,少部分可能是期末考得很好,期中也不是很差。
总之,这门课给我的感受就是,那些认真上课,到课,听课的人,反而最后不易拿到好成绩,反而是不怎么听课,但做了加分实验的人能拿到更高的成绩,可能是因为课本上的知识太简单的缘故,但我自己菜没能力用Python写编译器和汇编器怨谁呢?也许这就是H课程本身带有的特性吧。
最后说一句,我依然很敬重安虹老师,但是从这门课讲的内容来看,更多地应该当做一门公选课来帮助外系的同学了解计算机的最简单的硬件组成,开给计科英才班实在不是非常的有用,反而会占用大量时间。
关于上课:
安虹老师特别有情怀,对学生也很好www
ICS 这门课主要注重自底向上的构建一个小计算机(LC-3,Little Computer-3),大概逻辑如下:
门电路 => 触发器、记忆元件 => 状态机 => LC-3 CPU => 算数指令实现,控制指令实现 => 写汇编程序 => Calling Convention (=> C to Assembly && so on)
不过都是些比较基本的内容,和数字电路也多有重叠,加上安老师讲课比较慢,所以基本上课都去写别科作业了......我想我看的太快了
关于福利:
课程里面有三次报告:
(哇,安老师竟然和这么多人都有渊源...)
另外,每个人都送了一本《永恒的图灵》,夹着李向阳院长的赠语和安老师写的名字,感动.jpg
关于研讨课:
这个课在每周都有一个研讨的 topic,每个人在学期初自由分组,然后被 assign 一个 topic 来分享。
不过其实搞的有点水,感觉台上讲了台下也没什么积极性,大家也只是查个 Wikipedia 综合综合这样子...
和我想的研讨课有点差距.jpg
p.s. 讨论课要点名
关于作业:
都是一些课后习题 & 思考题,写完了过一阵会发布答案(可参见 http://acsa.ustc.edu.cn/ics/homework.html )
今年的给分应该是按时交作业就给分,详见下面 score 的公式。
关于实验:
我其实不知道去年的实验是什么样子的,但是听他们说很水...
今年的实验要求可以在 http://acsa.ustc.edu.cn/ics/lab.html 看到(截至 2019-06-25)
实验本身就是用 LC-3 Assembly 写几个小程序,不过今年的实验对于喜欢计算机的同学来说确实很有意思:
对于实验 1 和 2,分别按指令执行时间和指令条数来进行记分。实验是将源码、 object file 和设计报告发过去,助教来进行统一的测试(比如统一的数据集,类似 OJ)
对于实验 3 和 4,主要在体会不同的 ABI 之间的区别,设计简单的 ABI 以及 Tradeoff。
写 LC-3 CPU/汇编器/编译器 有加分。我写了一个简单的 LC-3 IR => Assembly 的东西,不知道加了几分.jpg
其实我个人认为小邓学长(本届助教之一)的实验设计是比较出色的。引入 Scoreboard 机制可以帮大家花费更多时间在优化程序,而不是优化报告上(毕竟程序没难度就只能用报告给分?),而且大家想到的优化方案也确实让我大开眼界owo(我还记得我压 ddl 改汇编 + 跑分 + 提交)
不过,小邓学长的实验比较要求动手能力(比如 example 给的都是 Linux 下的,第四个实验也需要 lcc ,而基本上只能在 Linux 下 make 然后用)。我因为高中就用了两年 Linux (自己瞎折腾),对这些工具和概念还算熟悉;如果之前没有接触过的话,确实需要下一番功夫。但是,这种努力我认为是值得并且必要的——学习计算机,应该有一套熟悉并且趁手的工具链来完成想实现的功能。
p.s.1 如果要测试自己程序的性能,建议学习一点 Shell 编程的知识,实现调用 lc3sim (长得跟 gdb 差不多)自动化测试 + 生成随机数据集;再加上 pyplotlib 生成散点图,炒鸡漂亮(自夸中)
p.s.2 其实 lc3sim 的 C 源码很好读,写法非常粗暴(除了用宏处理指令那里)。如果需要进行 Profiling 查找热点代码不妨直接给 lc3sim 打补丁,不过我打了补丁最后也没来的及用
p.s.3 小邓学长把第五个实验咕掉了,不过实现了一个 LC-3 CTF (https://lc3ctf.co/),不过似乎现在也处于咕咕状态(
p.s.4 小邓学长 tql
p.s.5 有人要我写的破轮子可以戳我,我放上来
关于给分:
助教在群里给出的数据如下:
其中 score = (mid + final * 2) * 0.1 + (avg(lab[4]))*0.3 + 0.24*max(avg(lab[4]), (mid + final * 2)/3) + 0.15 * discuss + (hw == 6 ? 1 : 0) + extra_points_scaled。extra_points_scaled 由平时表现和课外作业给出,对于 99% 的同学∈[0,5],对于 89% 的同学严格为 0 (所以大抵是提交 CPU/汇编器/编译器之类的分数)
这门课拿了 4.3,感谢帮助我的小伙伴、老师和助教们www
夹带私货,不喜勿喷:
我觉得小邓学长作为助教是非常用心的,并且非常「喜欢计算机」,某种程度上有一些 hacker 的风采吧 www
上初中的时候觉得 Richard M. Stallman 非常 cool,所以我其实还是挺喜欢这种 geek 文化的。
我其实不是英才班的同学,选这个课是觉得这门课比较有意思,结果也确实很有意思(笑)
这门课有很多缺点,但是想到高达76的优秀率,这些都是小问题了。
一个一直以来都在探讨的问题是:学习ICS的不可替代性、必要性在哪里?这门课或者说这本书的初衷应该是作为程序员的第一门导论课,但时间上它并不是第一门,内容上前半段大量的是程设或者数电之类的课涉及到的内容,后半段却一头扎进了LC-3的深坑里做无用功。很明显,LC-3是简陋低效甚至不存在于现实世界的,没有任何实用意义。我大概能理解书的作者是以此为例初步总览指令集、数电设计、操作系统、汇编等内容,但课程却误入歧途,舍本逐末。
上面很多评论都在讨论这个问题,而在我们2023级这个问题尤为严重,是因为助教的出题风格更是在歧途上走了太远太远。比如,期中卷有LC-3机器码程序推断,通过加长程序长度、减少提供的信息、构建复杂的跳转结构甚至不惜用16进制写机器码来无谓地增加难度。再比如,期末卷有算周期数的问题,本来这是一件很简单的事,书上有很明确的状态图,但出题时却又要跟程序推断揉到一起,用周期数来反推指令。似乎我们应当成为一名LC-3大师而非初步了解计算机系统的计科学生。不过,助教很负责,除了出题风格之外我能给满分。
吐槽了这么多,我也该给一点学习建议,毕竟H课没得换,总得学。
首先是最后的两个大实验,LC-3汇编器和模拟器,助教提供的模板是C++版本,而且是高度“C++化”,即大量使用了类等功能,一眼就看出不是C。对于没有基础的人,虽说临时抱佛脚也来得及(比如我),但还是建议有时间自学一点C++。不仅如此,还要在Linux虚拟机上面跑,以及简单地用到Makefile。其实这些都不难,但是有所准备更好。
另外,实验的时间和分数的安排值得注意一下。上面提到的期末周附近实验扎堆,这一点很烦。两个大实验ddl大概率推到寒假,实测下来学期内至少把汇编器初步完成是合适的。评论区能找到不止一个学长的开源代码,不过大实验的真正难点其实在于每年新增的附加要求。还有一个问题没人提到过,就是大实验的分数占比其实和小实验是一样的,而且大实验给分很宽松。换句话说,爆肝一个星期半个月的“精美”汇编器对绩点的贡献可能还不如一次小实验的报告的完成度。
还有一个忠告值得反复强调:用第三版的英文原版!不要贪那个中译,第二版和第三版差别真的很大!甚至涉及到LC-3系统区的exception处理。另一个原因是考试作业课件都是英文,不要到考场上还不知道某个常见名词中文啥意思。
说了这么多,还是真心希望这门课能发挥真正的作用,同学们能学到东西。也许可以少讲点LC-3,可以讲点课本后半部分C的内核。也许可以用CSAPP替换ICS(?)
英才班必修课。
tip1:计算机院非英才班和外院若非对自己的时间精力水平(还有英语ORZ)有较大自信,选课之前千万慎重,不要想着什么“大家都学了”“这东西挺有用的”之类的就脑子热,四个学分拉了绩点你重修一遍单多变量都赶不回来。(今年实验巨坑,有可能我们今年赶上个神助教)
tip2:如果你最终由于拿了每年的5k8块钱或者最终还是准备涨以下自己的计算机姿势而选了这门课,首先只要你上课认真听讲,你会发现这门课不难。如果你把这门课的地位和学校通修的数学课划在一个层次上,平时的作业和实验对你而言也不会算太多。安老师上课还是不错的,平时还会时不时找一些科大校友什么的回来做个报告。至于课程内容的完整性、对计算机理解的重要性,我觉得不必多谈。
tip3:课程ppt、教材、实验和作业的pdf、考试卷子都是全英文(当然教材有中译版),当然考试和写作业的时候不要求你用英文作答。要求对课程范围内的英文名词要足够熟悉,平时不建议全程看中文教材,起码中英文要对照。(舍友考场上不知道啥是decoder废了十几分钟,另一个把三个两输入与门看成两个三输入与门,一道15分?左右的大题gg)
tip4:实验十分“有趣”(估计是赶上了这届助教是个巨神,去年实验水的要死),一条投机取巧的建议是不要太着急实验刚发布就开始做。比如一道指令算法题,要你的“速度”越快越好,群里的各位巨佬就会开始军备竞赛:今天他们还6w+条指令,第二天就有人优化到2k,然后没过几小时就有人搞到300条,然后180条,150条,110条,90条,85条,74条。。。。。。不得不说的是这种东西十分消耗时间,而且一个实验9分速度部分占25%还不划算,你很多的前期工作还可能因为大佬的一个奇妙优化直接白费力气,互相攀比,互卖关子,一个星期的实验可以搞得大多数人当场自闭。建议别上来就做,找个好说话的大佬把他优化的上一个版本给你讲讲(我最后这个实验优化到93条,上一个150条的版本直接给别人讲出去了,因为对这种军备竞赛实在是很讨厌
tip5:群里的助教也是大佬(还是可能我们这届很倒霉),时不时在实验要求、成绩发布的时候给你搞一大堆你听都没听说过的骚操作,你在群里问他还会说“你去学呀,我都在群公告里说了这是sha256,你不会看字的嘛”之类的。上文提到的这个实验最后成绩发布的时候没有贴学号,你要把你的程序用sha256哈希以下得到哈希代码和它后面那一串乱七八糟的东西比较才能知道哪个是你的成绩(我百度的时候一搜是个加密,搞了半天搞不出来,最后在助教diss另一个人的时候我才知道这个不是加密是哈希)。所以有问题还是找个好说话的大佬来问,顺便给你看不顺眼的助教一个非好评。
tip6:作业不占分,但是不交会倒扣。相对于一个4学分的课,不多不少吧。讨论课不必过分紧张,你会发现谁讲的时候台下都不会有人听
tip7:你可以选择上课不听,考前预习。前提是你要划出较大块的时间去通篇一字不差地把教材读了看了,作业题搞了。这个是绝对可以的(起码期中的时候),当然你最好对自己的自学和英语能力有自信再去作这个死。(今年期末略炸,该tip慎重考虑。还是这届孩子倒霉碰见个巨佬助教出书上没有的东西,也不怕被骂死)
tip8:计算机学院课程资料请移步本网站---模拟与数字电路实验(卢建良)---下面的某条评论的github
//考完更新一下
以上语言略有刺目,但是什么大佬都不该摆出一副菜就该死的魔性
《计算机系统概论》这门课程脱胎自 2011 年夏季学期的一门课 https://icourse.club/course/6240/
当时是安虹教授请大名鼎鼎的 Yale Patt 教授在暑期学期来讲的,教材也是他的名著 Introduction to Computing Systems: From Bits and Gates to C and Beyond。
这本书(这门课)跟 CSAPP(计算机系统详解)都是计算机系统的入门书(入门课),两本书(两门课)着眼点不同。Yale Patt 的书(这门课)着眼于硬件角度,看计算机系统如何从门电路、处理器一级级搭建起来的,硬件给我们提供了怎样的接口和抽象。CSAPP(计算机系统详解)着眼于软件角度,看如何用算法和编程语言描述一个问题,操作系统给我们提供了怎样的接口和抽象。这两本书都是不可多得的计算机系统全景解析式著作,即使对于资深的计算机系统研究者,翻阅这本书仍能获得一些启示。
推荐科大计算机系学生选修计算机系统概论和计算机系统详解这两门课,一个是硬件方面,一个是软件方面,对计算机系统的构成有个全面的了解。
很有收获的一门课!安虹老师是一位很优雅,有气质的老师。上课从头到尾都表现出一种从容,这是很多老师都无法做到的。
课程前期与“模拟数字电路”中的数字部分有些重叠,但我感觉这门课讲的比模数这门课更加简明扼要,不注重各种细致的概念,更重原理,我觉得这样挺好。(比如,这门课就不会细讲各种选择器、触发器的类型与大同小异的功能,模数在这里就会讲一大堆。。)
课程会让我们每人上台花5-8分钟讲一些与计算机有关的话题,不过觉得很多人都讲的太高深,几分钟内难以听懂。倒不如讲一些很小的,有意思的点。
安老师还会顺便讲一些与超算竞赛有关的事情,听起来挺有意思的,感兴趣的同学不妨一选。
只是有时候感觉某些知识已经讲的很明白了,安老师还是不断的重复,怕我们不懂。
这门课到后期还是花了不少时间的,主要用在调汇编程序。
难度方面,感觉[产生CPU中断信号与栈的实现]的内容稍微繁杂了点,得看书看好久才能全面弄懂(而且还不是写在一块儿,附录里面有更细致的描述)。之前的内容比较好理解。
给分目测不差,我也只是刚得优秀,已经满足了,感觉这门课是认真点就可以得优秀的那种。(我这样说,是因为确实有那种努力了却给分不好的课...)
另外,教材建议买英文版,因为考试题也是全英文。好像有人因为长期看中文教材而导致期末考试看不懂题...
占坑,出分后细评。
先说结论:这门课是我目前为止上过最史的课,本学期的助教也奇差无比,堪称极品。
体验较差,不建议选。
上课前半程扯一些没用的内容(老子?太极?),相当一部分与模电重复。
期中考试范围少划了一个单元(一道十几分的大题)。试卷有好几处错误,到考试快结束时助教才更正。
老师:期中才占10%不要紧。结果期末强行更改给分比例???
问助教问题从来不回,不公布作业和实验上交情况以及得分,不公布期中期末考试成绩,最后直接出总评???
总评登上去之后又撤下来改?迷惑。加大考试比例就能让同学都来上课了?考试跟上课有什么关系吗?
临时改变给分标准我是没有想到的。
另外今年这几个助教就像鬼一样,在群里面从不发言,私信也不怎么回,特别是不公示作业和实验情况,让人死的不明不白的。
这门课其实算是有点用,不过实在是浪费时间。性价比不高,非英才班的同学建议别选,如果是想要开阔视野的话不妨选吴俊敏的计算机系统详解(大一下就可以选,不过难度较高,但作为公选课给分好且轻松)。个人认为这门课不好水学分,能学到的东西也不是很多。
如果不是必修为什么要选这门课呢?
计算机系统概论 (H) 是我大学两年来感觉最有意义,收获最大的课程之一。推荐对计算机底层感兴趣的同学选择。
虽然说我这一届的话,小邓学长被骂得比较惨……实话讲那个速度军备竞赛的实验我也没有用太多时间去优化(时间都给数电实验大作业了,然后没有大作业的 F 同学荣获军备竞赛第一),最后速度分也只拿到一个中位数。不过整体的实验其实没有那么可怕,除了军备竞赛实验比较压抑以外,别的感觉都挺不错的……(虽然最后有一个写 ISR 的实验没有出)
最后给分的话其实低于我学期初的预期……其实感觉主要是因为我期末翻车 + 实验速度分不高的原因吧……(如果我没做 assembler 和破解某个 editor 程序的附加任务的话,分数会更低,所以建议有兴趣获得高分的同学做一些与 LC3 有关的题目)
期末之后会选一些分数靠前的同学去超算队面试选拔,如果有兴趣的话可以提前准备一下。我因为太菜,而且有别的比赛要做,所以现场划水,于是愉快地被刷掉了。
实验具体的细节 @printk 有很好的介绍,这里就不重复了。
我单方面宣布ics是妮可最擅长恶心人的课,考试的唯一目标就是为了恶心人
期中的16进制机器码就不说了,为什么期中期末都要出看到第4小问才能确定第1小问答案的题?题面也写的巨勾史?数你马的周期?
考试的内容全是附录里边边角角的地方,上课提都不提
实验占一半分,然后实验给分的标准是实验报告写多少???这么简单(shabi)的实验有必要写个几页实验报告???最恶心的是助教从来没说按写多少给分,而且直到所有实验做完才会出实验的分,这不就是纯为了恶心人?
不过给分是真捞啊,我按公式算出来80,给捞到85了,泪目
19大数据 作为必修不得不和计科英才班一起卷
课程主要上什么其他回答应该说的挺清楚了
主要想说一下自己的感受
1.个人感觉课程与考核有脱节,尤其是考试。不能说考试考的上课没教过,难度类比的话大概就是教了C的基本操作然后去写一个算法,能理解算法,能理解语言,但没经过练习(没有布置类似难度的作业 大部分人也没想到)在做题的时候干瞪眼的无力感我觉得不是这门课应该有的
2.课确实是好课,从一开始我狂喷(不是)到后来也能领悟一些妙处,但一定程度上我认为课程进度安排的太不合理,前面扯淡花很长的时间,讲到精华的部分一下子就过去了,特别是后面比较难的部分,感觉上了两三节课就结课了....整个课程留下最深印象的竟然是“数晶体管个数”
3.个人觉得加分机制并不是很合理,首先是幅度有点大(10分),其次对于高手而言,考得好还能卷满加分当然是好事,但对于屑院跟我一样的彩笔来说,本来就考不到多好的分数,上面的人一卷把分数卷的很好看,下面的反而拉不上来,就可能留一堆很难看的绩点,也有人喷为什么不做加分,何不食肉糜了...做的来肯定去做了啊
4.助教很认真很负责,安老师很认真很负责,教材很好,课程很好,可我大数据为什么要上呢...如果真要从底层下手优化算法我为什么不去计科来这大数据呢....希望学弟学妹们可以上更有性价比的课!
更新 期中92+期末60+无加分=总评83 感觉调分还是可以的,感谢安老板,但对课程本身的评价就如上了
作业:作业量不是很大,总共6次,一次作业算1分,基本上是写了就有分。
实验:总体来说实验难度不如数据结构,逻辑上都比较简单,就是很麻烦,高级语言一行代码的事得写很多行。不过非常sb的是考试周安排两个实验。虽然ddl延迟到假期了,但是说的太晚了,导致我在考试周花费了宝贵的复习时间来写实验。并且汇编器的要求增加了好多,模拟器的文档又太简略,两个实验的体验都不算好,尤其是像我这样没接触过C++的人还得先花时间学C++。
顺便一提我做实验基本上都是先画流程图,再用C语言照着流程写一遍检验正确性,同时也为lab6的用高级语音实现前面的实验做准备,最后再照着流程图用汇编语言写。感觉这样还挺高效的,基本上一个晚上可以写完一个实验。
考试:考试,期末还好。期中纯粹就是为了难为人,老师后来也说期中出难点是为了让同学们重视这门课,不要以为随便学学就能学好了。
老师:老师讲课并不算特别好,前面两周一直在说这门课多重要,上的像一门思政课一样。后面节奏快了起来,讲的很多,但是和考试内容似乎是正交的(bushi
助教:两个助教水平都很高,但是感觉有点不够用心,可能是科研任务比较重吧。赵助教习题课讲的很好,但是回消息好慢,另一位吴助教回消息很及时。顺便一提过年的时候赵助教还在群里发红包了,好感度猛增。
给分:给分感觉还行,优秀率76%,我期中66.5+期末88+有一个实验被扣了30分(这个实验的代码我提交成代码框架了,所幸实验报告里包含了大部分代码,助教哥哥也比较仁慈给了70分),最后总评95,这个给分很不错了。
至于推不推荐这门课,好像没什么意义,因为英才班的同学没有其他的选择,也没法退课。
大二下结束来更新一下,感觉这门课对于后面的学习还是有一定作用的,LC-3也是最简单的汇编语言了,可以起到打基础的作用,以后的课老师都默认学生会汇编语言了。
吐槽的几个方面:1、考试周附近布置实验,导致占用大量复习时间。lab5、lab6、模拟器、汇编器均在考试周附近布置,导致复习时也要抽出时间写ics实验。而且汇编器和模拟器又是两个代码量非常大的大模拟,如果完全由自己完成的话至少要两三天的时间。而个人感觉这两个实验和ics内容本身几乎没有什么关联,只是单纯的堆代码量。
2、实验文档模糊不清。全是英文这一点先暂且不题,尤其是模拟器的实验文档,给的信息少之又少。最终的要求只占了短短六行,没有实验样例,没有具体的步骤,但是检查的时候又突然要求能够输出一段内存空间的值。给的实验框架没有注释,而且是c++版本,还要自学cmake。
3、习题课有签到,强制参加。不知道是否会影响总评的调分。
安老师的讲课水平中规中矩,和自己看书区别不大。也可以说是这本书写的太好了,结合作业自学就能掌握得差不多。
除夕更新一下,出分了,按照助教的说法总评是半期*0.15+期末*0.25+实验/8*0.5+作业/6*0.1,最后只高不低,实际出分确实要高一些,优秀率是76%。如果实验报告写的多的话总评应该不会太差。学弟学妹们选这门课还是要卷一下实验的。
这门课还是比较有特色的,期中考试占10%,期末占20%,反而是平时实验占了很多分,作业交了不看对错,不交倒扣分,而且课本、实验报告、作业都是英文,写了一个学期,虽然我写的报告还是中国人外国人都看不懂的神秘语言模式,但总归增加了蜜汁自信。 期中和去年的卷子大同小异,期末逗比助教非说比期中还简单结果一考发现是hard模式,不过最后给分应该挺好的,感觉群里大家都很开心。 另,安虹是继陈发来之后又一个让我觉得优雅的老师,有次去食堂听见她一边走路一边打电话讲xxx怎么优化什么的,满足了我对知识女性的全部幻想。
2024-1-29
刚刚交完LabS的报告,我的冬季学期宣告结束辣!(雾
占个坑先,有空再更
本人成绩虽不顶尖,期中期末在班上也算偏前,但仍被实验(尤其是汇编器和模拟器两个实验)烦到了。问题列出如下:
安虹老师讲课中规中矩,前几周基本都在吹水,后面还算是正常讲课了,可以接受。
给分还行,优秀率76%
这应该是要填的最后一个坑了。跟不少前人的评价类似,其实我也觉得这门课开课的目的挺迷惑的,感觉几门计算机专业的必修课就能完全把这个课代替掉了,ics这个课就有种什么都讲了但是什么都只讲了一点点的感觉。
说回到课程本身,比较好的一点就是考试占比只有40%,然后另外60%中一大半是实验,还有作业什么的,其中作业是二等级制,就是只要按时认真完成就是满分,所以主要看的是实验的分数。实验总共有8次,分为1次机器语言、4次汇编、1次C++语言,另外还有一个模拟器和一个汇编器的实验是必做。关于C++语言,不少同学说不会,其实就是在C语言的基础上加了一些东西,我之后准备写一个以C语言为基础的C++入门教程。模拟器和汇编器会给C++代码,中间只有一部分需要自己填,当然你自己用别的语言从头开始写一个也不是不行,depends on you。
作业和实验文档都是用全英文写的,考试卷也是全英文,不过不难懂,基本上用高中的英语基础再加上几个专业词就可以全看懂了。考试是开卷,有些人会带一本厚厚的词典过去,不过这完全没必要,我带去考试的就一本第三版的英文教材。实验报告是中英文皆可(不过我一般都用英文写,懒得换输入法了)。
老师讲的怎么样这个不好说,感觉不如自己看书来学,反正我上课也没怎么听过,基本上是在做各种其他作业,hackergame那一周甚至ics课上还打了几百分。学期中会有几次习题课,但是会点名,不去的话会影响总成绩,所以一定要去(话说为什么会有正课不点名习题课点名的课啊)。
最后讲一下考试,虽然占总评的比例不大,但是题目也不简单。试卷中会出现以下要素:
总体的题目风格还是抽象为主,题目细节很多,一定要细心,基本上作业认真做考试不会有太大问题。
最后还可以选做一个107机的汇编器模拟器的实验,剧透一下,107机的结构比LC-3简单不少(毕竟是上世纪五六十年代的东西),所以如果想卷绩点可以尝试,在期末考试后给老师发邮件,老师会给一些相关资料。
本学期所有实验代码已开源:Ace-tyl/icsh-code: 2023秋季学期计算机系统概论(H)课程实验代码 (github.com)
仅供参考,严禁抄袭!
课是好课,但是安虹老师把这个课上成了我2020秋最难受的课之一。
首先是上课信息密度太低,一条指令能讲半小时,于是每节课我选择坐在最后一排的角落里写当天晚上要交的实验报告()其次是教室的问题,一百多号人的课,用3A的教室是不是有点太挤了,每次上课都感觉黑压压的一片,考虑到这里面大部分还是计科英才班的同学,每次上课都让人有一种被dl们压迫的感觉;然后是形同虚设的讨论课,几乎没学到什么,还每次占用一个周末的晚上,唯一的好处可能是教会了我如何从容地面对尴尬的社死场合;然后是实验的布置,实验交上去是没有反馈的,直到最后也不知道自己的实验评价是是什么。
不过课上的收获还是挺大的,相当于提前上了组成原理的一部分内容,帮我省了不少事。
老师的给分也很不错。可能是被之前评课社区的评价吓到了,这门课难度没我想象的那么大,甚至不如同学期的模电,光原等课,作为H课实在是有失水准。
最后还有一点,有个助教很帅/可爱,算是这门课为数不多的好处了吧()
有一说一,课是好课,但今年这出尔反尔的给分不太行。
开学之初的承诺:期中10%+期末20%+六次实验共54%+讨论课15%+签到1%,作业交了不算分不写扣分;
学期中的加分项承诺:讨论课上多发言加分;给老师提课程建议和教学反馈加分;制作模拟器和汇编器加分;考试整体成绩不理想会给调分;
结果最后总评:(考试不给调分)期中25%+期末45%+四次实验共20%+作业&讨论10%,加分项只保留模拟器和汇编器。(据助教说大幅调高考试比例是因为班级平时到课率不高引起了老师不满?)
关于课程本身的评价:老师讲得还可以,个人收获挺大的,主要作业题目还挺有趣,实验虽然有的比较复杂而且要写实验报告,但是解决问题之后还是能获得一定成就感。加上讨论课每周末都要去两三个小时持续半个学期,作为一门四学分的课还是挺耗费时间的。
考试尽管是开卷,但题量太大,试卷全英文,就算本人英文水平挺好而且英文教材通读过一遍还是感觉答不完(期中尤甚,期末还好)。
本来想给这门课打至少9分,考虑到老师出分前临时调整了总评比例,这操作我不喜欢,减一分;老师之前统计成绩出现了失误,成绩是二次登载在教务系统上的,再减一分,所以7分。
ics,一门值得一学的课程。给后续课程打基础,同时有着提纲挈领的作用。也有利于同时期的数字电路的学习(虽然有一定的重复),课程本身不难,但事情不少。
建议使用英文版教材,一方面可用于锻炼英语阅读,另一方面亦可以为考试时的英语试题做准备,我想还是有些人在考试时耗费了一些时间用来读懂题意。平时作业不计分,只要交了即可,但还是要认真做一做,熟悉考试套路。实验有不少,前几个还好,最后一个也算是不小的工作量,建议做好心理准备(但没有数电的大实验花的时间多)。
感觉分数给的还可以,但是不是很清楚具体每项是多少分,希望以后可以提供了解平时分的途径,或者至少在提交了实验后给个评价,不至于让人不清楚自己平时成绩到底如何。
讨论课的价值在于拓宽视野,意义不是很大,不过就算不感兴趣的话,还可以一边听一边写大雾不是?
英才班课,讲的是如何从晶体管层面一层一层抽象到汇编语言层面从而构建一台计算机及其指令集架构。一学期下来,能够深刻理解CPU的基本工作原理,收获还是很大的。非英才班和非计算机专业的如果有兴趣也可以选一选,不需要什么预备知识。
教材是Introduction to Computing Systems那本英文书,只讲C语言前面的部分。考试是英文试卷,可以用英文或者中文答题。只要作业题都完全理解了,考试就应该没有什么问题。
期中10%期末20%,平时作业不计分交了就行,其余给分都是实验和讨论课。只有一次点名,据说是占总评1%。
作业和实验都是在电脑上写完之后发到课程邮箱,ddl一般是周六24点。实验是用LC3汇编语言写程序,前几个简单,后几个还是有点麻烦的。
每周日晚上有额外的讨论课,要么讲作业,要么针对之前给定的话题进行小组展示。多发言可以加分。
不太清楚其他人的总评成绩,所以无法准确评价给分好坏。不过英才班课优秀率应该蛮高的。
安虹老师还是很和蔼的,只是有时候会把一段内容重复很多遍。
课程主页在这里:http://acsa.ustc.edu.cn/ics/,所有和课程相关的内容都可以在这里找到。
期中考完了喵,助教哥哥满昏!
Lab4上来一个 Sakiko's Savings 真没绷住
-祥子:我没意见-
看到23级同学的点评已经很全面了,在此就简单提醒几句吧,主要就是注意成绩占比,这门课实验分数至少占总评50%(我们这级是期中15%,期末25%,实验50%,作业10%),并且八个实验中有六个都是实验和报告55开,所以一定要认真对待每一个实验和报告(具体扣分举几个例子,假如一个实验总分十分,如果代码本身功能出错应该是扣三分(相当于期中扣了13分!!!),如果报告很敷衍扣一两分)所以一定要予以重视。
快毕业了,统一评课。
这门课我是19年上的,总体不推荐。
给1分不是因为课真的这么烂,只是来拉低一点分。因为实在到不了八分的水平。
第一,这门课每年都能搞出点事情来,搞得三分之一的人很高兴,三分之二的人很不愉快。
第二,老师太右了。常年待在教育系统内,并不知道天下变成了什么样子(与之相反的,某运筹学老师太左了,却也不知道天下变成了什么样子)。ysxt不合,会很微妙。
第三,我当年上课的时候,说好的考试三成,结果却变成了考试七成,一群人考试随便准备的,都在认真搞实验。最后总评策略一换,三分之二的人直接爆炸。
言而无信,也没什么好说的了。
话说回来,优点也不得不提:
这门课确实达到了它的教学效果。
认真学的人,应该确确实实可以掌握“计算机系统概论”了。
这会让你以后省很多事。
总体不推荐。
扣两分。1分给本学期的助教,真的做的不太行。另一分是因为在没有任何提前说明的情况下改变了学期开始给出的计分方式。
老师的ppt和作业实验布置是全英文的,建议非英才班的同学一定要有一定英语基础的情况下再选修,不然会特别吃力。讲的内容是1-3章和数字电路前面那部分差不多,后边5章是指令中断I/O子程序等系统内容。有期中期末考试,且用英文出题。答题可以中英文结合(不知道支不支持法德西葡意等)。期中考前5章,期末考到前半本书(不包含所有C语言的内容)。好好听课的话期中期末考个85分左右问题不大。
期中题型包含基本逻辑运算、简单逻辑电路设计(这里不会特别难,因为这门课还有大数据学院的学生上,他们没学过电路。)、读程序写结果/内存状态/寄存器变化,简单汇编程序(虽然当时说不考汇编,但是还是考了,只不过考的很简单)。
期末题型也差不多,只不过读程序写结果那一部分增加了诸如打断点、跳转、递归等比较难的内容。
所有ppt、作业、实验和实验环境以及操作文档都发布在了http://acsa.ustc.edu.cn/ics/。服务器不是非常稳定,但是并不会影响到正常学习。
然后是这门课会有4个配套实验。(最开始说是6个,感觉是助教偷懒了。)本学期的配套实验是读入数据并排序然后保存、十六进制指令完成右移操作、求最大公约数和手动编译一个含有调用的C语言代码。难度不是特别大,如果编程基础较好的话这些实验都不会太难完成。
接着还有一个讨论课,内容是以组为单位介绍和计算机相关的内容。准备的话基本上就是摘一些wiki上的东西念一遍?感觉本学期这一部分的组织太过差劲了,可以说没有一点点收获。我觉得我宁可多做两个实验也不要上这个讨论课。~~哪怕是Teamwork然后队友还是那种只会吃饭的。~~
最后学期末附近还会征集各位同学用各种办法实现的LC- 3的汇编器、模拟器。只要完成了都可以获得5分的加分。如果是在PC上实现的话要求能完成老师给出的汇编器的几乎所有的功能;如果是在FPGA上实现标准可能会放低一点,如果不能支持特别多条语句问题也不大(考虑到烧板子会特别慢)。
总的来说课程本身内容很多,可以对同学期的一些课程进行内容的补充,课上讲的也不错。但是课外补充的这一些内容有一点欠缺。~~另外LC- 3在FPGA上的实现似乎也可以直接交到数电实验上,而且评分很高。~~所以还是建议如果英语水平和时间允许的情况下可以选修一下这门课。
但是本学期在教学组织上发生了两个很令人不愉快的事情。
第一个是给分问题。开学的时候承诺给分按照10%期中20%期末16%考勤%54实验,然后作业要求提交但是不计分,分享自己编写的LC- 3汇编器、模拟器每一项加5分。期末考试的时候还说了给出课程反馈也会适当加分。但是在寒假的时候突然改成了25%期中45%期末剩下的部分只占30%。实验从得分的角度上来讲几乎每个人都是交了就基本不扣分。这个让很多因为说了实验占比高而努力做实验、提升效率(这个非常耗时间,每一次优化所需要的时间不亚于重新写一遍。)的同学们浪费了相当多的时间和精力。而且最后改标准给出的理由是因为平时考勤到课率太低了,这个理由很难让人信服。
第二个是助教严重不负责。首先是讨论课除了喊一句下一组和问了问题的人下课来报个名两句话以外没有说过话。然后是在学期开始提出实验很重要的情况下,从来没有对实验给过任何反馈。我觉得我不是不可以接受给低分,但起码你得让我死明白吧?咱们教学也不是为了比拼出来你是一等奖我是二等奖,我觉得你是可以告诉我我写的东西、讲的东西哪里有问题吧?这种实验、报告的教学,不就是在犯错误中累计经验并学习么?对比一下这学期的数字电路实验,代码部分是现场给分,你要是verilog有毛病甚至都可以找助教帮你调代码,大作业难度、参考。可以看出这个助教在实验上的负责程度实在是不够看。然后是期中成绩期末成绩也没在群里说过,直到最后因为登错了成绩才公布。是不是如果大家没觉得成绩不对劲他们都不打算改了?我觉得这些都是可以很轻松地完成的事情吧?为什么那么多课程的期中期末(数据结构除外,怨!)助教都可以很方便的发布成绩,这门课的助教就不行?
最后据说优秀率在50%。这个我就不清楚了,没有仔细问。毕竟我本人对待分数还是挺随意的。
总的来说,课绝对是一门好课。如果付出一些努力最后的成绩也一定不会差。本人非英才班选了这门课最后总评也拿到了90分。如果有人问我这门课是否要上我是一定会推荐的。所以我也更希望以后这门课程的助教可以负责一点 。我不求你搞LC-3的OJ,我不求你搞MD5发布成绩等炫技技巧,只求你完成一个助教应当完成的事情好吧。如果说真的忙,就不要来当助教了好吧?
//=====
另外这门课程的考试真的是计算机学院的一股清流。没有弱智的名词解释,没有弱智的模版代码背诵,完全基于计算机运行模式。真的,这就真的值得再给点分了。没有对比就没有伤害。
我感觉ICS对后继的课程还是很有帮助的,考试占比重不大,主要是每一次的实验(作业只要交了就有分)。
安虹老师的ppt真是清晰又容易理解,至少目前我没有再遇到哪个老师的ppt写得这么好了……
给分挺好的
为了防止学弟学妹看到这个从而误选安虹,特此前来评课。
请到 https://icourse.club/course/20775/ 了解真正的 ics,ah,hyq
课是好课,考试是阴间的考试
以及让大数据跟计科英才班一起卷,屑院实锤
最后不调分,跟开学时说的比例一样,但可能会在实验上捞一捞
越到期末任务量越大,一共6个实验,期中前一个,期中后5个(期中考完一个月就期末),猝死的节奏...
给分不错,优秀率50%。但是实验太变态了,难而且竞争很严重,不是大佬慎选。
这门课从二进制编码开始,一路经过逻辑电路、内存、机器语言、到汇编语言(包括后续基于汇编的输入输出、系统调用、中断程序、栈与工作栈等),讲解了计算机系统的工作原理,内容还是很丰富的。并且课程注重概念和逻辑框架的搭建,没有很艰深的内容。就算到了后期,从作业、上机题到考试也都是有繁度没难度的,完全不用担心学不会,推荐所有同学选。
安老师讲课的风格是一个知识点翻来覆去地讲,非常细致,但个人感觉节奏太慢,不如看书。鉴于所有任务都是用英文布置的,而且毕竟阅读英语文献是必备技能,建议买影印版的英文教材来看(实体书,考试开卷,知行书店有二手书,全新的网上也有卖)。对英语不好的同学来说看书会有一定困难,但请一定坚持啃下来。
作业和实验是这门课的本体,作业题一共6次,一般会给两周时间完成,题型和课后习题类似,不算分所以做的时候不用太纠结对错,按时提交即可。随后助教会把作业答案放到课程主页(http://acsa.ustc.edu.cn/ics/),一定要核对,把错题搞清楚。实验一共5个(往年有6个),同样有两周时间完成,内容为写lc3汇编语言程序实现功能,设计难度不大,但调试汇编语言程序会费点时间。需要写实验报告。
这门课要求两人一组做课程相关的课题展示,在每周末的讨论课上完成。助教会给出几个课题但请同学们不要拘泥于此(今年感觉至少有10个组讲简单复杂指令集的对比……),事实上任何专业相关课题都欢迎。
期中期末两次考试,题型和作业题类似,难度不大但题量爆炸,要加快做题速度。
总评组成:实验原定54%(每个实验9%,但今年砍掉一个实验,不知如何调整了计算方法),展示16%,期中10%,期末20%,作业不计但不按时交会扣分。实际操作时,实验的给分分为两个维度:程序的正确性和实验报告,程序只要大家交之前测试一下基本上都是没问题的,那么主要的拉分项就是实验报告了,经验告诉我们请认真写实验报告;展示的成绩最后助教选择不作区分,基本上都是给满的。这门课不限优秀率,目测大家的成绩还都挺不错的。
最后说一句,安老师是学校超算鸿雁队的领队,每年秋季学期会面向大一大二同学招生,感兴趣的同学请尽早准备。