【治学大家谈】吴章金校友:疫情防控时期,不妨练就网络自学技能

日期: 2020-04-10 阅读: 来源: 关键词:

                                          前言

本文最早是2013年写给“兰大开源社区”师弟师妹们的邮件,当时是希望大家虽然身在榆中,但是也能充分把握兰大的网络资源优势,多多利用线上开放的Linux资源,更深入地学习和掌握计算机知识与技能。尔后的数年间,虽然工作忙碌,但是一直在持续更新本文,并且陆陆续续撰写了多本开源书籍,发起了多个开源项目,这些工作都是完全公益性质的,都致力于更有效的计算机专业技能学习和实践。很荣幸,这次应恩师周庆国教授的邀请分享本文。

现在是疫情防控时期,一方面要响应国家号召和学校通知,延期入学,另一方面,大家可以充分利用在线课程,在家也不耽误学习。

对于理工科来讲,实验环节在家一般是很难开展的,不过,对于计算机相关专业课程来讲,其实很多高校和开源社区在计算机课程实验方面做了大量的工作,不仅有很多开源的项目和开放的课程可以使用,也提供了大量配套的实验环境。

本文主要讨论如何充分地借用这些网络资源,完成相关课程的自学和实验。根据本文提供的资料,大部分课程尤其是软件类课程完全可以在家开展实验,这样就可以弥补家里没有实验室的不足。大家也可以借此机会,加入到相关开源项目和社区的讨论群,与来自各大企业的工程师和各大高校的同学们一起交流和探讨相关技术与课程,体验“社区化学习”的乐趣。

原文发表于泰晓科技:为什么计算机的学生要学习Linux开源技术(http://t.cn/RyaLpC8),现全文收录如下,欢迎阅读与指正。

Linux相关的开源技术对于学生来说,特别是计算机专业的学生来说,非常重要,下面就几个方面进行讨论:

                                     一、研究平台

因为开源的优势,有很多开放文案可以参考,有很多有趣的点子可以拿来做深入的研究。任何一个点挖进去都是一片天地。

                                     二、专业视野

藉由那些开源项目,可以通过邮件列表、Patchwork、Github、Linkedin、Google Group 等接触到来自全球各地的天才,不仅可以提升英文读写能力,认识国际友人,还可以把握领域前沿,甚至还有机会得到大佬们的指点迷津。

                                     三、工作机会

就像2004年左右,笔者在学校毅然而然地选择转到Linux平台一样,现在我有同样的预感,Linux以及相关的开源技术因为包含了人类的共赢理念(Open,,Free,,Share),融合了全球众多企业和天才的智慧,以及它不断更新换代地自我革新,她将持续繁荣下去。

目前的Linux人才看似很多,刚从学校毕业没什么编码经验的学生也可以很快写个小驱动,看似门槛很低,但是真正能够从系统层面解决问题的高端人才很少。如果从大学开始抓起,毕业时就多了四年的使用经验和思维培养。对于后续的研究和工作来说,都会是非常重要的竞争力。

                                     四、课程实践

从硬件到软件,Linux平台几乎都能够自下而上提供各类触及“灵魂”的学习案例,让所有课程从纸上谈兵转变成沙场实战,这会极大地提升工程实践的效率和技能。

1.硬件方面

硬件模拟已经是趋势,不可阻挡。包括处理器模拟、系统模拟,大名鼎鼎的Qemu,以及它的派生者Android Emulator 提供了易用的案例,支持ARM、X86、PPC 以及MIPS。

这东西不仅能够模拟处理器指令,支持系统级(各种外设)的模拟,还支持直接在一个架构上执行另一个架构的可执行文件(通过qemu-user 翻译)。有了它,不必花钱买开发板,有了它,可以研究如何模拟设计和实现一个硬件系统,一套处理器指令,还可以研究虚拟化技术,虚拟化集群。

跟GNU序列工具的开创者Stallman以及Linux的开创者Linus一样,Qemu的开创者也是一个伟大的先驱,他的个人主页在:http://bellard.org/。

法布里斯·贝拉是一位法国著名的计算机程序员,因FFmpeg 、Qemu 等项目而闻名业内。他也是最快圆周率算法贝拉公式、TCCBOOT 和TCC 等项目的作者。1972 年生于法国Grenoble。在高中就读期间开发了著名的可执行压缩程序LZEXE ,这是当年DOS 上第一个广泛使用的文件压缩程序。

接触开源,有机会了解和认识这些疯狂的前辈,这无疑是一件非常励志和让人血脉贲张的趣事。

关于纯CPU模拟,这里补充一个Unicorn(https://github.com/unicorn-engine/unicorn),同样源自Qemu。再补充一个,如果要研究处理器,可以考虑当下最热门的RISC-V(https://riscv.org/),它采用BSP协议授权,完全开源。

2.引导程序

大学时学习了BIOS,基本输入输出系统是什么,感觉得到,看得到面纱,但看不到她真实的样子。但是有了Uboot ,就可以直接通过Qemu 做Uboot 实验。最近,更是可以通过Linux Lab(http://tinylab.org/linux-lab)更便捷地做Uboot 实验。

3.操作系统

Linux 本身绝大部分都是Open 的,在学习操作系统课程的同时如果能够读一读Linux 0.11 的源代码,会发现操作系统不是干巴巴的电梯调度算法之类算法描述。而是可以看到实实在在的活生生的场景,可以“说话”的场景。

调度算法,同步机制,中断管理,文件系统,各类外设的驱动等等,通通可以看到源代码实现并允许亲自去修改、调试和完善,甚至可以通过邮件列表(http://vger.kernel.org/vger-lists.html) 提交Patch到官方Linux 社区,然后有机会接触Linux社区的那些印象中“神一般”,现实里却“平易近人”的大佬们。而且开源社区很喜欢初生牛犊不怕虎、善于思考、勇于探索的同学们。

还可以自己制作一个完整的操作系统。看看Building Embedded Linux System 这本书,从Linux 官方社区(http://www.kernel.org/)下载一份源代码,编译一下,然后用Busybox、Buildroot、LFS、Openembedded,甚至Yocto 制作文件系统,会知道什么是一个完整的操作系统,什么仅仅是一个操作系统Kernel。你也会了解,用户交互的界面,除了GUI ,其实它最最本质的东西还是Shell Terminator,GUI只是换上了一袭花衣裳;会真正地理解,当按下键盘上的一个按键时,这背后发生了什么样的故事和演变。作为计算机的学生,不应该被这些蒙在鼓里,应该掀开那袭花衣裳,打探背后的细枝末节,然后,等到哪一天,闭上眼睛,当整个故事情节在脑海里像放电影一样清晰不再模糊时,就如偿所愿了,那种美妙的滋味在出现Bug 需要解决时会得到印证。

做这些实验,不必买开发板,Qemu 就绰绰有余了(懂得节省的“穷学生”是好学生), 如果想学习Linux 0.11 内核,可以到http://oldlinux.org/ 下载开放的书籍和源代码,用Qemu 和 Linux 0.11 Lab (http://tinylab.org/linux-0.11-lab) 做实验就好。

如果想研究最新的Linux 内核,则可以使用Linux Lab (http://tinylab.org/linux-lab)。利用它可以通过Docker 一键搭建Linux 内核实验环境,通过Qemu 支持上百款免费的开发板,集成了交叉编译环境、Buildroot、Uboot 等嵌入式Linux 开发的必备工具,支持串口和图形启动,支持在线调试和测试,也可通过Web 远程访问。

4.汇编语言

不知道学校的汇编语言课程是否还在用王老师的书呢?这个是笔者大二时写的《汇编语言》(王爽著)课后实验参考答案(http://tinylab.org/assembly/)。

分享在这里是非常想强调实践的重要性,不知道有多少同学认真地做完了所有或者绝大部分大学计算机课程课后的实验,实验真的非常重要。

另外,真的希望大家能够在Linux 平台下学汇编语言,用gas 汇编器,用AT&T 的语法,用gcc 看C 语言写的东西是怎么用汇编语言实现的。这是非常美妙的事情。当然,还可以用qemu-user 学习ARM、MIPS 和PPC 汇编。特别推荐学习MIPS 汇编,精简指令集,最优美的汇编语言。

结合上面的操作系统课程,特别推荐一门旧金山大学的课程:CS630(http://www.cs.usfca.edu/~cruse/cs630f06/),本来这位老师(Allan B. Cruse) 是在I386 真机上做实验的,笔者完善了Makefile,然后就可以在Qemu 上做实验,详情请参考 CS630 Lab(http://tinylab.org/cs630-qemu-lab/)。

分享一个趣事:笔者给Cruse 老师分享了通过Qemu 做实验的方法,他说这个Online 学生不错,可以直接拿个A 。

Hello, Falcon

I'm amazed to receive your cs630-experiment-on-VM. I think, as an online "student", you have earned an 'A' for this course! I will let some Ubuntu-savvy students here know about what you've created, and we'll see if they find it to be a timesaver, as it ought to be. Thanks for contributing these efforts to the class.

在这里给大家推荐两本书:

·ARM 汇编:《ARM System Developers Guide: Designing and Optimizing System Software 》

·MIPS 汇编:《See MIPS Run Linux》

而X86 汇编,则不要错过刚介绍的CS630 课程以及Allan B. Cruse 的个人主页。

另外,前文提到的Linux Lab 项目也提供了 10个汇编语言的 hello-world 例子(见examples/assembly),可以快速上手 5大处理器架构(X86、ARM、MIPS、PowerPC、RISC-V)的汇编语言开发。

5.C语言

就语言本身来说,她太有生命力了,而且现在以及可预知的将来,她还会保持独有的生命力。语言本身是不是还在学谭老师的课程呢?建议还是要自学C 语言发明者写的《The C Programming Language(K&R)》。

然后,不要忘记把基础打扎实一些,下面几则内容可以作为日后学习和工作的持久参考书,最好是在大学阶段系统地阅读和实践一遍,会受益匪浅的:

·C Traps and Pitfalls

·C FAQ: http://c-faq.com/

·Advanced Unix Programming

特别推荐Jserv 的大作《深入浅出Hello World》,它揭示了“Linux 背后的层层布幕”,有一段这么写到:

许多充斥於开放资源的Linux programming 文件常只叙及概念或技术细节,往往以照单全收却没有充分消化的结局作收。我们何尝不能以「实验」的心态去思考“Hello World"”这种小规模应用程式在执行时期的微妙变化,此时再佐以网路上丰富的资料,不是更能享受醍醐灌顶的美妙吗?

巧合地是,2008年左右笔者也有过类似的心路历程,虽然跟前辈Jserv 比起来只是咿呀学步,不过有兴趣的朋友也可以一同分享,目前已经整理成开源书籍:《C 语言编程透视》(https://tinylab.gitbooks.io/cbook),正在持续校订和完善中。Jserv 前辈也参与了该书的修订并已经把该书作为大学补充教材:

hi,

首先感谢将《C语言编程透视》一书开源,本人任教於台湾的大学,很希望拿这本好书当作补充教材,於是著手调整,很希望能够符合 Linux x86_64 环境。我做了一点调整,请见: https://github.com/jserv/open-c-book/tree/x86_64

但涉及到 dynamic linking 的部分,实在有太多地方得修改。请问最近有改版的计划吗?

Thanks,

-jserv

再来一本Jserv 老师引荐的书:《Computer Science from the Bottom》Up(https://www.bottomupcs.com/)

上面忘记提GCC,GDB 之类了。在Linux 下面学习C,离不开他们,当然还有编辑器VIM + CSCOPE + CTAGS,还有Gprof, Gcov 等。由于Linux Lab 提供了非常丰富的开发工具,因此也可以用Linux Lab 来做C 语言实验。

6.脚本语言

学一两样脚本语言,对于平时的学习和工作会起到事半功倍的效果。比如说要处理一些数据,可以用SED, AWK加Gnuplot ,这时SHELL程序设计就非常重要。关于SHELL,笔者有写过一本开源书籍《SHELL编程范例》(https://tinylab.gitbooks.io/shellbook),这本书以“面向对象”的方式系统地介绍了日常工作中需要操作的各类数值、逻辑值、字符串、文件、进程、文件系统等,很适合随时检索。

又比如,要做一些比较复杂的甚至带有图形的交互,这时可以用Python,可以用一门非常漂亮的语言高效地实现一些案子,而且可以学习面向对象的思路。

7.编译原理

编译原理太重要了,了解Turob c, Virtual studio C++ 背后的故事吗?很难吧,但是GNU Toolchains 可以。从源代码编辑(vim) 、预处理(gcc -E, cpp) 、编译(gcc -S)、汇编(gcc -c, as)、链接(gcc, ld)的整个过程可以看得一清二楚。

可以用binutils 提供的一序列工具readelf, objdump, objcopy, nm, ld, as 理解什么是可执行文件,可执行文件的结构是什么样的,它包含了哪些东西以及那些所谓的代码段、数据段是如何组织的。

通过objdump ,可以反汇编一个有趣的可执行文件,看看它背后的实现思路。还可以看看为了支持动态链接,可执行文件该怎么组织。还可以进一步研究,一个程序执行时的细节,它怎么能够在屏幕上打印出来一个“Hello, World!”,这需要什么样的支持,这个背后的硬件、操作系统以及应用程序做了什么样的工作?

另外,还可以去看这些GNU Toolchains 的源代码。如果觉得这个东西太庞大。也可以去阅读刚才提到的那个天才:法布里斯·贝拉,他写的TCC (Tiny C Compiler),可以看到一个完整又小巧的C 编译器是如何实现的。

对了,笔者有写一个相关的博客系列,后面有整理成开源书籍,即上面提到的《C 语言编程透视》(https://tinylab.gitbooks.io/cbook)。

8.数据库

MySQL, PostgreSQL, SQLite? 在上学时,这些东西就很火,这么多年了,还是那么火。特别是那个小巧的SQLite,Android 都在用了。而且她小巧,可以学习那些SQL 语言背后具体是怎么实现的。

也许说企业级的Oracle, SQLServer 很好用啊,是的,她们是浓妆艳抹的贵妇,高高在上,在有钱人的圈子里打转,不会投怀送抱的,永远没有机会摸透她们的心思。

而“穷学生”如果希望深入地研究数据库,当然是选择 SQLite 这样的开源软件直接上手做实验。当然,很多新兴的 NoSQL 技术也值得关注。

9.计算机网络

回到虚拟化,用Qemu (当然,还有VirtualBox 之类),理论上可以创建任意多台虚拟的计算机,搭建任意多种不同的网络服务,创建一个复杂的集群,想做网桥,还是想做NAT,可以根据需要选。而且,大家也可以结合 Linux 系统,深入地学习和研究各种网络协议。

10.文档撰写

各种学习总结过程中,离不开文档撰写,包括幻灯片、文章甚至图书出版,毕业后还可能涉及到简历制作。这些统统可以用目前最流行也是最简约的Markdown 来完成,它允许彻底摒弃繁杂的格式限制,更多地沉浸到内容的创作中。学会Markdown 对于学习效率和专注力培养来说都会有好处。

11.其他

几乎所有的课程,都可以找到开放源码的实践项目。这样的项目一般都发布在公开的代码仓库托管平台上。这里推荐两家代码仓库托管平台,一家是国外的 GITHUB (https://github.com),一家是国内的 GITEE (https://gitee.com)。

                                       五、在线实验

实验环节往往是继续深入计算机课程的拦路虎。为了更快更高效地做实验,泰晓科技开发了一套开源的在线实验云台。这套平台已逐步添加了包括汇编、C、Linux 0.11、Linux、Uboot、Qemu 等在内的实验环境,更多环境正在陆续开发中。欢迎提出更多想法、需求和建议。

项目首页:http://tinylab.org/cloud-lab

代码仓库:https://gitee.com/tinylab/cloud-lab

有了Cloud Lab,以往要花几周才能搭建的实验环境,现在通常只需要数十分钟就可以获得,实验环境从此不再成为我们学习计算机这类实操课程的阻力。

                                           小结

以上从多个方面分析了学习Linux 相关开源技术的诸多益处。潮流一点叫“社区化学习”,国际一点叫“Open, Free, Share”,国内一点叫“共赢”,传统一点叫“三人行,必有我师”。

当下疫情防控已进入常态化,在家继续隔离和坚守的这段时间,我们不妨找一找开放的线上课程进行学习,找一找开源的线上项目源码开展实验,找一找相应的项目讨论群组跟各地的工程师请教和交流。坚持就是胜利,一起战胜疫情,一起练就网络自学技能。这段时间陆续有来自各个高校的同学们联系我,一起探讨和交流 Linux 相关技术,也欢迎各位学弟学妹添加我的微信(lzufalcon)进一步深入交流,添加时请务必注明准确原因。

祝一切安好,学有所成!

(作者简介:吴章金,兰州大学信息科学与工程学院校友,Linux Lab作者,Linux官方社区贡献者,先后任职于Lemote、WindRiver和魅族,长期从事嵌入式Linux理论研究和产品开发。目前在自主创业,致力于服务业界打造更优秀的嵌入式Linux产品。)

治学大家谈栏目

发现错误?报错
文:
图:
视频:
编辑:韩晶晶
责任编辑:许文艳

阅读下一篇