令人难以理解的软件工程师:几千行代码能搞定的为什么要写几万行?

640?wx_fmt=gif&wxfrom=5&wx_lazy=1


我们公司的 Windows 版软体已经有十多年的历史,经过历代工程师的整治之后,内容已经凌乱不堪。过去三个月,我找时间自己重写了整个主程序。原本数万行的程序,被我重写的只剩下数千行,功能不变,效能更好,而且架构俨然。


前几天完成 Alpha 版之后,我不禁开怀大笑,笑声惊动整个办公室。


在重写这个程序的这段期间,前两个月,我每周花在这个程序上的时间应该不会超过四个小时。后来我趁着农历新年没事干,跑到公司加班数天,但是一天写程序的时间也不会超过四个小时。


通常我白天写两、三个小时的程序,遇到瓶颈就去忙别的事,或者干脆回家吃晚饭,晚上睡觉前,躺在床上用手机查一下资料,第二天上班走在路上,就会很自然的想到不错的解法。


写程序是一种创作,不是做苦工,不能每天在电脑前面枯坐十几个小时,否则超时工作,只会让自己的脑筋变得更糊涂。


我所认识的许多写程序高手,每天写程序的时间都不会太长。

 

1995 年的时候,有一天在美国盐湖城,我陪着趋势科技的创办人张明正扶着他爸爸过马路,他突然跟我说:「宜敬,我实在搞不懂,在软体这个行业,一个优秀的工程师的产出可以轻易抵得上一、二十个平庸的工程师,但是公司最多只要付他两、三倍的薪水。那为什么还有公司愿意付钱雇用那些很平庸的工程师呢?」


当时我博士刚毕业,当然不知道要如何回答他的问题;而现在过了这么多年,我还是不知道要如何回答那个问题。


而当时张明正会问我那个问题,应该是因为我介绍了几位同学跟朋友到趋势科技工作。那几位都是以一当十、以一当百的高手。趋势科技当时没有给他们十倍、百倍的薪水,但是对他们也不薄,给了他们不少的股票。


后来趋势在日本上市,我那几位朋友都成了亿万富翁,财富应该超过一般工程师的十倍、百倍吧?

 

写一个大型程序,并不是「人多好办事」。


如果是土木工程或是制造业,人越多、产出就越大。如果一个计划延误了,就多调一些人手过来帮忙。


但是在软体工程里,人越多,就越是难以协调,写出来的程序也往往品质越差、效能越糟糕。


这就是有名的”The Mythical Man-Month: Addingmanpower to a late software project makes it later"。


IBM在1960年代开发OS/360作业系统软体时,就发现了这个奇特的现象。


所以我也搞不懂,大型软体公司雇用了那么多的软体工程师干嘛?

 

我在当兵的时候,有一阵子在台中十军团的资讯中心担任资讯官。那时候我手下有两名资讯科系毕业的大专兵,但是我嫌他们两人写程序写的太慢,而解释给他们听更是费事,还不如我自己动手写比较快。


所以我就叫他们到一边凉快,所有的程序都由我来写就好。而他们两人觉得很不好意思,就泡了很好喝的奶茶给我喝。


后来我们成了很好的朋友。

 

写程序并不是写的越长越好、越厉害。


我年轻在台大资讯工程系的时候,会跟朋友炫耀说:「我写的程序语言编译程序,总共有一万多行耶。」


后来我去美国布朗大学读电脑科学博士,毕业的时候喜欢跟朋友炫耀:「我的博士论文那个程序,功能那么强大,但是我只用了七、八千行程序就搞定了耶。」

 

二流的软体工程师,喜欢把简单的问题弄的复杂,写出别人看不懂的程序。


一流的软体工程师,喜欢把复杂的问题简单化,写出架构清楚明白的程序,让人看了之后,觉得问题好像很简单。


三流的软体工程师会去崇拜二流的软体工程师,因为他们会觉得二流工程师写的程序都看不懂,一定是超级厉害;


三流的软体工程师不会去崇拜一流的软体工程师,因为他们会觉得一流工程师所做的事情都很好懂,好像都很简单。


只有一流的的软体工程师才会佩服一流的软体工程师,因为只有他们才能看的出来,其他的一流软体工程师厉害在哪里?


台湾的软体业如此,美国的软体业也大致如此。

 

直到1980年代末期,IBM一直是世界上最大的电脑公司。而当时 IBM 找了一些原来是做硬体制造的高阶主管来管软体部门。


那些高阶主管依照他们管理制造部门的经验,决定用KLOC (thousands linesof code),也就是每位软体工程师每年写出多少行程序来计算软体部门的效率。


结果软体工程师们都「短话长说」,写出一堆落落长又没有效率的软体程序。

 

要成为一流的软体工程师,必须熟悉了解电脑科学的各种基础理论,也必须累积长时间的实务经验。


我在布朗大学电脑科学系读博士修课的时候,程序作业的份量非常重。上作业系统(OperatingSystem)课的时候,教授要我们每个人独立写一个包含File System与 Process System的迷你Unix作业系统;


上编译程序(Compiler)课的时候,教授要我们每个人独立写一个 Compiler,而且每一个模组还必须用两个以上的方法写,然后互相比较;


而上 Andy Van Dam 教授的电脑图学,那简直就是人间炼狱。当时助教发问卷调查,发现每位学生每周花在写那堂课的程序的平均时间超过四十个小时,学生们几乎要群起造反。


但是修过上述那三门课而没有被当掉、又拿高分的,就成了懂理论又懂写程序的高手、高高手。

 

当年我在布朗大学读博士的时候,我估计我们系上像我这种等级的写程序高手,大概有十来个吧?


但是我们系上公认最厉害的写程序高手,还是我的指导教授 Prof. SteveReiss。他一个人大概抵得上五到十个我们这种等级的工程师。


关于他的传说很多。有一次我去他的办公室找他,看到他正在玩接龙游戏。他被我发现了,有点不好意思,赶紧跟我说,他觉得 Windows 上的接龙游戏很好玩,但是他没有 Windows 电脑,所以就花了四、五天,利用零散的时间在他自己的 Sun Work Station 上面写了一个类似的接龙游戏,包含彩色的图像接口等等。


想玩电玩就自己写一个?我很想笑,但又差点在我师父面前跪了下来。

 

十一

我在布朗大学认识的那些软体高手,后来真正以写程序为志业,然后写出伟大又广泛被使用的程序的,应该不多。


因为有些人后来去当大学教授,教授通常是不会自己写程序的。久了之后,我不知道他们的功力剩下多少?


有些人后来为了拿高薪,去一些大公司写一些很没营养又很无趣的程序。久了之后,我不知道他们的功力剩下多少?


有些人后来进入产业界工作,没多久就升上了管理职,而管理职人员通常是不会自己写程序的。久了之后,我不知道他们的功力剩下多少?


所以程序高手原本就不多,而一直继续在写程序的程序高手就更是稀有了。

 

十二

美国的软体业有一个老笑话:如果有两个工程师在同一个团队,一个很会写程序,另一个很不会写程序,那后来升上经理的,一定是那个不会写程序的。


因为团队需要那个会写程序的留下来写程序。

 

十三

我写程序的功力最高的时候,应该是二十多年前我刚拿到博士的时候,那时候我又懂理论、又累积了大量的写程序经验。我不敢说自己能以一当百,但是以一当十应该是绰绰有馀的。


只可惜,没多久之后我就升上了管理职,而当上了经理、协理、总经理之后,如果还自己写程序的话,那是会被别人笑的。


所以我就不再写程序了,而且我也学会,要在自己的部门多摆一些工程师,否则阵仗不够大,会被别的部门瞧不起,也会被我的上司瞧不起。


二十年下来,我的功力大概只剩下两三成。

 

十四

我现在终于自己当了老板。而当上了老板之后,最大好处之一,就是我高兴写程序就可以写程序。就算有人要笑我,我也可以不理他们。

 

十五

我趁过年期间重写了我们公司的 Windows 主程序,完成之后,自觉功力已经恢复到当年的三、四成,不禁大乐。


不过我还是觉得,软体工程还真是一门很难以理解的行业。虽然我本身就是一个软体工程师,虽然我的博士论文研究的就是程序开发环境(Programming Environment),主题就是我在这边所说的这些问题。


本文源自网络,版权归原作者所有。


640?wx_fmt=png


640?wx_fmt=jpeg

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

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

相关文章

如何从 dump 文件中提取出 C# 源代码?

一:背景 相信有很多朋友在遇到应用程序各种奇葩问题后,拿下来一个dump文件,辛辛苦苦分析了大半天,终于在某一个线程的调用栈上找到了一个可疑的方法,但 windbg 常常是以 汇编 的方式显示方法代码的,可惜的是…

谈谈对IOC及DI的理解与思考

一、前言在实际的开发过程中,我们经常会遇到这样的情况,在进行调试分析问题的时候,经常需要记录日志信息,这时可以采用输出到控制台。因此,我们通常会定义一个日志类,来实现输出日志。定义一个生成验证的逻…

终于有人把云计算、大数据和人工智能讲明白了!

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

聊一聊如何在.NET Core中使用Nacos 2.0

前言 随着 nacos 2.0.0 正式发布&#xff0c;老黄这边也跟着发布了 1.0.2 版本的 nacos-sdk-csharp。下面简单聊一下相关的使用。纯 SDK 的使用 首先要安装 nuget 包<PackageReference Include"nacos-sdk-csharp" Version"1.0.2" />这里有一点要注意…

听说你刚转了Java?准备转回.NET吧!

牛年跳槽季如火如荼&#xff0c;敏锐点的小伙伴儿应该都留意到了&#xff0c;BAT新年都在招聘.NET。2020年11月份发布.NET5统一了七大应用方向&#xff0c;.NET6的2个预览版已经把Blazor升级、跨平台UI方案MAUI、CLR性能优化等都放出来了&#xff0c;.NET前景充满想象&#xff…

一个人开始废掉的3种迹象

1作家李尚龙说&#xff1a;“在大城市里&#xff0c;搞废一个人的方式特别简单。给你一个安静狭小的空间&#xff0c;给你一根网线&#xff0c;最好再加一个外卖电话。好了&#xff0c;你开始废了。”之前的我并不相信人会这么轻易地堕落&#xff0c;直到身边出现了一个真实的例…

WPF 动态更换图片路径

wpf中动态修改图片路径&#xff0c;其实很简单&#xff0c;有个小伙伴有疑问&#xff0c;绑定了source,为什么不能显示图片呢。。。通过绑定&#xff0c;修改图片路径&#xff0c;动态显示图片&#xff0c;效果如下&#xff1a;图片支持本地路径和网络路径&#xff0c;下面就来…

听说你在学习算法?清华教授为你准备了一份独家秘籍!

也许您渴望进入国内外IT名企&#xff0c;却屡屡在算法类面试中折戟&#xff0c;苦恼不知如何破解困境&#xff1b;也许您是一位IT工程师&#xff0c;却因为算法能力不足而错过无数次的升职加薪&#xff0c;困扰不知如何突破瓶颈&#xff1b;也许您是一位大学生/中学生&#xff…

用VirtualWifi软件实现无线网卡同时连接多个AP。

2019独角兽企业重金招聘Python工程师标准>>> 用VirtualWifi软件实现无线网卡同时连接多个AP。 随着信息技术的发展&#xff0c;越来越多的人开始使用便捷的无线路由器&#xff08;AP&#xff09;组建家庭局域网。当你发现你周围有多个AP可以连接的时候&#xff0c;是…

机器学习萌新必学的Top10算法

导读&#xff1a;在机器学习领域里&#xff0c;不存在一种万能的算法可以完美解决所有问题&#xff0c;尤其是像预测建模的监督学习里。所以&#xff0c;针对你要解决的问题&#xff0c;最好是尝试多种不同的算法。并借一个测试集来评估不同算法之间的表现&#xff0c;最后选出…

分支结构程序案例c语言,C语言学习之三——分支结构程序

运算符优先级&#xff1a;如下所示&#xff1a;image.png关系运算符和表达式关系运算符定义&#xff1a;在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。因此使用关系运算符进行比较(注&#xff1a;比较后的返回值为boolean值&#xff0c;即0或1(真为1&#xf…

诺基亚首款Windows Phone智能手机将在年内推出

诺基亚高级官员星期日称&#xff0c;第一款采用微软Windows Phone操作系统的诺基亚智能手机的目标发布日期将在几天之内确定下来。诺基亚的目标是在将这种手机推向市场。诺基亚负责智能设备的执行副总裁乔哈洛&#xff08;Jo Harlow&#xff09;称&#xff0c;诺基亚和微软的技…

IOT必备之MQTT结构分析,不进来看看?【后附源码】

全网唯一物联网MQTT协议报文结构分析以及基于C#代码的报文组装实现介绍MQTT是一种基于TCP/IP协议的应用层协议&#xff0c;它规定了不同应用之间进行数据交换时的传送格式。既然是协议&#xff0c;理论上可以被任何开发语言实现它&#xff0c;以运行在任何平台&#xff0c;这个…

要成为年薪五十万的数据分析师,除了技术还需要什么?

超过59%企业&#xff0c;将提高数据分析岗位数量----一流的数据分析师&#xff0c;年薪轻松突破50万想必同学们看到这个数据并不惊讶&#xff0c;如今在中国&#xff0c;各行各业对数据分析岗位的需求日益提高&#xff1a;在线社交媒体&#xff0c;希望通过数据时刻洞察用户关注…

c语言电脑蓝屏代码,电脑蓝屏代码0x0000001a的解决方法

遇到蓝屏&#xff0c;第一时间记录停机码&#xff0c;如有导致蓝屏的文件名&#xff0c;那么排查的范围就会缩小。下面小编就为大家介绍电脑蓝屏代码0x0000001a的解决方法介绍&#xff0c;希望能对大家有所帮助&#xff01;方法/步骤1、先看这张截图的停机码所在位置。STOP后面…

关于序列建模,是时候抛弃RNN和LSTM了

作者表示&#xff1a;我们已经陷入 RNN、LSTM 和它们变体的坑中很多年&#xff0c;是时候抛弃它们了&#xff01;在 2014 年&#xff0c;RNN 和 LSTM 起死回生。我们都读过 Colah 的博客《Understanding LSTM Networks》和 Karpathy 的对 RNN 的颂歌《The Unreasonable Effecti…

如何运用并行编程Parallel提升任务执行效率

本文来自小易&#xff0c;【DoTNET技术圈】公众号已获得转载授权。《.NET并发变成实战》读后感&#xff1a;并行编程Parallel手打目录&#xff1a;一、前言二、任务并行库&#xff08;TPL&#xff09;的介绍三、Parallel.Invoke的使用四、Parallel.For的使用五、Parallel.ForEa…

通过 GitHub Actions 自动创建 Github Release

通过 GitHub Actions 自动创建 Github ReleaseIntro在 GitHub 上维护了几个小的开源项目&#xff0c;每次在发布新版本的时候会创建一个 release&#xff0c;这样可以比较方便的找到对应的版本的代码&#xff0c;不需要再人肉的从 git log 中找到指定的 commit&#xff0c;而且…

利用win7的applocker功能来有组织的阻止相关软件运行

我有4年没用360相关的软件了&#xff0c;没有360的弹窗用电脑就是舒服。但是我的电脑有时候会有别人来用&#xff0c;我的同学或者我的父母。但是他们经常会自作主张地在我的电脑上装上360卫士&#xff0c;还有360浏览器。每次都是装了我再删&#xff0c;反反复复也不是办法。后…

人工智能会让工作环境变得更公平,还是更压抑?

人工智改变的不仅仅是工作内容……人工智能&#xff08;AI&#xff09;正在踏足商业领域。正如我们本周的特别报道所诠释到的那样&#xff0c;所有类型的公司都在利用人工智能来预测需求&#xff0c;雇佣员工和对付客户。2017年&#xff0c;企业在与人工智能相关的并购交易中支…