编码前的概念和设计:这是多少?[关闭]


14

我在学校和其他地方都学到,良好的开发方法在正确编码之前需要概念和设计。

即使对于初学者,这也不是一个新信息。但是,我想知道这是否是一个好的建议,因为自从我开始使用多种编程语言进行开发以来,自从开始以来就从未成功设计和构思过所有东西。

我的意思是,我总是融合设计,概念和编程。我是世界上最糟糕的开发人员,还是我们在学校学到的想法只是一种古老而毫无意义的宗教教条?

我们如何甚至可以构思和设计以前从未经历和编程的东西?是不是很荒谬?编程不是主导概念和设计吗?



@gnat您在此处提供的链接可能是对我的问题的一个答案。我认为这不是重复的问题。


13
没有计划能够幸免于与敌人的接触,但这并不意味着您不应该拥有任何计划。从计划开始,但不要害怕稍后修改
Richard Tingle 2014年

2
真正真正地理解问题的唯一时间是在解决问题之后,因此,只有理解了问题后,您才能更好地解决问题才有意义。但是您需要进行发现练习才能真正理解问题。
马特·克林克

Answers:


5

我认为答案必须是:尽可能地计划,但不能超过此。

很少有人会反对计划的优点,但辩论大多忽略了一个重要方面。计划仅在您具有制定良好计划的技能的情况下才能起作用,而该技能往往伴随经验。如果您没有太多经验,那么您草拟的任何计划都可能会遇到很多问题,这意味着,要制造出并非完全灾难的产品,必须在开发过程中对计划进行重大修订,如果计划详细,那么这可能会使许多细节无效,或者更糟的是,您将尝试将调整幅度降至最低,以便能够遵循计划。

有些事情肯定需要计划,如果您没有制定所需级别的计划的技能,那么我能想到的唯一方法就是进行原型设计,编写代码只是为了获得制定适当计划所需的任务的经验。 。

无论您是否准备好编写生产代码,一旦达到最大计划水平,除了编码就无所事事。也许这将是一场灾难,但是这些都是很好的学习经验,您将可以更好地制定修订计划。


30

绝对是真的。需求越大且越复杂,则越真实。

对于一个小型控制台应用程序来计算斐波那契数列,您可能不需要花几分钟的时间来思考如何构建算法和用户界面(可以,可以简单地是stdin和stdout)。

但是,一个实时交易平台希望每秒完成数百万笔交易,并且分布在全球范围内,这需要99.9999的正常运行时间和100%的正确性吗?您可以直接进行编码吗?

这两个极端之间还有许多其他选择。

看一下Euler项目。按照提出的顺序解决一些问题。您会发现,为了在合理的时间内解决某些问题,您需要在进入代码之前进行实际思考。

如果在开始编写代码之前不需要花时间思考和设计程序,那么您要么在做琐碎的事情,要么在做一些遗漏的事情。


自从一开始,我就从未成功设计和构思过一切

除了最琐碎的问题,没有人能做任何事情。同样,项目越大越复杂,它就越真实-设计将出现错误,被忽略的事物等。

首先要进行高水平的设计,看看是否适合大型作品。然后获得优先级列表-首先开始在最关键的基础架构上工作。然后,我们将较大的部分分解为较小的部分,确保每个较大的部分都由有意义的部分组成。

这需要时间和精力-在一开始可能并不完整或完全正确。

但这就是为什么它被称为软件而不是硬件的原因。它具有延展性,可以更改。


4
好答案。请注意,尽管软件具有可延展性(实际上,这是有关软件的奇妙之处之一),但修改并非免费的。软件系统耦合得越紧密和不连贯,对其进行修改就越困难和昂贵。结果是,如果希望利用软件的可扩展性,那么软件设计的一部分应该是将来的更改能力。
voithos

9

我在学校和其他地方都学到,良好的开发方法在正确编码之前需要概念和设计。

这是真的。

但是,我想知道这是否是一个好的建议,因为自从我开始使用多种编程语言进行开发以来,从一开始就从未成功设计和构思过所有东西

还有你的问题。

对于大多数非平凡的问题,您将需要做一些思考来弄清楚事物将如何运作-事物将如何融合在一起。矛盾的是,对于大多数非平凡的问题,您将无法计划所有事情。对于您来说,太多的未知因素需要说明,开发过程中会发生太多的更改。敏捷之所以受到青睐,是因为它接受了交易的下半部分:人们不是无所不知,变革是永恒的。

因此,您确实需要提前进行设计确实是对的,但是也不可能提前进行设计。


5

编码之前,您绝对必须进行一些设计

原因很简单-如果您没有任何设计,就不知道自己在做什么

在最终设计之前,您绝对必须有一些代码

原因很简单-设计将发生变化,设计的开发部分将揭示问题,机遇和挑战,而这些挑战,机遇和挑战在不着手解决方案之前就很难预料。

开发是迭代的。

不管是否按计划,团队是否实现了计划,每个软件项目都是迭代完成的-部分工作已完成,然后进行评估,评估导致其余工作的完成方式发生变化。

尝试多种方法。

需要实践和经验才能知道平衡前期设计与创建代码的最佳方法。这项技术几乎没有人掌握,并且每个项目都会有不同的理想(考虑设计一个供自己使用的小型工具,而不是团队创建一个大型的单发行产品(如大型视频游戏))。


1

我过去曾设计并强迫其他人设计多个系统,并且我看到该过程以许多不同的方式展开,但是我发现的共同点是,初始体系结构至少应规划大多数主要功能的存在

例如,我看到的HVAC控制系统没有对建筑物,地板,房间等进行改造的概念,结果变得丑陋不堪。或由更适合您(非智能)怀表的组件构建的移动音乐设备。不用说,两种情况下的最终产品都不是客户的最爱。

当您说“概念”时,离“思想”仅一步之遥,而这个概念可能非常模糊。企业通常关心概念。客户通常关心UX-一种以易于使用和愉悦的方式实现并通过使用带来一些价值的概念。

在进行任何编程之前,您必须做“概念”操作,我无法想象自己打开Visual Studio(或您选择的IDE)并随机编写代码,看看它的去向。

在编码之前,您可能没有做一个完整的设计(并且应该这样做),但是您应该对用户的工作流程有一个大概的了解。

UX设计和编码经常会相互影响,您可能会被迫对某些最小的项目使用某种敏捷方法,以将这一事实整合到您的工作方式中。因此,如果您无法一次看到所有内容,请不要认为您是最糟糕的程序员-没有人可以,并且认为自己可以做到的人就是只忽略了足够多的问题,因此他们可以声称自己拥有完整的知识。图片。


一个将尺寸增大到一个大的示例。概念:“创建一个基于可视化云的工具,使企业可以集成其软件平台”。这听起来不错,您可以开始编写市场营销材料,然后甚至在市场上出售它们。在编码之前,您必须具有此功能。

预先设计:“具有像Visio中那样的形状和箭头来描述逻辑;具有插件功能以允许连接到各种平台(SAP,SF,数据库...);具有监视控制台,在该控制台中,用户可以搜索通过系统;具有一种直观地描述数据并将一种格式转换为另一种格式的方式。” 另一个很棒的营销话题。它还为您提供了一些重要的想法,在编码之前也应该有一个粗略的草图。

设计/代码:“使浏览器托管具有此类功能的HTML设计器;以Java编写后端代码,使其可以在任何现有服务器上运行;定义数据结构和UX以根据需要查询或修改它们;计划灾难恢复,错误报告,审核日志记录;计划版本控制;计划访问控制; ....”-列表越精细,预见所有列表就越不现实。

...但是,人们至少应该意识到最终看起来可能是什么样的东西,或者最终产品可能会以一些真正无用的实现而告终,这些实现最终会杀死原本听起来不错的概念-比如您的视觉设计师需要40英寸屏幕以显示任何实际的工作流程,或者除了限于字符串等20个字段中的一个的确切字符串匹配之外,没有其他方法可以搜索日志。除了执行您的实现之外,没有防止这种情况发生的好方法-有些会成功,有些会失败。


0

我总是分配如下时间:

  1. 1/3设计
  2. 1/3发展
  3. 1/3测试

设计:不仅视觉,而且概念。将其分为视觉和逻辑两部分。寻找可重复使用且本身就是设计模式的共性。

开发:一旦知道了零件,就可以对其进行编码。然后,您将它们集成。

测试:不仅要测试代码是否已正确集成和编写,还总是会发现洞察力和经验教训,这将创建新的交互方式,并且将构想和期望新功能。当心范围蠕变。

除了这些方面之外,请注意,项目在这些阶段的顶部还有三个阶段。

  1. 设计不足的首次尝试
  2. 从第一次尝试中学到的经验教训,对第二次尝试进行了过度设计。
  3. 经过精心设计的第三次尝试。

我发现您在设计阶段做得更好,可以最大程度地减少额外的尝试。除了重新做整个事情,您可能还需要重新设计一个子系统。

我是内部,外包和离岸开发项目的软件开发人员和软件开发经理。


-1

这里有一个基本的错误假设。如果不先编写代码,您将永远无法想出一个好的设计(学校永远不会教您这一点)。但是,正确的做法是,没有设计就不会获得良好的代码。

解决方案是:

  1. 编写一些您认为可以解决问题的代码。
  2. 根据您从代码中学到的知识提出设计方案。
  3. 丢弃所有代码,并根据设计从头开始重写它。
  4. 根据需要重复。

丢掉所有的代码不是在这个过程中的可选步骤,但对于小项目正式写入了设计的可能。对于大型项目,您更有可能重复“ 扔掉所有代码 ”步骤-尽管如果您具有足够的模块化,这可能仅适用于部分代码库。

太多的项目保留了旧代码,因为他们不愿意更改它-或者因为它太复杂了,因为它从来没有被设计成可以丢弃的。承认您的第一次尝试将是失败的事实将使您的生活变得更好。


1
有很多有效的理由不丢弃旧代码。您能否提供一些参考来回溯最后一段。
mattnz

+1。不知道为什么这被否决了。弗雷德·布鲁克斯(Fred Brooks)的经典建议是:“建造一个以扔掉它”。
妮基

我认为在这种情况下,旧代码来自原型,并且存在原型被认为足够好并投入生产的危险。考虑到当前项目而不是字面意义,将其丢弃。
JeffO 2014年

-3

概念是始终可以更改的关键设计,程序必须满足完全构思的应用程序的要求。

第一,要点,第二,需要如何访问,第三,用户是谁,第四,用特定的术语来定义工作的全部SOW范围,这些都是应用程序要做的。以及您添加的每个功能如何工作。

在对您的Web应用程序的架构进行任何选择之前,请先进行规划并仔细考虑。

然后选择最好的筹码

我是LAMP开发人员

所以我倾向于将问题缩小到我将使用的PHP框架。和前端脚本,我将需要使其以理想的方式完成我需要做的所有事情

要添加此内容,学习使用MVC框架,ZEND和CAKEPHP是最好的快速开发框架(PHP)


7
选择最好的堆栈...我是LAMP开发人员 ”-坚持某人的编织是完全可以的,但这种说法听起来有点矛盾,不是吗?
JensG 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.