`
helloyesyes
  • 浏览: 1304161 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

工程传奇 ------ 学徒布劳恩

阅读更多

维尔纳·冯·布劳恩(Wernher von Braun),V2飞弹的爸爸,红石导弹的爸爸,木星火箭的爸爸,土星系列火箭的爸爸,航天领域的先驱。在二战期间,是德国V2弹道导弹的主设计师;冷战期间,是美国航天发展的核心动力。如果没有他,美国人决不可能在短短的十年之内完成登月壮举。
在布劳恩的传记里,记载着一件有趣的事:布劳恩在大学里参加金工实习,为期一年。期间,师傅发给他们每人一个拳头大的铁疙瘩,要他们用钳工手段加工出一个 立方体来。所谓“钳工手段”,也就是拿锉刀锉。布劳恩他们按照师傅的嘱咐开始干。但当他们把完成的立方体给师傅看时,却被退回来,因为不符合要求,得重 做。如此一次又一次地重新加工,又一次又一次地被退回来。直到最后,铁块被锉成火柴盒大小的时候,终于通过了。
我大学里学的是机械,这金工实习也算是必修课。不过也就是3、4个礼拜的事,从未被要求把什么铁疙瘩给怎么样了。所谓钳工实习,也不过是把一小段方钢锯一 锯,锉一锉,打个眼,做成一把斩口榔头。也没什么严格的要求,基本上任何人3、4天都能通过。远远没有布劳恩经历的这种金工实习那么艰苦。
大概也就只有德国人会这样严格地培养工程师。但就是这种几乎不可理喻的做法,使得学生具有极其扎实的基本功,从而培养出能力超强的工程师来。
要说基本功很重要,这地球人都知道。但是如何加强基本功,则见仁见智。从布劳恩锉铁疙瘩的故事里,我们可以看到一个长久以来行之有效的手段——强化练习。 通过反复练习和实践,可以获得并强化知识与技能。一个学机械的学生,通过亲手加工一个物件,可以真切地了解材料的特性,工具的特点,以及很多教科书上无法 体会到的东西。哪怕就是那叮当作响的声音,也能让人对机加工有所领悟。而反复的强化训练,则可以在每次加工的时候逐步深刻地,更加全面地了解这些知识。

软件开发也是一种实践性很强的工作,扎实的基本功对于程序员而言,有着至关重要的作用。(除非你只想成为一个“代码农民工”)。经常会有一些新手抓耳挠腮 地无法解决一个问题,而一位老手则三下两下便将其摆平。绝大多数情况下,并非老手的智商高多少,而是他们拥有更多的经验和知识。这些经验和知识则是通过长 期训练和积累获得的。
很多新入行的程序员,为了使自己更快地成熟,大量的看书,却不时地流露出无所斩获的感叹。根本来说,也就是因为没有足够的实践训练所致。通过一定的练习,可以使我们对理论有更感性的认识,能够更快地吸收和理解事物。
前年,我心血来潮,打算认真学习编译原理。过去也看过一些书,但总是一头雾水。这回换了“龙书”,可还是找不着北。当时,为了先复习一下整体概念,wiki了一番。偶然间,发现一个比较语法分析生成器的条目,进而发现了GOLD。这个生成器本身没有很特别的地方,但它带了一个图形化的Builder。可以在其中撰写BNF,然后执行,解析一个样本。并且可以单步执行,看到每一个步骤。还能构造出相应的AST供查看之用。这就为我提供了一个很好的试验平台。
我在看书的同时,开始在Builder上练习。先从简单的四则运算开始,慢慢地增加难度。练习的过程比较辛苦,特别是开头,经常出错,找不到原因。随着练 习的深入,便慢慢地了解了语法解析的特性。直到有一天,实现了一个稍微复杂些的语法构造之后,我突然明白了LR的真正含义。
与此同时,我在一个项目里通过SAX读取xml。随着代码的不断深入,我开始对自己说:“哦,这东西看起来很像一个编译器啊,读到什么东西,就执行什么操 作。”想着想着,也是突然之间,我的脑子里划过一道闪电:“这‘读到什么东西’不就是解析么?这‘就执行什么操作’不就是Action么?‘龙书’上可都 写得明明白白,Syntax Directed Transaction啊,这回算是对上了。”
说实在的,如果不是Builder和那个读xml的任务,干看书,我可能永远无法理解编译原理的一些基本原理。(Builder功不可没,它把一段代码的解析一步步地展示出来,把整个解析过程的五脏六腑看了个一清二楚)。

但是,练习并非盲目地、机械地反复操练。每一次练习都必须有一定的目的和结果。每一次练习都必须从上次练习中的遇到的问题和不解开始,有目的地实践这些要 点。练习的过程中最重要的,却是思考。传统上,我们喜欢把动手(实践)和动脑(理论学习)分开,常常说:“这孩子动手能力很强。”言外之意:“这小子恐怕 读书不怎么样。”但实际上动手更需要动脑。且不说这手是靠脑指挥的,动手的过程中,如果没有正确的思考和分析,做出来的东西肯定是一坨烂屎。
在实践的时候,需要脑子不停地思考,甚至要比看书的时候更勤快。此时,脑子必须思考如何做?需要采取什么策略?背后的原理是什么?书上是怎么说的?等等。同时还需要不停地回忆过去所学的一些原理和理论。一样东西,只有用到的时候,才会真正试图去掌握它。
而且,练习也是一个迭代的过程。每次练习都有可能发现新的问题和不解,那么下一次就可以针对性地设计相应的练习。布劳恩他们每次提交作品的时候,师傅都会找出种种问题。而每次他们都必须找出造成问题的原因,加以改进,直到达到要求。
最近一位同事询问起关于函数的引用参数和值参数之间的差别。我颇费了一番口舌,也没能完全讲清其中的要点。倒不是他资质愚钝(他很好学,理解力也不错),也不是我笨嘴拙舌(我自信还是能说会道的),实在是这个问题很难几句话说清楚。最佳的解决方案,还是练习。
可以在C++里建两个函数,然后分别用int和int*做参数传递。然后编译,单步到函数里,看这个参数的地址和内容。此时如果回忆一下书上指针的定义, 很快就会发现两者的区别。如果还不明白,就在函数里为参数赋值,将参数解引用后赋值。这就很明显了。但是问题来了,int和int*类型不同,它们的访问 方式也不同,但在其他语言,象C#和java,引用和值的访问形式是一样的,它们的行为依然令人费解。这就需要做下一轮练习。
接下来,用int&做参数,代替int*。同样编译,然后单步到函数里。然后查看参数的地址和内容,此时便可以发现明显的区别。接着,还可以比较 调用函数时用的实参的地址和函数内参数的地址,便可以清晰地发现,int&参数是披着int外皮的指针。如果还不明白,可以再从另一个角度分析。
如果传递值,那么就需要把整个对象复制到函数的参数里,而传递引用,则只需要赋值指向对象的引用(指针)。于是,可以做一个类,放一个复制构造函数,并且 在其中设一个断点。然后用分别这个类和类的引用做参数,构建两个函数。再编译,运行。当单步进入函数式,用类做参数类型的函数调用触发了那个断点,而用类 引用做参数类型的函数调用则不会触发断点。这从另一个侧面证明了值类型参数是通过复制对象传递参数的,而引用类型参数则只是复制了对象的引用(指针)。
在此基础上,可以用不同的类型,不同的形式做些练习,直到突然间灵光一现,把心中的疑惑一扫而空。

实践和理论往往就是物和影的关系。有了理论,才有实践的方向;有了实践,才会强化对理论的认识。理论是实践的“精神领袖”,而实践是学习和巩固理论的“力 量倍增器”。通过合理的方法,可以用最高的效率方式实现对理论的理解。通过循序渐进的练习,则可以逐步地分解问题,从不同侧面观察和理解一个理论。我们说 学习有很多种方法,而实践在很多情况下是最有效的学习方式。

分享到:
评论

相关推荐

    电子功用-彩色布劳恩管的电子枪的聚焦电极及其制作方法

    《彩色布劳恩管的电子枪的聚焦电极及其制作方法》是一份深入探讨电子技术在显示设备领域的专业文档,主要关注的是彩色布劳恩管(Cathode Ray Tube,简称CRT)的核心组件——电子枪及其聚焦电极的制作工艺。...

    论文研究 - 精神损失时的精神两面:主题分析研究

    方法:在布劳恩和克拉克[1]主题分析指南的指导下,我们采访了8名在烟火事故中不幸丧生并符合纳入标准的亲戚。 结果与讨论:这项研究突出了主题分析中指出的两个关键结果:冲突和复杂的灵性,突出的是强烈的情感和...

    松下VP-5512P示波器的介绍及使用

    1897年,卡尔·布劳恩(Karl Ferdinand Braun)制造出了阴极射线管,这种管子后来被称为布朗管(Braun Tube)。阴极射线管的工作原理是通过电子束在荧光屏上产生可见光点,这些光点移动形成图像。 CRT的核心组成...

    WGS-84大地坐标转北京-54坐标java源代码;七参数、四参数;坐标转换

    5. **布尔莎模型**:是以匈牙利数学家布劳恩·米歇尔·布尔莎的名字命名的一种坐标转换方法,它可以处理三维空间中的坐标变换,包括平移、旋转和缩放,是地理坐标转换中的标准方法。 6. **投影**:地理坐标通常是...

    论文研究 - 巴勒斯坦植物区系稀有植物和生物气候

    此外,分类是根据1979年的布劳恩·布兰凯特(Braun-Blanquet)进行的; 我们在1979年将Braun-Blanquet物种的丰度-优势度值转换为Van der Maarel的值。在统计处理中,我们获得了53种植物(特有的稀有),如...

    嵌入式机器人学基于嵌入式系统的移动机器人设计与应用 [(德)托马斯·布劳恩(ThomasBraunl) 著]

    《嵌入式机器人学:基于嵌入式系统的移动机器人设计与应用》是由德国著名学者托马斯·布劳恩(Thomas Braunl)编著的一本专业书籍,它深入探讨了如何利用嵌入式系统技术来设计和实现智能移动机器人。这本书涵盖了...

    cacti中文手册.pdf

    帕斯纳克、吉米·康纳、莱因哈德·斯塞克、安德烈亚斯·布劳恩。 - **版权**:该手册版权归2017年仙人掌集团所有,遵循GPL许可协议。 #### 三、安装指南 ##### 1. 安装要求 - **硬件需求**:一般而言,Cacti对于...

    reignOfDke:2014 年麻省理工学院 Battlecode 竞赛机器人代码。作为马斯特里赫特大学知识工程系硕士课程“人工智能”期间的一个学期项目,在正式比赛后开发 (092014 - 012015)

    它是马斯特里赫特大学知识工程系 2014 年秋季硕士课程“人工智能”的一个学期项目。 交给项目主管的最终机器人包含在包“reignierOfDke”中(后来更名为reignOfDke) 几个在官方 Battlecode 中竞争的机器人被用于...

    航天器姿态控制系统设计讲义

    ### 航天器姿态控制系统设计讲义知识点总结 #### 1. 航天技术发展概况 - **航天技术的地位**: 航天技术作为现代科学技术的重要...对于从事航天工程及相关领域工作的人员来说,这些内容具有很高的实用价值和参考意义。

    the-sign-up-2

    # CraigsBook Craigsbook 混合:马的协同服务团队产品负责人:史蒂文布劳恩斯坦Scrum Master :贾斯汀埃尔南德斯开发团队成员:James Munsch目录[进入代码库] (#getting-into-code-base)用法克隆回购安装依赖启动...

    文档包含词向量的定义及实现方法

    - **布劳恩聚类方法**:根据单词前后语境的关联特征进行聚类,建立具有句法表示功能的二进制符号向量。 #### 五、总结 随着自然语言处理领域的快速发展,词向量的生成方法也在不断进步。从最初简单的统计方法如词...

    多媒体的学习资料全.doc

    - **CRT显示器**:基于布劳恩管的显示技术,具有较高的对比度和色彩表现。 - **液晶显示器(LCD)**:低功耗、平面型显示,适用于各种环境。 - **等离子体显示器(PDP)**:提供高分辨率和广视角,适合大型显示屏。 ...

    江苏专转本英语考试语法重点大全.doc

    - At his side lay Eva Brown.(在他的身边躺着的是爱娃·布劳恩。) 3. "here", "there", "now", "then" 等词开头的句子,如果主语是名词且动词是 be, come, go, begin, follow 等,也会用全部倒装,但若主语是...

    电子功能材料与元器件:6-1 光敏及光电器件概述.pptx

    阴极射线管(CRT)是早期的显示器技术,由布劳恩发明,最初用于示波器,后来在电视中得到广泛应用。CRT通过电子束在荧光屏上形成光点,并通过电场或磁场控制电子束的偏转,从而显示图像。尽管已被更现代的技术取代,...

    hashdist:HashDist环境管理系统

    散列主页: 文件: 教程: 代码: 邮件列表: HashStack(HashDist的软件包和配置文件): 维基: 命令行帮助: hit help或hit help <command> 作者: 阿隆·阿玛迪亚(Aron Ahmadia),沃尔克·布劳恩(Volker ...

    active-collections:主动集合的实现

    奥利维尔·博杜、阿诺·布劳恩、奥利维尔·巴莱、让-马克·耶兹埃克尔。 2010 年模型。斯普林格。 2010. 关于使用 active-collections 可以做什么的一些示例: ICollection<OInteger> a = new Bag(new ...

    信息显示技术的发展.doc

    CRT技术由德国科学家布劳恩在1897年发明,长期以来在电视和计算机显示器领域占据主导地位。CRT显示器因其优良的显示质量和较高的性价比而受到青睐。然而,其体积庞大、重量重、高电压和高能耗的缺点,逐渐被更先进...

    专题讲座2021-2022年屏幕和显示器的发展史.doc

    1897年,卡尔·布劳恩发明了阴极射线管,这是早期电视和电脑显示器的基础。CRT的工作原理是通过电子束撞击磷光表面产生图像。1907年,电场发光现象的发现为LED技术的发展铺平了道路。随后,苏格兰工程师约翰·洛吉·...

    马可尼的伟大发明.docx

    由于马可尼在无线电通信领域的卓越贡献,以及他对德国科学家卡尔·布劳恩的技术成果的应用,1909年,两人共同获得了诺贝尔物理学奖。这是对马可尼及其团队在无线电通信领域所做工作的国际认可。 #### 后续发展 ...

Global site tag (gtag.js) - Google Analytics