构建之法 第三版 第3章 部分草稿 (剪牦牛毛、老程序员去金融公司的故事)...

/*

 * 这是 《构建之法》 第三版的草稿

 */

3.2 软件工程中的几种思维误区

正如我们在第一章讲的那样,软件有很多特性,软件开发有它自己独特的规律,如果不了解这些特性,软件工程师就会产生不符合实际的想法,在开发过程中走很多弯路。软件的模块之间存在着各种复杂的依赖关系,由于软件的不可见性和易变性,依赖关系很难定义清楚,并得到及时的维护和修复。对依赖关系的两种极端态度都会导致可笑的行为,并且无一例外地引起延迟交付。

被依赖关系束缚:一种极端是过于悲观,不想修复,出了问题都赖在相关问题上面,下面是工程师果冻和项目经理大牛之间的对话[XZ1] :

木桶有一个洞,  咋办啊, 大牛?

  修哇,果冻!

用啥来修啊,  大牛?

  用粗麻绳把它堵上,  果冻!

麻绳太长, 咋办啊,  大牛?

  用刀砍短啊, 果冻!

刀太钝,  咋办啊, 大牛?

      磨刀啊, 果冻!

磨刀石太干, 咋办啊, 大牛?

  拿木桶去取水啊, 果冻!

 木桶有一个洞,咋办啊,大牛?

不分主次,想解决所有依赖问题:另一种极端是过于积极,想马上动手修复所有主要和次要的依赖问题,然后就可以“完美地”达到最初设定的目标,而不是根据现有条件找到一个“足够好”的方案。我们还可以看一个小飞的故事:

              小飞早上醒来之后,发现宿舍的哥们都出门学习去了,他想起昨晚下决心要和哥几个一起每天去图书馆自习,连续奋斗一个月迎接考试!他拎着书包出门,发现自行车轮胎气不足,于是就去找隔壁宿舍的果冻同学借打气筒,果冻说他的打气筒昨天拿去她女朋友荔荔那里去了,但是他们俩昨晚吵架了,打气筒还在荔荔的宿舍里。小飞说我可以去拿!果冻说最好带个小礼物去;小飞问带什么礼物呢?果冻说荔荔说过她想要手织的围巾,小飞想牦牛毛的围巾最好了,于是小飞就开始剪牦牛的毛[XZ2] 。

过了大半天,同学们自习回来了,看到小飞,就问:你为啥要追着牦牛跑啊?小飞摸了摸脸上的汗水,喃喃地说,我也忘了,  我本来是要去上自习的…

过早优化:既然软件是“软”的,那它就有很大的可塑性,可以不断改进,放眼望去,一个复杂的软件似乎很多模块都可以变得更好。一个工程师在写程序的时候,经常容易在某一个局部问题上陷进去,花大量时间对其优化,无视这个模块对全局的重要性,甚至还不知道这个“全局”是怎么样的。这个毛病早就被归纳为“过早的优化是一切罪恶的根源”:

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified[XZ3] .

王屋村软件学院的小飞同学在下雨的时候经常打着一把很精巧的小雨伞,和同学们一起匆匆赶路。同学们提醒他:

  小飞,你这雨伞太小了,你的裤腿都湿了!

但是小飞还是打着这把小雨伞。几年过去了,在毕业酒会上,大家又谈起这个故事。小飞红着脸解释了原因:

  我原来想,如果有女朋友的话,两人在雨中打着很小的雨伞,她就会靠我近一些。现在我还是单身,我想起了“过早优化是烦恼的根源”。

过早扩大化/泛化(Premature Generalization):

软件的”软” 还表现在它可以扩展, 在写一个程序的时候,需要某个函数可以处理整数类型和字符串类型的信息。有程序员往往灵光闪现-- 哎,能不能把类型抽象出来,让这个函数处理所有可能的类型?这样不就一劳永逸了么?有些软件本来是解决一个特点环境下的具体问题,有程序员一想,我们能做一个平台,处理所有类似的问题,这样多好啊!这样的前景的确美妙,程序员的确需要这样的凌云壮志,但是要分清楚必要性,难度和时机。本书8.8.1 提到的画扇面就是一个很好的例子。

王屋村的程序员这几种错误做法放在一起,就构成了下面这个靓丽的风景线:

 

(在3.2 后面加一段)

3.3  软件工程师的职业发展

21 世纪以来,中国大陆每年招收六百万大学生,其中的百分之十是在学习各种IT 相关的专业(计算机科学与技术、计算机工程、计算机软件、软件工程、管理信息系统等)。扣除读研究生(最终大部分也会走上工作岗位)、出国等分流,同时考虑到培训机构给就业市场贡献的大量劳动力,每年大致有四十万到六十万左右的“软件工程师”进入工作岗位。他们都是以什么样的心态对待这一职业的呢?在工程师抱怨这个行业的同时,我们可以由低到高,看看人们对职业的态度有哪些等级:

1.        临时的寄托或工作 ( Temporary Work)

在大学你会看到很多人选IT专业的原因和“热爱”没有什么关系,有些人是因为专业调剂来到这里,有些人是因为要拿一个文凭作为敲门砖(例如,跨专业考上软件专业的研究生,然后计划以硕士的资格去考公务员)。 他们处于低动力, 低技能的状态.

2.        工作 (Job)

这就是一个能挣钱养家的营生,如果别的营生更赚钱,那就会跳到别的地方去。一些人留在这个职业,只不过是因为他不会做别的。这些人会经常问“软件开发做到35岁以后怎么办”这样的问题。当然,如果了解和体会了软件开发的投入和回报的关系, 这些人的心态会进步到下一个阶段.

3.        职业 (Profession)

在工作的基础上,能加上职业道德,职业规划。只有在这个层次上可以开始谈有意义的“职业发展”。他们对“30岁以后”、“35岁以后”都有一定的打算。

4.        投身的事业 (Commitment / vocation  )

把软件项目相关的目标作为长期的承诺,碰到困难也不退缩,一直坚持到完成任务。

5.        理想的呼唤(Calling)

一些人觉得这是理想的呼唤,通过软件可以改变世界,他们主动寻找机会,实现自己的理想。

很多读者会问,  我怎么知道这个工作就是我的事业, 或是理想的呼唤呢?  我上课、上班不用心,正因为这不是我想投身的事业,我想投身什么我也不知道,但是肯定不是正在学习的软件工程!

这些读者可以参考一下 Emanuel Derman 的故事,他从小喜欢物理,认为这就是“理想的呼唤”,在名校拿了理论物理的博士学位之后,非常想做“纯物理”研究,很看不起应用物理,更不用说其他工作了。但是由于经济和能力的原因,他不得不去一般的大学做物理老师,和家人两地分居,郁郁不得志。在35岁的时候(很多中国IT人士认为是程序员的职业终点),他改行做了贝尔实验室某不太重要部门的程序员,在那里领悟到了编程的优美和挑战;几年后他跳槽去华尔街证券公司做程序员,第一个项目是把交易员用的命令行程序改造为GUI 的程序(听起来也不是很高大上),也经常被资深的交易员呼来唤去,令人不爽。但是他坚持学习金融知识,做各种金融分析,逐渐成长为金融风险研究的专家,部门总经理(也被公司解雇过);最后在实践中把金融,数学,和软件融合在一起,在这个新领域提出了有广泛影响力的新模型,被评为金融界的“年度金融工程师”。他最后去一流大学开创了金融工程 (Financial Engineering) 这门学科。他回顾自己的职业经历时说:

回首当年,我(的态度)的确是错了。任何事情,当你仔细探究,你就会理解它的量和质;当你对一个领域的神韵足够了解,并开始连接这个领域的表现形式和实现细节的时候,任何一个领域都是会变得引人入胜的[XZ4] 。

再多说一句,这么多年之后,大家发现交易员的工作逐渐被程序和程序员取代了。 

如果我们对职业有认真的态度,那就能发现很多证明个人能力的方式。


 [XZ1]改编自儿歌<木桶有个洞>, 参见http://www.scoutsongs.com/lyrics/theres-a-hole-in-the-bucket.html 

 [XZ2]尾注:剪牦牛毛(Yak Shaving)是在国外编程编程界小范围流行的术语,描述为了间接地帮助实现一个目标,而做的一些次要而且和目标无关的工作。其中一个解释:http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html

 [XZ3]尾注:来源于Donald Kunth 的论文 Structured Programming with go to Statements, ACM Computing Surveys, Vol 6, No. 4, Dec. 1974 (p.268).

 [XZ4]尾注:故事来自《My Life as a Quant: Reflections on Physics and Finance》作者Emanuel Derman.  ISBN 0470192739.  翻译的文字出自其中第六章。Emanuel Derman的个人网站: http://www.emanuelderman.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代软件工程作业 – 计算最长英语单词链

结对编程 – 计算最长英语单词链 《构建之法》练习题 大家经常玩成语接龙游戏&#xff0c;我们试一试英语的接龙吧&#xff1a;一个文本文件中有N 个不同的英语单词&#xff0c; 我们能否写一个程序&#xff0c;快速找出最长的能首尾相连的英语单词链&#xff0c;每个单词最多只…

AI应用开发实战系列之一: 从零开始配置环境

AI应用开发实战 - 从零开始配置环境 与本篇配套的视频教程请访问&#xff1a;https://www.bilibili.com/video/av24421492/ 零、前提条件 一台能联网的电脑&#xff0c;使用win10 64位操作系统请确保鼠标、键盘、显示器都是好的 建议和反馈&#xff0c;请发送到 https://g…

usb连接不上 艾德克斯电源_第十二届(深圳)新能源汽车核心电源技术研讨会成功举办...

2019年4月26日&#xff0c;由大比特主办的第十二届(深圳)新能源汽车核心电源技术研讨会在深圳登喜路国际大酒店成功举办。本次会议受到了法雷奥、长安铁雪龙、比亚迪、蔚来汽车、麦格米特、科陆电子、欣锐、英威腾、晶福源、英可瑞、瀚美特、航嘉驰源、核达中远通、永联、优优绿…

AI应用开发实战系列之二:从零开始搭建macOS开发环境

AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问&#xff1a;https://www.bilibili.com/video/av24368929/ 零、前提条件 一台能联网的电脑&#xff0c;使用macOS操作系统请确保鼠标、键盘、显示器都是好的 建议和反馈&#xff0c;请发送到 https…

安卓能硬改的手机机型_手机后盖材质,金属比塑料的好,玻璃比金属的好,是这样么?...

从2000年至今&#xff0c;18年手机发生了巨大变化到现在&#xff0c;人们不再唯性能至上屏幕、拍照、材质、工艺等等也成了人们选购手机的标准手机后盖材质的发展史很好的见证了人们喜好的变化接下来我们来看手机后盖材质的演变史从手机的创造到手机的普及作为一个材料人我们经…

AI应用开发实战系列之三:手写识别应用入门

AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了&#xff0c;如输入法&#xff0c;图片中的文字识别等。但对于大多数开发人员来说&#xff0c;如何实现这样的一个应用&#xff0c;还是会感觉无从下手。本文从简单的MNIST训练出来的模型开始&#xff0c;和…

重力加速度换算_中考物理重难点汇总——公式换算大全

初中物理中最重要的部分就是公式了&#xff0c;在这之中公式的换算可以说是一个难点&#xff0c;也是一个重点。力学部分一、速度公式火车过桥(洞)时通过的路程s&#xff1d;L桥&#xff0b;L车声音在空气中的传播速度为340m/s 光在空气中的传播速度为3108m/s二、密度公式(ρ水…

新手一小时就写出人工智能应用 - 看图识熊

来不及了&#xff0c;先上车&#xff1a; 人工智能开发案例 熊的分类 如何安装必要的工具并配置环境呢&#xff0c;请看这个详细的解说 今后会有更详细的文字版在这个专题出现。 如果有对这个教程有疑问&#xff0c;请在这里留言。

c++ 线性回归_模型之母:简单线性回归的代码实现

模型之母&#xff1a;简单线性回归的代码实现关于作者&#xff1a;饼干同学&#xff0c;某人工智能公司交付开发工程师/建模科学家。专注于AI工程化及场景落地&#xff0c;希望和大家分享成长中的专业知识与思考感悟。0x00 前言 在《模型之母&#xff1a;简单线性回归&最小…

AI应用开发实战系列之四 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务&#xff0c;并能在UWP应用中集成定制化视觉服务模型。 前一篇&#xff1a;AI应用开发实战 - 手写识别应用入门 建议和反馈&#xff0c;请发送到 https://github.com/Microsoft/vs-tools-for-…

现代软件工程 结对/团队作业 - 汉字的 2048 + 俄罗斯方块

一个很有趣的软件工程/编程作业&#xff0c;如果把汉字构成的规律运用在 2048 俄罗斯方块这样的游戏中&#xff0c;会有什么效果呢? (链接1&#xff0c; 链接2) 既然是软件工程的作业&#xff0c; 那就要体现出一些工程的特性&#xff1a; 作业要求&#xff1a; 1) 学生自行…

机器学习平台建设

本文从机器学习平台的架构开始&#xff0c;再到具体的功能&#xff0c;然后从需求的角度带给读者思考&#xff0c;找到合适的机器学习平台建设之路。最后&#xff0c;推荐了微软开源开放的机器学习平台OpenPAI&#xff0c;是可私有部署的机器学习训练平台。 本文不少要点都可以…

型管件的作用_管道工程基础 - 管件和管道附件的布置规定

概述1.1 管件的用途1.2 管件的种类根据管件的端部连接形式可将管件分为对焊连接管件、承插焊连接管件、螺纹连接管件、法兰连接管件以及其它管件。管件和管道附件的布置2.1管件的布置(1)弯头宜选用曲率半径等于1.5倍公称直径的长半径弯头&#xff1b;输送气固、液固两相流物料的…

java grpc 客户端处理 go 服务端多返回值_grpc基础实践(二)

在此篇中我们将简要介绍关于grpc对java客户端的实现。在开始开发前&#xff0c;我们需要先导入io.grpc grpc-netty 1.11.0io.grpc grpc-protobuf 1.11.0io.grpc grpc-stub 1.11.0如果是Android除了这几个包外&#xff0c;你可能还需要一个javax.annotation:javax.annotation-ap…

asp.net 文本框显示xml格式数据_Excel 办公小技巧,查找和替换数据,您值得拥有...

在数据处理的过程中&#xff0c;有时需要在工作表中查找一些数据&#xff0c;以便查看或修改数据。若工作表的数据能一目了然&#xff0c;则可手动进行查找&#xff0c;但在记录繁多的工作表中查找所需数据并替换&#xff0c;效率比较低&#xff0c;而且极易出现遗漏。这时就可…

微软认知服务应用秘籍 – 与机器人聊知识

在本篇博客中&#xff0c;我们将会学习到零代码情况下&#xff0c;如何利用已有的技术建立自己的知识问答系统&#xff0c;这种系统的可以广泛适用于学校、企业、客服、政府公开信息等领域&#xff0c;代替传统的电话咨询、电子邮件沟通等高人工负荷的方式。 建立知识库 什么…

.net 开发怎么实现前后端分离_ASP.NET Core模块化前后端分离快速开发框架介绍

源码地址GitHub&#xff1a;https://github.com/iamoldli/NetModular演示地址地址&#xff1a;http://118.24.75.170:6220/账户&#xff1a;admin密码&#xff1a;admin前端框架演示地址(临时)地址&#xff1a;http://progqx5cu.bkt.clouddn.com/skins/index.html#/账户&#x…

微软认知服务应用秘籍 – 支持跨平台客户端的视觉服务中间层

不断演进的应用场景 初级应用场景—宅在家里 场景&#xff1a;Bob同学有一天在网上看到了一张建筑物的图片&#xff0c;大发感慨&#xff1a;"好漂亮啊&#xff01;这是哪里&#xff1f;我要去亲眼看看&#xff01;"Bob同学不想问别人&#xff0c;可笑的自尊心让他…

就业技术书文件表格_429页标准指南,教你如何管理工程监理文件资料,丰富图表一看就会...

房屋建筑工程监理文件资料的管理&#xff0c;参差不齐&#xff0c;也给监理工作带来了很大障碍。这份房建工程监理文件资料管理标准指南&#xff0c;能够帮助广大监理和资料员们实现监理文件资料标准化管理&#xff0c;能够有效地补充和支撑现场监理工作&#xff0c;对于工程资…

微软认知服务应用秘籍 – 君子动口不动手

概述 科技的不断发展带动着人们生活质量不断的提升&#xff0c;其中一方面就体现在日常家庭生活中&#xff0c;智能设备层出不穷&#xff0c;给人们的生活带来了很大的便利。 以电视为例&#xff0c;几十年前的电视还是按钮式的&#xff0c;每次换台还要跑到电视跟前&#xf…