Alan Kay,曾就读于科罗拉多大学波德分校,2017、2018 年度最佳作者。不久前,他发起了“如何尽可能接近掌握软件工程”的大讨论,吸引了不少读者参与讨论。InfoQ 中文站翻译并整理成文,以飨读者。
“工程”是以一种有原则的方式制造东西——因此,肯定存在“软件工程”。
这一想法在 20 世纪 60 年代被阐述为一种“愿望”,因为计算机中已知的“原则性方式”与已建立的工程学科(民用、机械、航空、电气等)相比,并没有很大的可比性。
今天,很多计算机专家都会说,“软件工程”的定义仅仅取决于他们所做的事情(与“计算机科学”同理)。除去“愿望”,他们也删除了很多观察、批评和改进的动机和能力。对于这些人来说,“掌握软件工程意味着与当前的实践保持同步”。
我是一个老顽固,我更喜欢一种早期的、更严厉的、更开明的“愿望”,并且喜欢比较和思考如何让软件开发更接近于现有的工程。
已有的“工程学”领域本身的一个特点就是,它们已经被科学发明彻底改变了。将科学引入工程学领域花了相当长的时间:150 多年来,这个过程缓慢而艰难,但工程学现在是一种传统修补方法的混合,可以根据原理、数学模型和现代科学制造。后两者,尤其是后者,极大地改变了“用原理制作的含义”和“使用的原理和工具”。计算机的出现,特别是强大的交互式图形计算,恰逢其时,借助强大的计算机辅助设计工具、计算机辅助设计模型的仿真器,以及越来越多的直接由仿真审查的设计驱动的虚构物,推动了这一变化。
应该指出的是,用于工程学科的新计算机工具几乎总是比计算机人员在编写程序时所用的工具更全面!这具有强烈的讽刺意味。(有很多“黑屏仿真卡-甲板-玻璃-电传打字机”的屏幕在使用,这与当今电气工程或制造工程中的设计和制造方式形成了鲜明对比。)
再往深里说,大多数软件人只是在尝试制造虚构物,大多数工具都是虚构物工具:“软件工程”中很少有计算机辅助设计,更没有仿真。在我的老眼里,这并不像真正的工程过程。
换个角度来看,在目前的“软件工程”过程中,我并没有看到很多“数学和科学”。现在,我要把“扩展”这一概念搁置一边,只是说,如今计算机科学对“科学”一词还没有认真对待,这一术语根本就没有用处。整个短语,也就是“计算机科学”,也许更像是设计师的牛仔裤的标签而已。
现在让我来挑剔一下 "软件工程 "中的第一个术语。当今的许多软件系统都是某种形式的“遗留”,而且无论如何,它以变化的“刚性”(这与“软性”相反)和安全和完整性的“脆弱性”(这与“工程”的意义相反)为特征。实际上,情况正好相反。“软性”软件(以及从对“软性”软件的理解)所需要的就是在一个工件的生命周期中具有“极端灵活性”(“软性”是我们制造可编程计算机的原因)和“极端安全和完整性”。
这种组合有可能从根本上扩展到“软件工程”,我认为我们作为“有抱负的工程师”,主要工作就是让软件变得“极其安全、极端灵活”。
我认为这是一个重新思考这一切的良好起点。
在我看来,“软件工程”,正如已有发展的现有领域一样,应该积极地追求为其项目和领域本身找到“实际需要的东西”(What Is Actually Needed,WIAN)。因此,“掌握”是一个不断接近这一领域的理想的过程,并非一蹴而就。
部分网友评论
Dan Stark,DvOps。
我学会了怎样更好地估计一个任务需要多长的时间,并且达到我许诺的目标。我组建了团队,在回顾会上对代码审查和非批判性的反馈给与了诚实的评价,因为我希望我们的团队能够不断地更上一层楼。在与公司中的半技术或非技术人员交流技术话题时,我不会让他们觉得我在贬低他们。依我看,要想在软件工程中真正“卓越”,你需要在编程领域之外的许多方面取得成就。
Horia Tudosie,拥有 30 多年计算机程序员经验。
(节选)……我认为一个电气工程师如果不懂得编程,就不可能与计算机打交道(即使如此),事实上,成为一名软件专家要比成为一名硬件创新者要容易得多。
Nat Russo,在 MTV 播放第一个视频之前就开始写代码。
不是这样的,让我来解释一下。
当我还是一个国防承包商的时候,我和军队里的人闲聊时学到了一句话:“不要混淆地图和地形”。
地图并没有真正改变。无论你所在的领域或所选技术的具体情况如何,都有一些久经考验的、真实的工程原则适用于整个领域。40 年前,程序员的工具箱里包含了一些工具,至今仍然存在:
数据结构
流程控制
迭代技术
经典算法
还有许多我肯定忘记了的东西,包括调试技术等等。
软件开发生命周期实际上并没有发生根本的变化。今天,我们把一些部件换成了不同的名称,但是却一点都不新。不管你用多小的时间单位来衡量,你仍然:
获取并分析需求
创建设计
经历设计调整阶段
实施设计
通过质量保证周期(迭代的错误修复/质量保证)。
根据组织的标准操作程序,进行产品发布。
无论你采用的是瀑布模式、螺旋模式还是敏捷模式,上述内容都是正确的。
今天令人困惑的不是软件工程的过程(“地图”)。它是快速变化的技术(“地形”),其中许多技术已经十分普及,并且将在不再需要(例如)知道如何用 C++ 编码的工程师之前,这些技术就会消失得无影无踪。
作为一名富有成效且有价值的软件工程师的途径就是注重(掌握)软件工程的原理。学会怎样学习。也许听起来奇怪,但这是一个工程师需要掌握的重要技能。学会迅速掌握新技术。请注意我没有说“学会如何迅速掌握某某新技术”。我并没有这么说,因为这最终是一件愚蠢的差事。有些人会走这条路,而且做得很好。我们称这些人为大师。我们的行业并不需要一个充满大师的世界。它需要一个充满优秀工程师的世界。
专注于并掌握单一技术的危险在于,你要依靠预知能力来决定你的职业生涯能否持续。“鲍勃的编程语言”可能在今天和未来 24 个月内风靡一时。你也许能在 6 个月内掌握“鲍勃的编程语言”。36 个月后,当 “弗雷德的编程语言”大行其道时,你该怎么办?正如我所说,傻瓜才会做。
但如果你花费了大量时间来掌握软件工程的原理和过程,那么在“鲍勃的编程语言”大师们在餐车上卖玉米饼之后,你还会被雇佣很长时间,因为你已经掌握了技能,可以掌握你现在的雇主需要的任何特定技术。
因此,我并不赞同文章的观点。掌握软件工程在几十年前和今天一样难。因为软件工程的基本原理并没有改变。
每六个月,作为一名软件工程师,都要重新塑造自己。当我们从一个问题领域转移到另一个问题领域时,它一直是一个“变色龙”。这一直是关于有能力迅速成为一个主题专家。它一直是关于通过批判性思维和综合抽象概念的能力来解决复杂问题。
它从来都是关于技术的。技术来来去去。不要把它与技术挂钩。让它与软件工程的原则有关,你就会有一个成功的职业生涯,并以寿命来衡量。
Barbara Robson,研究科学家(水生生态系统建模)。
我不认为硕士学位是一个骗局,但我可以提供一个澳大利亚的观点,说明为什么有些人持这种观点。
在澳大利亚,专业学位(成为工程师、医生、律师、牙医、兽医等所需的资格)传统上都是本科学位。这些专业学位比基本的文学士或理学士更长,可能是 4 年、5 年或 6 年的工程学士、法律学士、医学学士/外科学士等。提供硕士学位,但主要限于 MBA(旨在为商业领袖在工作中确立自己的地位后提供进一步的管理教育)和哲学硕士。(一种研究学位,有时被认为是一种流产的博士学位。)
当澳大利亚高校开始建立其国际市场时,它们首先提供传统的学士学位,收取的费用比国内学生高。国际学生很快就成为许多大学收入的主要来源,并为研究活动提供了交叉资助,从而使大学得以扩张。目前在澳大利亚的一些大学中超过 30% 的学生是国际学生。
国际学生带来了对硕士学位的新需求。虽然在澳大利亚相对较新,但专业硕士学位却被国际上广泛认可。许多潜在的付费国际学生已经在本国获得了学士学位,他们希望获得澳大利亚的学历,以获得更广泛的认可,但又不想从头开始再读一个本科学位。还有一些学生只是想获得一个两年制的学位,以帮助他们在澳大利亚立足,并为获得永久居留权做好准备。我还想补充一点,对许多学生来说,在国内完成学士学位,然后在澳大利亚获得硕士学位,要比在澳大利亚获得一个(更长的)学士学位更经济,而且还能得到更高层次的资格,来自一个学位普遍受到国际认可的国家。
尽管这些学位确实填补了一个宝贵的空缺,还有一种观点认为,学士加硕士的模式比专修学士学位能培养出更成熟、受教育更广泛的专业人士,但是澳大利亚的一些学者,尤其是那些在其他方式下成长的老学者,对目前所提供的硕士学位持嘲讽的态度,视之为简单的增收手段。完成一个本科学位,然后再获得一个更专业的硕士学位,要比从获得学士学位的第一天起就开始从事你的专业工作要花更多的时间,并且会给学校带来更多的学生费用。例如,传统的专业工程资格是 4 年制工程学士学位。新的模式(与传统模式同时提供)是 3 年的理学士,重点是工程学,再加上 2 年的工程硕士:这就是 5 年的学费,而不是 4 年。如果学生在 3 年的理学士期间没有完成正确的基础学科(或没有达到足够高的水平),则可能需要更长的时间:不是 2 年的硕士学位,可能是 3 年或更长。
一些大学现在也提供不颁发专业资格的硕士学位(包括工程硕士学位)。对这些学位有需求,因为它们可以在一两年内完成,即使是那些在所学专业方面没有足够背景的学生,在这段时间内,也能把他们培养成专业水平。我听说这种硕士学位被轻蔑地称为“公关学位”。有些人认为,大学不考虑学生的成绩,只管收取学费;学生们为了获得永久居留权,不惜一切代价接受这些课程。我不确定这样是否有效,但我不了解公关法。
Amin Ariana,Google 员工。
是的,我知道这里有很多人都没有计算机科学学位。很多地方都对软件工程没有学位要求,包括谷歌公司。学位只是证明你有能力的一个很好的信号。假如没有学位,但只要你能证明自己的能力,你还是有很大的机会。虽然我必须说,没有任何工程学科的教育背景,但它也可能是一个信号:这些能力对你来说并不重要,而我所说的“其他”人,拥有诸如电子或机械工程等其他学位,并且/或者已经成为黑客爱好者已经很长时间了。
所要求的能力通常是:(a)你能理解计算机科学的基础知识,并通过争论某种算法设计与另一种算法的优点而得到证实;(b)在有限的时间内,你可以用代码解决问题。
在没有学位的情况下,找到一份软件工程师工作的最佳方式是:
1. 把你解决问题的代码示例放在网站上(个人网站或使用那些对你编码能力进行排名的新网站)。
2. 找几个已经在你想要工作的地方的工程师来阅读你的代码并给出反馈(在你的学习中反复研究,根据这些内容采取行动)。
3. 让他们真正相信你的能力,社交礼节在这里没有任何价值,而且绝对要确保他们坚定地相信你擅长这方面。他们需要能够在你不在的时候给你排名,并在下面签上他们的名字,所以不要自欺欺人地认为只是得到一个“Yes”。问问他们:“你认为我具备足够的额能力,连续给五个面试官留下深刻印象吗?”并认真听取反馈意见。
4. 如果他们说你已经准备好了,就请他们给你写一份你想去的公司的推荐信。假如你真的了解你的游戏(强大的编程技能),你会比你想象的更快地通过这个过程。甚至没有人会问你是否有学位。因为强大的程序员是一个“稀有的品种”。
关键在于衡量 "强大的编程技能"。大多数拥有学位的人,甚至是计算机科学的博士,在评估自己的编码能力时,都会受到达克效应的影响。实际编码能力是书本理论与长期实践的结合,仅仅取得一个学位是不可能学会的。在“筒仓”中编写大量代码也是不可能学到的。这是一种将好奇心结合起来,从理论上讲更好的编码方法,并热情参与编码,以解决大量你感兴趣的问题。这样,构成编码技术的类比就像在雨天骑自行车一样直观。
不要落入窠臼。不要止步不前。
你的手艺比一张纸更有说服力。
Bill Brubaker,亚利桑那州州立大学软件工程学士。
(节选)……“工程师”意味着严格的高等教育,侧重于数学和项目管理。工程师运用工程科学和科学知识,确保按时、按预算、高质量地解决实际问题。
“开发者”是“工程师”硬币的另一面,其重点是制造东西的艺术——通常需要很长的学徒期——而不是严格的科学。人们对质量、预算和及时性仍有很高的期望;传统的项目管理往往受到挑战或被完全抛在一边。
……“软件工程师”是 Margaret Hamilton 在美国国家航空航天局工作时创造的一个短语和职业,当时她主张要比单纯的“程序员”有更高的报酬。
在 20 世纪 40 年代和 50 年代,男性是计算机工程师或科学家,而输入代码的人,通常是女性,是“程序员”。男性通常受过大学教育,而女性则在贸易学校或上岗培训受过教育。
“计算机科学家”是为那些有更多学术背景的人而设。(而且,在 20 世纪 50 年代和 60 年代,美国政府向大学提供了更多的资助,并且为那些拥有“科学”项目或“科学家”作为雇员的公司签订了合同。“计算机科学家”就这样诞生了。)
我想,“开发者”这个词,应该是在软件工艺运动中的产物。开发者与房地产开发商没有什么不同:组织、专业化和项目管理。(听起来就像一个不同的工程师,但也许没有那么多的数学知识。)
……大多数人,即时是在大厂,并不知道在术语上的区别,也不在乎,这最终意味着他们的“开发者”和“软件工程师”概念完全是武断的。
Leslie Foster,软件工程师/开发者(1988 年~今)。
我个人的观点是:获取可靠的反馈。理解诸如可维护性、安全性、可扩展性、可读性(特别是)、部署和性能 等 “非功能性需求”。这些不一定是按重要性排序的。这并不是一个详细的清单。
你希望在代码之上(“代码”)了解源代码是如何影响这些非功能性需求的。许多非功能性需求必须通过将代码分解为子问题来满足。“关注点分离”是经典的计算机科学概念,在这些关注点中就有非功能性需求。与此相反的问题可能就是,仅仅满足于某件事完全起作用。随后,如果其他人无法对代码进行维护,或者该代码无法在可有效使用的地方部署,则此方法不可行。
而我认为将程序员和软件工程师区别开来的一种方式是,我喜欢将程序员和软件工程师区别开来,一种方法是,使用 “工程思维”,质量就有了,代码才能得到执行。你可以抛弃过去的努力,为正在进行的一些新的努力而抛弃,而不必觉得你是在质疑之前做的事情。或者你可以将其替换为从某个库或其他依赖项中编写的内容,并且以此为荣。当然,无论你写的是什么,都会是最好的,但你要能够接受别人的批评,并随着时间的推移不断完善。由于外界的进步,即使是优秀的代码也会被淘汰。如果时间到了,你可以把代码丢在一边。
Lambros Photios,Station Five 首席执行官。
掌握软件工程大概就是从中级程序员过渡到高级程序员或技术领导。也就是说,能够管理一个团队或非常独立运作的人。此外,掌握软件工程并不涉及学习更多的编程语言或库,因为有太多的语言需要学习,可以说专注于少数几个语言将有助于提高你作为一个程序员的整体专业知识,而不是为了学习而学习更多的语言。
有了这个先决条件,一个人如何进行过渡呢?
我一直认为,有两个主要的学习内容可以将中级程序员与高级或技术领导区分开来。这两点是:
实际接触
沟通
让我们把这些东西分解得更详细一点。
实际接触:
作为程序员,你可以从理论上学习,这将让你开始。然而,将优秀者与伟大者区分开来的是对各种技术问题的实际接触。由于编程是解决问题的,那么让自己接触更多的技术问题会让你学会如何解决这些问题,减少在未来遇到问题时解决它们的时间。那就像是要解决一个数学问题,一次又一次。编程也是一样,你接触的越多,你解决问题的速度就越快。不是说要重复同一个问题,而是要解决尽可能多的、不同的问题,这样你才能有更高的整体接触率,也能更好地解决未来的问题。
沟通:
向非技术利益相关者传达技术概念被低估了。你可以写出最好的代码,也有能力解决最复杂的问题,但是如果你不能用非技术的方式来交流技术概念,你就限制了你自己和非技术利益相关者的互动。在任何产品开发团队中,都有设计师、项目经理、产品经理、业务分析师,以及其他一系列的角色,这取决于团队的规模和行业。能够弥合技术和“其他一切”之间的差距是一项基本技能,它将中级程序员与高级人员和技术领导区分开来。
我希望这对你有帮助!
参考资料:
https://www.quora.com/How-does-one-get-as-close-as-possible-to-mastering-software-engineering
评论