如果您是程序员,请不要认为自己是“计算机科学家”。计算机科学家是创造下一代计算机的人,其中一些仍然是科幻小说,直到得出正确的材料组合,最小化和计算理论。它们只是管道的开始。在这里和现在开发软件的人都是“软件工程师”;他们采用理论和工具,有时将实践理论和现实世界工具放在顶层,以利用这种复杂的电子魔法的潜能发挥作用,并使其发挥我们的作用。反过来,这就是“计算机工程”领域的一种专业化,它采用了计算机科学家的理论,并将它们(包括硬件和软件)应用于实际的最终用户电子解决方案。
在IMO,这是业务与理论相遇的地方。在这种情况下,老话“好人为善”可以很容易地转向“好人为善”。将自己视为“工程师”而不是“科学家”,然后将您的工作与其他工程学科并行进行,就可以消除差异。
假设有一位客户来找您,一位土木/结构工程师,要求您搭建桥梁。这座桥需要跨越20英尺,支撑自身并承受一吨的负载,它需要持续10年的例行维护,他们希望在一个月内花费20,000美元。这些就是你的限制;达到最小值,但不超过最大值。这样做“足够好”,并获得薪水。建造金门大桥对您而言是一项糟糕的工程,远远超出了设计规格和预算几个数量级。您通常最终会吃掉超支的费用,并为超时而支付罚款。即使您仅花费1000美元的时间和材料,建造重量达5个成年男子体重的索桥,对您来说也是一项糟糕的工程。您没有得到良好的客户评价和推荐,
回到软件中,假设您有一个客户,该客户需要构建一个文件处理系统来消化传入的文件并将信息放入系统中。他们希望在一周内完成此任务,并且每天必须处理五个文件,大约10MB的数据,因为这是他们当前获得的所有流量。您的宝贵理论大都被抛诸脑后;您的任务是在一周内制造出符合这些规格的产品,因为这样做还可以满足客户的成本预算(因为材料通常是这种规模的软件合同的一部分)。花两个星期,即使是十倍的收益也不是一种选择,但是很可能,一天之内构建的程序都不能处理一半的吞吐量,并且指令要运行两个副本。
如果您认为这是一个边缘案例,那您是错的。这是大多数内部人员的日常环境。原因是投资回报率;这个初始程序不需要花费太多,因此可以很快收回成本。当最终用户需要它做更多或更快时,可以对代码进行重构和缩放。
这就是当前编程状态的主要原因。由整个计算历史证明的假设是,程序永远不会是静态的。它始终需要升级,最终将被替换。同时,运行程序的计算机的不断改进既减少了对理论效率的关注,又增加了对可伸缩性和并行化的关注(一种算法以N平方的时间运行,但可以并行运行在N核上,看起来是线性的,通常更多硬件的成本要比开发更有效解决方案的开发人员便宜。
最重要的是,有一个非常简单的原则,即开发人员代码的每一行都是其他可能出错的地方。开发人员写的越少,他写的东西出现问题的可能性就越小。这并不是对任何人的“错误率”的批评。这是一个简单的事实陈述。您可能知道如何用5种语言来回编写MergeSort,但是如果您只用手指在一行代码中使用一个标识符,则整个Sort都将不起作用,并且如果编译器未捕获它,则可能会带您进入几个小时进行调试。与List.Sort()对比;它在那里,在一般情况下是高效的,而且,最好的是,它已经可以工作了。
因此,牢记以下几点构建了现代平台的许多功能和现代设计方法的宗旨:
- OOP-将相关的数据和逻辑构建到一个对象中,并且该对象的概念在任何地方有效,因此它是对象,或更特殊的派生。
- 预先构建的模板-好的60%或更多的代码是语法缺陷,也是使程序在屏幕上显示内容的基础。通过标准化和自动生成此代码,您可以将开发人员的工作量减少一半,从而提高生产率。
- 算法和数据结构库-如上文所述,您可能知道如何编写Stack,Queue,QuickSort等,但是当有内置所有这些代码的代码库时,为什么必须这样做?您不会因为需要一个网站而重写IIS或Apache,那么,当有几种不错的实现可用时,为什么要实现QuickSort算法或红黑树对象呢?
- 流利的界面-同样,您可能拥有一种对记录进行过滤和排序的算法。速度很快,但可能可读性不强;您的初级开发人员将需要一天的时间来了解它,更不用说对记录对象的其他字段进行排序所需的外科手术更改了。取而代之的是,像Linq这样的库用一两行可配置的方法调用替换了很多非常丑陋的,通常是易碎的代码,以将对象列表变成经过筛选,排序,投影的对象。