Skip to content

关于教育的一点感想

“我在康奈尔和上海交大为大一新生讲授同样的课程。我发现上海交大的大一新生要比美国
顶尖大学的更好。但4年后,我再次面对这些中国学生时,却发现康奈尔大学的学生已经超
过了他们。这意味着中国的大学教育并不成功。”

Read more

IT培训,实验楼及其他

可达书院建立的初衷就是为了做(在线)IT培训。自它建立以来,我也一直在思考在线培训究竟要怎么做才能有效率。就像那种面对面,一对一的培训一样的效率。 刚开始的想法(2008年左右)就是录制培训视频,通过让感兴趣者通过在线观看视频来学习。这种想法的出发点是,在IT技术学习中,尤其是偏重实战的技能,视频讲解比文字叙述更有效,更容易理解。 于是经过一年多的时间,录制了一套OpenBSD绝对新手入门的视频教程。 不知不觉又过了几年,开始觉得这样还不够。如果能一边看视频,一边练习所讲的知识点,这样效果会更好一点。于是希望将原来单纯播放视频的界面改为左边播放视频,右边是一个命令行界面。这样就可以一边观看,一边练习了。但是作为系统管理员出身的我,编程并不是强项。这个想法很久都未能实现。 后来又录制了OpenBSD快速入门视频,针对有一定Linux/Unix经验的朋友。 后来一个偶然的机会遇到了实验楼这个网站,感觉这个差不多就是我想要的样子,虽然它的教程以文字为主。于是我也在那里注册了一个账号,学习了几个课程。慢慢觉得这种方式还是有些美中不足,虽然相比纯粹观看视频的方式有了不少的进步。对我来说,这个不足主要在于:一,不能以我想要的速度进行学习(有时候想要快速浏览,有时候想要慢慢思考或者状态不佳,无力以正常速度学习);二,有困惑的时候没有人指点迷津; 于是我继续思考,究竟什么样的学习方式(或者培训方式)才能让效率最大化? 对于我个人来说,学习进度上最大的问题在于,当你有困惑的时候没有人给你指点迷津。你需要停下来,去搜索,去思考,去回头复习过去的内容,想要知道是否遗漏了什么东西。可能过了很长时间,你依然没能解开心中的疑问,学习进程就此被耽搁,或不得不带着这个疑问继续,以致于后面的学习效果大打折扣。 那么,如何解决这个问题? 目前我能想到的方案,就是学习时有个一对一的辅导老师,或者一个领路者。这个人知道你大概的经验,了解你对学习目标技术的了解程度,而他/她又这方面的实际经验。当你有疑惑的时候可以马上咨询,解开心中疑团(虽然有时候未必100%能够做到这一点)。面对面的答疑解惑是最好的,其次就是借助实时网络视频。 而在这几年里,随着虚拟化、云计算和容器技术的出现,出现了很多面向云计算/容器类的工具和平台,如较早一点的OpenStack,新一点的Kubernetes,Mesos,fleet以及SmartOS/Triton,CoreOS系统等等。这些东西注定要改变系统管理员(或者称为DevOps或CloudOps)的工作方式。 我自己也一直试图跟上这个趋势。为了学习这些新的平台和工具,自己也看了不少的视频,读了很多的文档/电子书,也花了很多时间折腾这些东西。在整个过程当中,我也感觉到观看视频未必就是最好的方式。有的时候你需要一本书,最好是纸质书,这样你可以快速浏览,一目十行,或逐字逐句,慢慢思考;有时候你需要视频,可以看到实际操作时究竟是什么样子(这个时候文字表达相对就比较无力了)。 还有一点就是,如果是视频,最好是未编辑修饰过的。我自己录制视频时如果出现意外情况,我就只能暂停录制,然后停下来排错,完成后再接着录。我觉得很多时候这个排错的过程也是一个非常宝贵的学习素材,让学习者能更深入的去了解这个技术的工作机制。只是这个过程可能需要很长的时间,不太适合视频录制。  

Read more

[翻译] 简谈编译、汇编、链接和加载 – part VI

Tanslated from: http://www.tenouk.com/ModuleW.html W.10  运行时链接器和共享库的加载 使用共享库的程序启动时或这一个程序请求动态加载一个共享对象时会触发运行时链接器。因此符号的解析可以在下面两个过程中的任一个完成。 1. 加载时动态链接。程序被从磁盘上加载到内存中,其中未解析的引用被列出,加载器找到所有需要的外部符号,把所有对这些符号的引用更改为相对于程序基地址的内存地址。 2. 运行时动态链接。程序被从磁盘上加载到内存中,其中未解析的引用被原样保留。第一次对这些符号的访问是无效的,从而引发一个software trap。运行时动态链接器侦测到此次trap的原因并找到所需的外部符号。然后这个被访问的符号被加载到内存并被链接到程序中。 运行时链接器包含在C的运行时库中,它加载共享库(.so文件)时会完成几个任务。动态section提供信息给链接器,告诉它这个库文件链接的其它库文件。它同时提供需要哪些重定位(reloaction)操作以及需要解析的外部符号。运行时链接器会首先加载需要的其它库文件。然后为每个库文件执行重定位操作。有些重定位仅限于库文件本身,而有些则需要运行时链接器解析一个全局符号。对于后一种情况,运行时链接器会搜索一个库文件列表来寻找这个符号。在ELF文件中,会使用hash table来进行符号的查找,所以这个过程是很快的。一旦所有的重定位操作执行完毕,就开始调用在共享库文件的init部分中注册的初始化函数。一些C++的实现使用这个特性来调用全局contructor。   W.11  符号名称解析 当运行时链接器加载了共享库文件,还需要解析库文件中的符号。这里,符号解析的顺序和范围是很重要的。如果一个共享库调用的函数碰巧在几个库文件中都存在,那么搜索这个函数的顺序就至关重要了。这也是为什么操作系统为库文件加载定义了几个选项。所有具有全局范围的对象(可执行文件和库文件)会被保存到一个列表中(全局列表)。默认,任何全局对象的所有符号对加载进来的共享库都是可用的。全局列表开始时包含可执行文件以及程序启动时加载的库文件。   W.12 动态地址翻译 以内存管理的角度看,现代的具有多任务的操作系统通常会实现动态重定位,而非静态。所有程序在地址空间中的布局几乎是相同的。这个动态重定位(以处理器的角度,称为动态地址翻译)产生一下的假象: 1. 每个进程都可以使用以0开始的内存地址,即使其它进程已经在运行了,或者同一个程序被启动多次 2. 地址空间是受保护的 3. 甚至可以让进程认为它拥有比实际物理内存大得多的内存可用(虚拟内存) 动态重定位中,每次引用地址都会动态变化。虚拟内存地址(或者称为逻辑地址)由某个进程产生,而物理地址则是运行时在物理内存中的实际地址。地址的翻译通常由处理器内嵌的内存管理单元(MMU)完成。 虚拟地址是相对于进程而言的。每个进程都相信它的虚拟地址从0开始。进程完全不知道这个地址在物理内存中的实际地址。代码完全以虚拟地址的方式运行。 如果一个虚拟地址超出了进程的(实际)地址范围,MMU可以拒绝翻译此地址,如产生一个segmentation fault。这为所有进程提供了保护。 翻译过程中,我们还可以把进程地地址空间中的一部分在内存和磁盘间移动(称为swapping或paging),这就是为什么进程可以使用比实际物理内存还大的地址空间。 动态重定位可以以下图来表示:   More complete related information can be found…

Read more

[翻译] 简谈编译、汇编、链接和加载 – part II

Tanslated from: http://www.tenouk.com/ModuleW.html W.2  对象文件与可执行文件 源文件经历汇编后会变成对象文件(文件名通常以.o为后缀),再经过链接后,就变成了可执行文件。 对象文件与可执行文件的格式有几种。如Linux上的ELF (Executable and Linking Format) 格式以及Windows上的 COFF (Common Object-File Format). 对象文件格式 描述 a.out Unix上最初的可执行文件格式.  它包含有三个块(sections):  text, data, and bss, 分别对应程序代码, 初始化过的数据以及未初始化的数据.  此格式无法包含排错信息。它能包括的唯一排错信息是被编码为一套带有不同属性的符号的、称为stabs的东西。 COFF COFF格式 (Common Object File Format) 由Unix SVR3引入 .可包含多个块, 每个块都有一个”块头(header)”. 块的数量是有限的.  COFF标准是包含排错信息的,但是也是有限的。此格式没有文件扩展名。 ECOFF COFF的一种变体. …

Read more

[翻译] 简谈编译、汇编、链接和加载 – part I

Tanslated from: http://www.tenouk.com/ModuleW.html 本文详细介绍了一个C/C++程序从源文件到进程的过程。但它仍然只是我的一个缓冲溢出教程的节选。本文试图解释C/C++源码如何经历预处理(pre-processed)、编译(compiled)、链接(linked)以及最后被加载(loaded)为一个运行的进程(process)的过程。文章基于GCC。如果你使用了某个集成的IDE编程环境,那么这些过程就被这些IDE隐藏了。   W.1  编译器(compiler),汇编器(assembler)和链接器(linker) 不管使用何种操作系统或编程工具,C程序的编译过程一般有四步:预处理,编译,汇编和加载,直至最后变为一个单一的可执行文件。 预处理:处理包含文件,条件编译指令以及宏(Macros) 编译:将预处理过的源文件编译成汇编语言文件 汇编:将汇编语言文件转成带有偏移量的机器指令(assembly listing with offsets)。结果存储在一个对象文件中。 链接:将一个或多个对象文件以及库文件组合成一个(通常是可执行的)文件。在这个过程中,链接器需要解决外部对象的引用,为函数或过程调用和变量分配地址,更改代码块和数据以匹配新的地址(relocation). 下表列出了源文件的扩展名及其需要进行的处理: 文件扩展名 描述 file_name.c C源文件,需要进行预处理 file_name.i C源文件。不需要预处理。 file_name.ii C++ 源文件。不需要预处理。 file_name.h C 头文件 (不需要编译或链接。). file_name.cc file_name.cp file_name.cxx file_name.cpp file_name.c++ file_name.C C++源文件。需要进行预处理 。对于 file_name.cxx文件名, xx 必须就是两个小写的字母x 而…

Read more

关于量化投资、IT及教育的一点随想

如果你在做股票, 你可能会意识到现在量化投资有越来越火的迹象。国内目前几个免费的量化投资平台,像米筐,优矿和聚宽等, 使用的编程语言都是Python。 我想要表达的意思是: 即使你无意从事IT行业, 你也应该学习一门编程语言, 熟练掌握一个操作系统的使用。而计算机或者是一个编程语言, 他们作为一个工具,对各行各业都有很大的影响。随着时间的推移, 这种影响会越来越大。 我也想就此再发挥一下, 聊一点青少年教育的科目问题。我对现在的学校教育最大的不满就是它们的目标。我觉得, 它们的目标是把学生, 我们的下一代, 培养称为一个合格的工人, 如果能让你毕业后找到一份工作, 他们就圆满完成了他的使命。而我理想中的教育, 是要把学生培养称为一个真正的人, 有能力, 有信仰,有追求,有同情心,有使命感。在现在的学校教育中, 我看不到这种迹象。 一个人要在社会上生存发展, 当然需要具备谋生的技能。所以教给学生们这些技能并没有错。错在学校把这个当成教育唯一的任务, 而且绝大部分的学校都在这样做。而且我并不认为国内的顶级院校就能免俗, 只是他们对“工作”的标准要求很高而已。 我觉得, 除了根据学生的特长和兴趣进行有针对行的技能培训以外,每个人从小到大都应该学习以下的内容: 如何了解自身, 了解“人”作为一种生物所具有的属性, 这涉及到生理学, 医疗保健或者说如何促进自身健康的基本知识。人类的心理特征, 性格的发展与形成, 人与他人或者说周围的环境如何互动,人类发展历史等。 了解我们生活的这个物理世界或者说自然环境。 这涉及到植物学,动物学, 天文地理, 数学、化学、物理学以及电子技术等等。 了解我们生存的这个社会。涉及的科目包括心理学(社会心理学, 犯罪心理学等等), 历史文化, 政治、经济以及宗教。…

Read more

一些关于链接和加载的博客

COMPILER, ASSEMBLER, LINKER AND LOADER: A BRIEF STORY http://www.tenouk.com/ModuleW.html   Linkers – part I (总共20) http://www.airs.com/blog/archives/38   Linking — chapter 7 of Computer Systems: a programmers’ perspective http://csapp.cs.cmu.edu/2e/ch7-preview.pdf

Read more

每个人都应该学一点经济学

记得以前看某一经济学家的自我介绍时他曾说,“我学经济学是为了不被其他的经济学家忽悠”。

我觉得这一点也很适合当前的社会。当投资,CPI,PMI,GDP等名词横行,利息不断变化,房价不断上涨的时候,了解一点经济学常识,掌握一些理财技巧,才能更好的适应这个时代。

Read more

系统管理员学习之路

前两天录制了一个视频,根据我自己自学的经历,谈一下如何成为一个系统管理员。

尤其是,对于从没有从事个这个职业的朋友如何了解现实工作中的系统管理员都会碰到哪些问题,从而获得一些“实际”的工作经验提供一些自己的思路。

Read more
Sidebar