一个软件开发者看起来像什么?
编程是一种工具,它是对一种针对基础和实践问题的基本工具,使得这些问题可以通过实践来测试、改进和应用。编程是思想和理论的实际交汇。这是计算机科学可以成为一种实践训练而不是纯理论,并且影响世界的原因所在。在这方面,和很多其他事情一样,编程必不可少的是训练和实践的良好结合。他不应退化为这样一种活动:只是编写一些代码,用旧的方式满足眼前的简单需求。
软件重要在哪里?
我们必须关注与代码本身相关的理想:我们的代码必须是可维护的,那些没有编写它的人可以理解它的结构和进行修改。一个成功的程序可以生存很长时间并经过反复修改。例如,它将会移植到新的硬件上,它将会增加新的功能,它将会修改以使用新的I/O设备,它将会用新的语言进行交互等。
只有失败的程序才永远不会被修改。为了保证可维护性,一个程序必须只与它的需求相关,它的代码必须直接体现要表达的思想。复杂性是简单性和可维护性的敌人,虽然有时候对于程序来说复杂性是必须的,但是也可能没有用代码清晰地表达出思想。所以我们必须通过编程风格来尽量避免它。
为啥么软件开发困难?
编程基本上是简单的:就是告诉机器你打算做什么。但是为啥么编程中要面对很多调整?计算机基本上是简单的,他只能做很少的几种操作。问题是我们并不希望计算机做简单的事情。我们希望“机器”帮助我们做那些难以完成的事,这个世界比我们所相信的更复杂,因此我们并不能理解自己需求的实际含义。我们只希望一个程序能够“像这样做一些事情”,但是我们并不希望被技术细节所困扰。
我们通常假设“基本常识”。不幸的是,人们认为很普通的基本常识,在计算机中通常完全不存在。这种思路导致的想法是“编程就是理解”:当你需要编写一个任务时,你需要理解它。相反当你彻底理解一个任务,你可以编写程序去执行它。换句话说,我们可以将编程看做努力彻底理解一个课题的一部分,程序是我们对一个课题理解的精确表示。
当你在进行编程时,你会花费很多时间尝试理解你试图自动化的任务。
软件开发几个阶段?
分析:问题是什么?用户想要做什么?用户需要什么?用户可以负担什么?我们需要哪种可靠性?
设计:我们如何解决问题?系统的整体结构将是怎样的?系统包括哪些部分?这些部分之间如何通信?系统与用户之间如何通信?
编程:用代码表达问题(或设计)求解的方法,以满足所有约束(时间、空间、金钱、可靠性
等)的方式编写代码。保证这些代码是正确的和可维护的。
测试:系统化地尝试各种况,保证系统在所要求的所有情况下都能正确工作。
编程和测试相加通常称为实现。
很明显,将软件开发简单分为四个部分是一种简化。需要说明的一件重要的事情是开发的这四个阶段并不是独立的,并且不一定严格按照顺序依次出现。我们通常从分析开始,但是通过测试的反馈有助于对编程的改进;编程工作带来的问题可能表明设计带来的问题;按设计进行工作可能发现在设计中至今仍被忽视的某些方面的问题。系统的实际使用通常会暴露分析中的一些弱点。
这里的关键概念是反馈。
经验的重要性
我们从经验中学习,根据学到的东西改变我们的行为。这是高效软件开发的根本。对于很多大的项目,我们在开始之前不可能理解有关问题的所有事情和解决方案。我们可以尝试自己的想法和从编程中得到反馈,但是在开发的早期阶段更容易(更快)从设计方案的书写、按设计思路编程和朋友的使用中得到反馈。我们知道的最好的设计工具是黑板。你要尽可能避免独立设计。在已将设计思路解释给其他人之前,不要开始进行编码工作。在接触键盘之前,与朋友、同事、潜在用户等讨论设计和编程技术。从简单尝试到阐明思路的过程中,你所学到的东西是令人惊讶的。最终,程序只不过是对某些思路的表达(用代码)。同样,当你实现一个程序时遇到问题,将目光从键盘上移开。考虑一下问题本身,而不是你的不完整的方案。与别人交流:解释你希望做什么和为什么它不工作。令人惊讶的是,你向有些人详细解释问题的过程中经常会找到解决方案。除非不得已,否则不要单独进行调试(找到程序错误)!
作为打工人的重点是实现,特别是编程。我们不讲授“解决问题”,以及提供有关问题的足够例子和
总结
很多问题的解决是认识到一个已知的问题,以及使用一个已知的解决方案。只有当大多数子问题以这种方式解决后,你才可能专注于令人兴奋的和有创造性的“跳出固有模式的思维”。因此,我们重点学习如何用代码明确表达思路。
编程是实践和理论相结合的。如果你只重视实践,你将制造出不可扩展的、不可维护的程序。如果你只重视理论,你将制造出无法使用的玩具。
微信公众号扫描图片关注