从0到1构建计算机(12/12)--收获和总结

完成Nand2Tetris这门课,我大概用了4个多月的时间;完成从0到1构建计算机系列博客,大概用了5个多月的时间(课程和博客时间上有交集)。期间也因为工作较忙的原因,挂起过若干次,很高兴最后还是坚持完成了。最后在这里再次做一些总结,算是对这段学习过程的一个暂时的收尾。

之所以说是暂时的收尾,是因为我觉得课程中很多知识点自己理解得还不到位,很多精华的思想也没有完全get到。这门课程是一门基础性的课程,也是一门常读常新的课程,值得经常回顾和思考。这门课程也是一门很好的入门课程、框架课程(哈佛大学的学生把它戏称为计算机专业101课程),它让我们对计算机科学知识体系有了一个很直观的感受和实践(至少是我作为一个iOS程序员能够接触到的知识体系)。师傅领进门,如果后续我们对其中的某些方向比较感兴趣,可以再去深入地展开学习和研究。

知识上的收获

计算机架构&硬件

虽然在学校的时候修过计算机组成原理等课程,对计算机的架构和硬件的工作原理有过一定了解,但基本是停留在理论上,理解并不深入。通过这次亲手实践,对这些知识有了更直观的印象和理解。例如,时序芯片如何记录数值状态,ALU如何支持各种操作,CPU如何解析指令并执行,程序技计数器如何工作,CPU和内存通过哪些线连接等等。虽然我们平时的工作可能不会接触到这些细节,但学习这些知识,我了解到了我每天工作时面对的计算机到底是如何工作的,否则总会有一种心虚的感觉。九层之台,起于累土,我觉得了解这些知识对我的意义在于,它给了我继续学习和研究计算机上层知识时内心的踏实感。

函数调用过程

对函数调用过程有了更清晰的认识。虽然Hack不支持直接对栈的指针操作指令,用虚拟机进行了模拟,但总体原理是一致的。例如栈帧的开辟和回收,局部变量内存的分配,寄存器的保存,函数返回地址,入参&回参等。理解函数调用过程对我们是有实际意义的,例如对我们阅读汇编语言,提高debug能力,写出效率更高的代码,学习一门新语言等都有很大的帮助。

编译原理

可能绝大多数程序员都不会有机会去从0到1地编写一款编译器。虽然Jack编译器几乎是一款最简单的编译器,但我们从中仍能了解到编译器工作的基本原理,其中很多的优秀思想也能被我们应用到日常的工作当中。同上面说到的学习函数调用过程一样,理解编译原理也是十分富有实际意义的,可以帮助我们更快更好的学习理解其他知识。况且自己实现一款编译器本身就是一件有趣且有挑战的事情,我们只要花一点点精力和耐心就可以开发一款属于自己的编译器了,作为程序员你心动了吗?

内存管理和I/O管理

从Hack的操作系统的实现中,我们学到了最基本的内存分配、回收管理方式,为我们继续学习其他更高级的内存管理操作开了一个头。我们也学到了操作系统如何监听键盘事件,如何在屏幕上绘制文字和图案。只有先掌握了屏幕绘制的最基本的原理,然后再逐渐掌握一些GPU原理、openGL、计算机图形学、特定平台的渲染框架等相关的知识后,我们再做界面渲染的性能优化时才能做到有法可依,甚至做到技术创新,这是一个前端&客户端程序员通向高阶程序员的必经之路。

关于学习与提高的思考

练习基本功的意义

工作后记得自己发过一条朋友圈:”年少不学C,老大徒伤悲“。虽然我是软件工程专业出身,但是在学校时并没有意识到计算机基础课程的重要性,反而把精力放到如何能写出一个Android小程序,如何多刷两道LeetCode上,如果在学校时就能遇到这门课程该多好~~。回头想想,我会把一半的锅推给大学,老师只知道照本宣科,其实并没有把心思放在教学上😏,和本课程的两位作者形成鲜明对比(吐槽完毕)。

工作以后也并没马上意识到基本功的重要性,又把很多精力投入到阅读iOS平台源码,学习一些黑魔法上,学得即片面又不成体系,导致我总觉得学什么也学不透,学不精。工业级的计算机是一个非常复杂的系统,一层层的封装结构把计算机的工作原理埋藏的很深,大多数程序员也往往是知其然,而不太知其所以然(或者理解了错误的所以然)。在这种情况下,我们一般只能应付日常的工作,一旦遇到需要深入研究,需要创新的工作时,就无能为力的。举个例子,我在做APP的性能优化时,一般就是照葫芦画瓢,看看公司内或业界有什么方案,借鉴到过来,或者就是单纯地从业务特点出发,做一些力所能及的优化。不能够产出自己的创新方案,说到底还是对计算机底层运行的细节不够了解,自然也难以产出有针对性的方案,不知道发动机的工作原理,又怎么能让车子跑的更快呢?

计算机发展的这么快,但最基本的原理仍没有变。掌握了扎实的基本功,能让我们更快更好的学习其他技能,以不变应万变,更好的在这个快速发展的行业中立足。

找到自己的学习路径

无论是学习什么,找到一套行之有效的学习方法,才能让事半功倍。在本次学习的过程中,我再次认识到了计算机科学是一门需要实践的学科。我个人觉得理论、实践、总结三件套是非常合适计算机科学的,没有系统的理论学习直接开干效率是不高的,也不利于形成自己的知识框架,所以屯一套经典的书单还是很有必要的;只学理论又缺乏实践也不太好,总有一种吃不透不感觉,而且只有亲身实践过了,才会有更深刻的理解和印象,毕竟 talk is cheap,我们还需要 show code 才行;至于总结可能因人而异吧,我觉得总结是一个很好的思考和复习的过程,同时能锻炼自己的表达能力,博客也算是自己一笔可见的财产(虽然写博客确实很花费时间,相信会越写越快的)。

资源在哪里

我是在Google上搜索如何学习汇编语言时,找到这个课程的。我觉得Google就是最好的学习资料。想学什么,Google一下;不知道怎么学?Google一下;没有资料,Google一下;想免费下载PDF?Baidu一下。当我们准备开始一段新的征程时,不必太着急,先调研几天甚至几周,做好准备后再打长期仗(长期有耐心)。

后续规划

深入学习C语言

现代常用语言集合中,C语言相较于其他语言,是更”基本“的语言。掌握好C语言能帮助我们更好的理解内存、指针等主题,对学习其他语言也很有帮助,例如,Objective-C就是基于对C语言的扩展,runtime等底层基础库都是用C实现,所以想要深入掌握OC的前提就是深入掌握C语言。或者你想要阅读某个操作系统的源码(例如Linux),也需要先对C语言很熟悉。所以C语言是一门很重要的基本功,是我们想要掌握好其他技能的前提条件。

附带条件:需要一定程度的掌握汇编语言,最好能达到可以阅读理解较复杂的汇编代码的程度。

剖析一门简单的操作系统

Hack的操作系统是在过于简单,和现代操作系统相去甚远。例如,它不支持多进程和多线程,不支持文件系统,也不支持网络。我需要在找一门简单但由不那么简单的操作系统来继续提高一下,目的主要是加强自己对多进程和多线程的了解,并在学习的过程中学到一些经典的模式和算法。

界面渲染原理

作为一个客户端程序员,理解现代计算机的界面渲染原理是十分必要的。在这方面我还很渣,而且目前还没有较好的学习思路,如果有同学在这方面比较有经验的话,欢迎给我一些指导🙏。

算法的意义

我自己平时的工作很少会需要用到算来解决问题,大部分情况下还真的是搬砖。我个人觉得不是算法不重要,而是我们的工作太简单了,以至于根本不出要算法这位大佬出面。但通过实践这门课程,我还是发现了很多地方是需要用到算法,需要用到优秀的设计模式的,而且越是重要,越是核心的地方,越需要我们用算法和设计来优化。所以如果我们想要摆脱搬砖,向更高级的程序员进发,算法和设计模式都是很重要的课题。而学习算法也不仅仅是刷刷LeetCode这么简单,需要系统地学习,从理论到实践,最终能把算法应用到工作中,应用到解决实际问题上。

千里之行,始于足下。苦练基本功之路才刚刚开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值