本篇文章2886字,读完约7分钟
编者按:本文从三个方面论证了教材中的“软件工程”与实践中的“软件工程”的区别。有鉴于此,作者认为编写代码和做系统也许可以帮助学习者进一步提高对“软件工程”的理解。作者俞生,36岁,氪星人,被授权从微信公众账户俞生伟(id:Yuri-said)转载。
记者:本文的很多观点都来自于与奇牛云存储总设计师道格(李道兵)的讨论,在此我要向道格表示感谢。
高校计算机教育与时代脱节已成为共识。如果你想问哪门课程最落伍,我的答案是“软件工程”。尽管其他课程已经过时,但它们还是有些用处:虽然编程语言没有教你如何编写漂亮的程序,但至少它教你语法;虽然没有在线课程的可视化显示,但毕竟还是使用了通信协议;数据库课程不谈论数据库安装和调优,关系代数理论仍然是许多问题的原型;即使数据结构和算法似乎与开发没有直接关系,这个概念也不会有任何损失...
只有软件工程是例外。顾名思义,“软件工程”应该指开发软件的知识。因此,它并不名副其实:如果你遵循“软件工程”的教学,你大多数人不能开发软件,至少你不能开发好的软件。一方面,大量的毕业生不会写程序,也不会写好程序;另一方面,合格的“软件工程师”很少。不合格的“软件工程”造成了这种奇怪的局面。
不信?在写这篇文章之前,我特意查阅了流行的《软件工程》教材。共同的大纲如下:
可行性研究
形式描述
软件R&D模型
设计-实施-测试
面向对象的分析、方法和实现
软件生存期
项目管理
真正做过软件开发的人认为这些术语和他们自己的开发有多大关系?就我的调查而言,大多数人的回答是“没什么大不了的。”但是大多数人的日常工作显然是“软件工程”。那么,为什么这个“软件工程”与那个不同呢?有什么问题吗?根据我的总结,主要有以下几个方面。
教材中的“软件工程”是理论第一,而实践性的“软件工程”是实践第一。
理论的潜意识首先是切断现实世界,把它放入由预先定义的规范和定理支配的理想世界。早期的软件开发可以严格遵循这个程序。例如,银行的业务与关系数据库理论密切相关,所以我们需要做的是直接映射到复杂的(完美的)实体关系,并用数据库表来实现。因此,重要的问题是“分析”,即找到相应的理论模型,然后设计和开发它。
现代软件开发的环境完全不同。软件需要解决的不再是一个“经典问题”,而是一个复杂的实际问题。这类问题背后没有统一的抽象模型。比如现在流行的nosql,它的出现是因为人们发现很多问题不能用关系模型来解决。然而,对于什么是“非关系模型”没有理论上的答案,每个人都在不断地探索和总结它。虽然有一些中间阶段的解决方案,但不同的学校之间并不统一。由于没有理论,我们只能在实践中不断思考、探索和总结,及时关注行业的最新经验。不幸的是,这种工作方式并没有包括在“软件工程”的教科书中。
“实践第一”的另一个表现是,我们必须认识到软件运行的环境是不可靠的——用户不会按照手册中的严格规定使用软件,安装软件的操作系统可能缺少某个类库,软件运行的硬件环境往往是不可靠的...当我们说一个软件(或一套系统)运行良好时,通常可以肯定的是,他们已经提前考虑了各种异常情况,并准备了适当的响应计划。软件工程师的基本素质是能够在开发之前考虑各种异常和设计解决方案(“为失败而设计”)。不幸的是,《软件工程》教科书并没有教授这些品质。
教材中的“软件工程”是在单机环境中,而实际的“软件工程”是在网络环境中。
如果你仔细观察,你会发现在《软件工程》的教科书中,计算机的资源通常被认为是无限的,这给了开发者坚持下去的勇气。即使有与“工程”相关的考虑,他们通常也只是考虑这个过程。例如,在普通的图书馆管理系统中,尽管手动管理几十万本书的信息极其麻烦,计算机却极其简单,而且没有必要考虑内存、数据库、硬盘和处理速度的限制,所以在抽象思维的过程中可以忽略这些因素。自然,“软件工程”只需要关心项目管理。
然而,有实际开发经验的人都知道,一台计算机的处理能力远远不能解决计算机需要解决的问题。例如,网站的登录服务在模式上与图书馆管理系统没有太大的不同,甚至更简单。然而,激增的用户数量可能会很快超过单个表和单个库所能承受的极限。大量用户的集中登录将消耗大量的带宽和计算资源,并且登录信息的存储很可能超过单台机器的内存容量。这不包括必须准备的会话迁移,以避免会话保持服务器对用户体验的异常影响...
今天,随着移动互联网的推广导致数据和计算的爆炸式增长,几乎所有的程序员都必须从一开始就摆脱单机思维,从逻辑服务、抽象资源及其局限性的角度,掌握处理和解决问题的思维和工作方法。不幸的是,这种思维方式没有被教科书中的“软件工程”所涵盖。结果,大量的系统只能满足于小麻烦,它们不能应付业务的轻微增长。
教科书中的“软件工程”侧重于开发,而实际的“软件工程”则注重开发和维护。
如果你仔细观察,你会发现无论反馈和改进有多重要,教材中的“软件工程”总是侧重于“开发”。只要软件的分析是准确的,设计是恰当的,开发是标准的,大多数问题都会在交付后得到解决。至于在软件运行中会遇到什么问题,这是一个操作和维护的问题。如何管理软件缺陷是下一次升级需要解决的问题。总而言之,软件交付后,事情基本上就结束了。
然而,在实际的软件开发中,更准确的术语“交付”仅仅是“第一次交付”,还有几次后续交付。尤其是在时间紧迫的项目中,不可能有这么多时间来分析和设计,只能保证几个主要功能的正常运行。然后投入精力改进和完善这个“半成品”。对于优秀的软件工程师来说,这种权衡能力非常重要。不幸的是,许多人没有这种能力。结果,过度设计导致交付延迟,或者没有设计和计划导致改进和完善的困难。不幸的是,这种平衡能力在教科书的“软件工程”中没有涉及。
现代软件开发的另一个特点是,开发的结果不再是一个刻板的“软件”,而是一个需要不断维护和改造的“系统”。该系统不仅要根据实际运行环境不断优化,还要根据用户(而不是一次买卖的“客户”)的反馈迅速改进甚至改变方向。因此,一方面,优秀的软件工程师会关心系统的运行状态,不会把它扔给操作和维护人员去解决;另一方面,他们必须设计一个灵活和健壮的系统架构,并有勇气和耐心不断地投入精力进行维护和改造,有时甚至毫不犹豫。不幸的是,这种“不断完善”的工作模式并没有涉及到教科书中的“软件工程”。
一般来说,高校“软件工程”的教材与“工程”无关。当然,这是情有可原的,因为现代软件开发已经脱离了“计算机科学”,依靠自身的经验和实践形成了一门全新的知识。然而,无论是教材编写者还是课程教授都还停留在“计算机科学”的时代,对实际开发经验很少,对实际开发也不重视。不幸的是,老师和教材可以留在过去,但学生必须在现在的时代工作。因此,如果你现在在学院和大学学习计算机知识,你还不如写代码和制作系统。如果你坚持,你对“软件工程”的理解将远远超过对“软件工程”的理解。
这篇文章由读者提交,并不代表36英寸的立场。如果转载,请注明出处
“读完这篇文章还不够吗?如果你也开始创业,希望你的项目被报道,请点击这里告诉我们!”
标题:名不副实的 “软件工程”
地址:http://www.j4f2.com/ydbxw/5681.html