各位老师,同学,大家晚上好; 非常荣幸,有这样一个发言机会,将自己参加这个训练营的收获以及感想向大家做一个汇报;
我主要表达三个方面内容:1. 参加训练营的初衷,2. 经历训练营的收获, 3. 对训练营的期待
我与训练营结缘可以用三个关键字表达:python,rust,robust(鲁棒性)maintainable(可维护性)
我先简单介绍一下自己的情况,不同于在校生,我已经参加工作7年了,目前在上海一家量化私募从事编程相关工作;
我本科是化学专业,研究生是力学专业,从就业的角度,这两个都是天坑专业;
因此工作后兜兜转转,大概花了三年时间找到自己的工作方向,决定以后从事“量化”工作,于是从2018双十一开始自学编程,因为之前在校以及工作都没有编程经历,算是正经0基础自学编程;
比较幸运的是18年python已经比较流行了,令编程的自学曲线相对缓和,这是第一个关键字python;
入行量化,首先进入的是数字货币量化领域,工作中有一段时间要研究币的流向,需要研究币的底层代码,这就绕不开Solidity这个合约编程语言,而solidity背后是Gavin Wood;
如果对区块链有所研究的话,就会发现,在区块链行业的底层实现技术领域,这个家伙是绕不开的一个高人;
举几个简单例子:
有一本书叫The Infinite Machine,讲的是以太坊的创建历史;众所周知V神是以太坊的灵魂人物,不过V神是提出了一个思想架构,不是具体的实现者;当以太坊的创始团队在迈阿密的大别墅里开party庆祝以太坊横空出世的时候,Gavin Wood才刚加入这个队伍,他问创始团队,节点写好了么,才发现这个创始团队中仅有两个人会编程,V神是其中一个,V神说他正准备用Python实现一个,也就是说以太坊的团队在庆祝一个还没落地实现的项目,于是在其他团队成员开香槟庆祝的一个还未实现的以太坊的同时,Gavin Wood一个人在别墅的厨房用一星期时间实现了第一个版本的以太坊初识节点;
第二个例子,在以太坊节点中GETH,和Parity是主要的节点实现形式,Geth是用go语言写的,占比90%,Parity是用Rust写的,占比7%左右,这是之前的数据,现在的我没有在关注;以太坊历史上发生过两次比较严重的网络阻塞事件,问题都是Geth发生了内存泄漏导致的,当Geth泄漏崩溃的时候,缓慢运行的以太坊网络就是靠用Rust写的Parity在支撑着,而这个Parity又是Gavin Wood实现的。
而solidity本身也是大量借鉴Rust思想;
也就是说区块链这个直接的金融产品,是用rust在进行可靠性支持;
我也因此关注rust,将精力转移到rust上面,这是第二个关键字rust;
随着工作中事情越来越多,业务越来越深入,自学编程的局限性就体现出来了:
代码的规范性不够,我写的代码,同事看不懂;
鲁棒性不够,代码经常出错,对于金融公司来讲,错误的风险是很高的;
可维护性不足,经常是新加一个产品,我所写的代码需要大量的修改;
因此后来又学习了很多重构、软件工程、编程范式、编译器等等知识,包括潘爱民老师的程序员的自我修养等等;
虽然编码水平有所提升,但是问题依然层出不穷;
后来与编码水平较高的同事交流后发现,他可以从计算机更底层进行思考,而我只能从编程语言的语义层面来思考,因为我不了解底层,所以深入不了;他跟我将解耦合,流式架构,管道,信号量...我都不懂;
正当我有对计算机底层知识、编程规范等有所诉求的时候,发现了清华大学这个rCore训练营的项目,完美符合我的需要:计算机底层、rust编程、操作系统本身就是一个软件,他的可维护性、安全性、鲁棒性都是要求极高的,因此我就报名学习了。
因为基础薄弱,我报名后10.18就开始学习了,一直到今天12.15,大概50多天;收获良多,总结下来,有三点:
-
学会了从操作系统角度思考问题
我所理解的操作系统角度,就是用软件对硬件资源进行统筹调度,以实现效用最大化的思想;
自学编程过程中,对于中文表述的编程概念,总是难以厘清,比如进程、线程、协程,最开始学习的时候,我都是把区别写成卡片,随身携带,经常翻出来背诵,也还是稀里糊涂的,但是从计算机硬件资源的角度来看,就很容易理解了:区别在于所占用的硬件资源不同,在于切换的开销不同;
又比如以前总是想不明白,gdb是怎么调试编译语言的,都已经编译了,是一个整体文件了,怎么能打断点呢?现在明白,可以trap到另一个特权级,这就是很简单的事情了;
-
虚拟化,抽象,接口
操作系统本身就是一个软件,在编写操作系统的过程中用到的思想,或者说,在解决调度硬件资源的过程中进化出来的解决方案,是后续用户级编程软件的思想源头;
就像万有引力这样一个地球上的物理硬约束引申延展出来高楼大厦、汽车房屋的建造一样,作为软件的初始,操作系统的虚拟化、抽象等思想,是各类编程范式的思想源头;
以前觉得业务多样性导致编程困难,现在想,业务再多样,也不会比操作系统更复杂,如果不知道怎么编写某个程序,想想操作系统是怎么想的?怎么做的?
-
计算机与编程框架
我的编程基础、计算机基础都比较薄弱,相比于最终所需,50多天的训练营,所能带来的具体知识是远远不够的;但是训练营的目的,本就在于开启一扇窗,不在于提供一桌饭。
通过训练营的学习,让我对计算机、对编程这两个领域有了一个框架性的认识,了解了这个屋子里面都有哪些物件,后续用到了知道从哪里入手深入挖掘,这个是训练营对我最大的价值;
就个人诉求而言,实验指导书的内容组织形式,是足够的;
微信群的存在,也解决了学习疑问得到实时解答的期望,这里也感谢各位热心解答的助教及同学;
唯一一个小小的想法,希望微信群能建立“不要因为觉得问题简单而不好意思问”的文化,训练营的难度还是比较高的,对新手相对而言不算友好;
当然组织方会有其他的一些考量,这个还要看具体情况,只是个人一个小想法,作为基础薄弱的学员的,是有必要消除这个顾虑的,毕竟,愚蠢是必然的过程,容易满足才是人生的大敌。
最后,再次感谢各位老师、各位助教,各位同学,我的发言到此结束