在任何编码发生之前应该进行多lessdevise?
我目前在学校,对于我的高级项目,我们只需要为我们的项目做UML图表和其他繁琐的文档就花费1/3的时间。
这涉及到很多未来的问题的devise和规划。
出于某种原因,这似乎是鼓励超过devise。 我花了最后一个小时写这样的东西。
“连接到服务器 – 连接到服务器。先决条件:没有服务器连接存在。后置条件 – 连接现在存在”。
我宁愿编码,也不愿做这个废话。 我意识到这个devise工作有它的位置,但多less? 我知道这不是反对在Enterprise Arch这样的工具中devise的绝对证据,而是我在这里。
教授这些课题的教授已经devise出了他的项目。 在应用程序中可能发生的每一件事都被logging下来。 他没有自己编写这个代码,而是用这个“完美的文档”在夏天把海外工作和学生的工作放在一边。
所有这些devise产生的应用程序都是可怕的。 这是我见过的最糟糕的应用程序之一,任何人都可以告诉你它被过度devise。
SO经验编码人员对这个问题有什么看法? 在项目倾向于通过强迫早做决定而做出不好的项目之前,devise一个很大的项目是因为“devise文档是这样说的”?
非常感谢你们提供的任何见解。 如果我知道这一切都是有原因的,我会更好地“浪费”我的时间。 我非常愿意事先做一些devise工作,但是我觉得我的教授在编写任何代码之前都希望做出许多工程决定。
编辑:有趣的slashdot文章在这个问题上。 http://books.slashdot.org/story/09/11/16/1448204/Becoming-Agile
我不想把它作为一个破损的logging(我最近一直在使用这个引用),但是John Gall的这个引用与软件构build的很多方面都很相关。 (尽pipe他在谈论生物系统)
维基百科:Gall定律
“一个复杂的系统工作总是从一个简单的系统发展而来,倒过来看似乎是正确的:一个从头开始devise的复杂系统永远不能工作,不能工作,你必须重新开始,开始一个简单的系统。“
也就是说,如果你正在devise,首先要devise一些小而可实现的东西。 一个巨大的复杂的前期devise注定要失败。
你可以通过将它们分解成更小的部分来解决巨大的任务。 build立你能想到的最小的可能的事情,这可能是可能的工作。 不要立即解决整个问题。
一个复杂的devise可能注定要失败的原因之一是,它正在解决的问题可能是一个邪恶的问题,或者是其中一些问题的子部分各自相互排斥的其他types的无法解决的问题。 如果没有某种工作实验来certificate子问题的可解性,这些实际上很难被发现。
我在这个问题上看到的大部分证据似乎都预测,前期devise越大,越有可能超过预算,可能无法解决任何问题。 简而言之,devise是必要的,但是您的目标应该是保持尽可能小而简单,并且要记住,您的前20个草稿可能会由于您在实际编码阶段遇到的因素而失败。
这是非常主观的,但恕我直言,只是足够合理的猜测适当的整体系统架构应该是什么样子,但devise不应该停止,(或甚至缓慢明显),在这一点上,它应该继续贯穿整个开发,开发重构应经常鼓励和启动,因为持续的devise阐明了领域模型分析,devise和开发模型之间的不一致性。 无论您在开发之前进行所有的devise,还是根据开发进度,您的教授正在教授您的概念(和工具)在devise过程中都是无价的。
你的专业人员正在做的事情听起来像是瀑布式软件devise生命周期(SDLC)过程的经典案例。 它的主要缺点不是构造阶段(编码)被延迟,而是在编码开始时或多或less地停止devise(因为瀑布方法创build的障碍改变)。
一些幽默的事情可以在这里find。
天儿真好,
这很大程度上取决于项目的性质。
我曾经在那些新系统替代现有系统的项目上工作,绝大多数时间都花在收集现有系统的行为来build立需求上。
这个阶段,然后是devise阶段,花了将近18个月。 编码历时约四个月。 从努力的angular度来看,这是更多的,但最终的结果是客户喜爱的一个稳定的系统。
哦,顺便说一下,这是一个现有的空中交通pipe制系统,一个德国的空中交通pipe制系统的替代品,所以在三个月的预定评估期的一个月后,令人难以置信的骄傲。
我认为这个项目的大型评估和devise阶段是最好的方法。
编辑:这个系统是在卡尔斯鲁厄的航空pipe制中心,由德国联邦航空pipe理局的DFS运行的。 现有的雷达处理系统将被雷神取代,但主系统的交付延迟。 因此,DFS决定将控制器位置升级为新系统的位置,但暂时将其附加到现有的ATC处理系统。 因此项目名称卡尔斯鲁厄AdvancedDisplay系统或KADS。 在整个控制室被更换的时候,在现有的ATC中心的后面build了一个全新的机翼。
有一个强制性的需求收集阶段,在这个阶段,团队与现有系统的软件工程师一起现场工作。
他们logging:
- 现有雷达处理系统与控制器位置之间的所有消息
- 现有控制器位置,触摸面板,键盘,显示特性等的所有行为
然后由DFS签署这些要求,并开始devise阶段。 这持续了大约一个月,同时几个部分原型,并确定了最好的解决scheme。 与实现并行的是一个testingdevise阶段,其中所有需求都被追踪到代码并进行相关testing。
然后编码和testing开始了几个交付,约。 十,完成,每个都有一个相关的testing和验收阶段。 一个Scrum方法在名称之前,我们select了在阶段开始阶段进入每个“发布”阶段的大块工作。 最终交付按时和按预算进行。
DFS计划在现有系统的基础上运行新系统三个月,以评估新系统的性能和稳定性。 完全转移到新系统是一个“全部或全部”的build议。 他们不得不用身体上的旧雷达线来拆除旧的电话交换机,之后再也没有回去。
所以对于德国空中交通pipe制服务来说,如此高兴的系统,他们会这样做是我们背上的一个大拍!
顺便说一下,在需求阶段出现的老软件工程师的数量,并说我们没有工作,因为没有编写代码是相当有趣的。 当你看到一些代码的时候,一个老的“裤子的座位”方法的确实证据是显而易见的。 ( – :
HTH
干杯,
这是上个世纪如此学术。
通常情况下,至less以我的经验来看,无论你在devise上多么努力,你都会错过某些技术性限制,这些限制了系统不同部分之间的联系。 也是devise的起点 – 要求总是远远不够。
比通常validation你的devise,你实际上需要做一些编码 – 原型等。 更新的开发过程 – 灵活的开发过程,只要你说只需要尽可能多的devise就可以开始编码。
这并不是说如果没有清楚地了解你要去的地方,你就可能急于进入编码,但是过分的做法真的很糟糕
正式的学术培训通常(据我所知)在实际生产编码开始之前(不包括原型devise)将大量的精力放在devise和其他一些东西上。
这是有道理的,你没有得到正确的(或几乎是正确的)开始,你会被拧。
然而在实践中,很less有时间和资源的奢侈。 更糟糕的是,非技术人员(尤其是那些在那里的人)希望看到事物(用户界面,原型)真正感觉到有进展。
对我来说,这是关于平衡,不同的组织将不得不自己画线,出来最好的做法。 也根据项目/资源等的性质而有所不同
关于UML,这里有一些关于SO的有趣的post:
UML是否实用?
UML仍被视为一种logging软件devise的可行方法吗?
在devise新的代码和algorithm时,我应该使用UML吗?
如果你不用UMLdevise,那么你在devise什么?
编程界有些人认为devise就是一切,有些人认为最好是在devise问题出现时编码和解决。 这是两个相反的两端,正如两个极端情况一样,答案在中间的某个地方。
基于对需求的一些理解的一些devise是不可避免的。 要求告诉你要build立什么 ; devise告诉你如何build立它。 在现实世界中(或者至less在我的经验中),你是否以正式的方式进行需求/devise主要基于你所在的组织,即组织是否要求遵循某个软件过程。 但即使组织没有规定正式的stream程,事实仍然是,即使开发者没有正规化,开发者也会做一些需求/devise。 在此过程的每一个步骤中,您都在决定如何向用户报告错误,如何显示度量单位等等。所有这些都是在正式的需求/devise过程中敲定的因素,但即使没有这些,他们仍然是必须作出的决定。
我曾经为软件过程沉重的组织工作,而且说实话,我没有看到最终产品有什么不同。
就个人而言,我不认为有质量的人可以替代。 也就是说, 过程不是一个银弹 。 如果你有边际程序员,世界上最好的程序不会拯救你的项目。
根据我的经验,这不是一个好主意。 做一些规划好得多,但是写一些代码并迭代。
我想每个人都会给你一个不同的答案,部分是因为个人意见,部分是因为他们有经验…我的经验是这样的…
通常情况下,计划到“T”的项目通常与原始规格相距甚远,因为有时您会遇到技术限制,或者因为原始devise无法工作的不可预见的情况。
我曾经为不同公司的项目devise,从devise到devise到某种“我们想要的东西的总体概念”……我认为最好的是两者之间的某种愉快的媒介。
为一个客户工作,或build立一个接口,另一个人将直接消费,显然一个彻底的devise将是关键。
至于UML图,真正的深入规划呢?
我曾经从主要的无线运营商到主要的住宅和商业房地产公司工作过,还有一家相当体面的计费公司……我可以诚实地说,我没有看到有人真的会用任何成功的UML图。
我认为它很好地识别你的接触点,你的工作stream程,但不是一张纸和铅笔不能为你做的。
至于他可能收到的可怕的外包代码…你得到你所支付的。 我不打算做任何forms的概括等等,但是我认为,即使在美国,对于无能的开发者而言,你也可能有10:1的比率,而且我认为比例从这里变得更大。 我不会假设代码问题的原因是计划
问问你的教授是否曾经从事非学术工作。 然后让他们描述他们曾经写过的最大的系统; 他们参与过的最大的团队是什么? 无论他们是否曾经开发过发货或发行过系统。
如果他们从来没有一个非学术的工作,或从来没有写一个大的系统,或开发票,运输或释放,然后意识到,你将不得不忍受一些可怕的,为了得到一个等级,并做尽可能优雅。 也许你会学到的是,你讨厌UML,以及如何通过一个微笑痛苦的事情。
前期devise,例如UML模型,是经过testing的假设,在编码过程中通常被certificate是错误的。 简而言之,编码与“结构”不同; 而编码就是devise。
使用简短的前期架构(战略)devisestream程来识别,隔离和降低风险。 但是使用严格的重构和偶尔的退火来自下而上地演化系统的devise。
我对这个问题的很多评论并不感到惊讶。
相生生活的全部目的是学习现实生活中非常重要的“思维过程”。
我看到很多孩子只是想跳开始编码而不写规格。 能够写出清晰的规格给你带来很长的路要走。 它清楚了解了什么已经处理,什么不是。
由于所有现代的IDE /debugging过程,事情已经变得更加复杂 – 试错了 – 谷歌试用 – 现在它可能工作! – 完成?
虽然在开发系统的开始阶段可能会有些令人毛骨悚然,但是在您的规范帮助以及编码帮助的地方,您可以更好地理解,然后在现实生活中知道如何使其变得更好。
毕竟你还在学校!
祝你好运。
是的,这是“传统”的美学
现在, 敏捷迭代开发过程有更多的嗡嗡声,正在“取代”较旧的“ 瀑布模型 ”。
我们被告知,对比度是介于较老的,先计划,写需求,写规格,文档,最后是代码和模型,最后是一个“更新的”:敏捷。 在敏捷方面,与用户协商,系统逐渐发展。 一个试图总是有一个运行系统和unit testing。 要求被严重误解之前,可以改变方向,浪费精力。
我不同意这个解释。
我不反对敏捷,只是认为它是新的。 相反,我会说敏捷是新近stream行的
我相信很多或者大多数好的,工作的遗留系统是用渐进式的进化技术开发的,当时他们没有一个有声望的stream行语。 当然,一个团队可以完成所有的计划和指定, 然后以敏捷的方式进行,构build一个小型的“工作”核心,并将其发展到最终版本。 (虽然是浪费时间,但是很多项目是在官僚框架之外开发的。
在某个时候, 增量式原型devise成为公认的devise美学,这是敏捷的早期化身。 我想有足够的钱和时间,你可以完全向上build立一些东西,但我必须认为,成功的开发人员从一开始就使用类似敏捷的模式 。
瀑布模型,除了没有什么乐趣之外,有一个趋势恕我直言,工作越差越完全你应用它。 继模型之后的许多项目都发生了令人瞩目的失败。 一个具体的问题是,它允许一个组织花费巨额资金,绝对没有迹象表明未来的成功。 在做完所有事情之后开始第一次testing的想法是今天的ROTFL时间,但是想想在执行第一次真正的testing之前,一个大型的瀑布项目可能要花多less钱。
说了这么多,这不会对你造成伤害,有些文档技术在瀑布模型之外有价值。
我主要赞同推动软件开发的敏捷方法的观点。 我不会在意devise最复杂的解决scheme,从一开始就可以想象的所有情况。 有一个Donald Knuth所说的“不成熟的优化是一切罪恶的根源”,所以要认真考虑它:)对软件开发人员来说,开始工作时最重要的一件事是准确定义什么是待build。 所以,在所有的devise之前,天气开始简单或者变得复杂,如果你不知道自己想要build造什么,最有可能的就是你不想要的地方。 定义解决scheme的约束是特别重要的。
你的问题是一种phylosofical和在开发人员头上提出了很多其他问题。 其他一些人已经指出,你需要考虑敏捷的发展方式,在其具体的方式来解决这些问题。 所以,我也build议读一读敏捷话题。
干杯,
伊万
由于现代编程语言的发展,恕我直言,瀑布变得越来越不相关,敏捷越来越多。 以前,即使是最简单的东西也要花上很长时间(查看COBOL的语法,如果你想看看如何不精简和expression),所以写出解释你想要的东西的文档是很有意义的。程序来做,然后去执行它。 现在,文档处理的时间缩短了很多,因为程序员最简单也是最自然的方式来expression他的devise(代码本身就是令人震惊的)。
我自己一直都在看这个 – 我坐在脑海里想着一个想法,但是不清楚如何实现它,所以我在代码本身中勾勒出潜在的实现。 这比创buildUML图来演示体系结构更快,更简单,然后再执行实现。 现代OO语言(以及可用的框架)非常具有dynamic性和performance力,所以我们大多可以跳过中间步骤。
这就是说,学习所有那些恶心的devise也是很重要的。 在你做了几次这样漫长而缓慢的工作之后,在脑海中进行devise思考就会变得更加自然和自然,所以你仍然在经历一个真正的devise过程,尽pipe你可能在写作时没有做太多的工作。 因此,尽pipe当你描述几个月的UML图表时,我感到</s>,不安,但是坚持下去,并祈祷你永远找不到工作。
祝你好运!
计划是没有的; 计划就是一切。
处理UML图和其他乏味的东西可能会迫使你面对你要解决的整个问题,并将其分解成可pipe理的块。
你应该按照你的class级devise来信吗? 几乎肯定不是; 由于一些不可预见的情况,我从来没有做过一个项目的要求没有改变。 但是至less你可以进一步了解需要做些什么。 这听起来像你跟着你的文件太严格,这可能会导致问题。
在自上而下的方法中,俗称“瀑布模式”,在长时间的基本devise阶段,事物并不是很有趣。
如果你有一个可行的原型,那么无论花费多less时间,devise都会更好。 所以控制你的好奇心,完成devise。
在现实生活中,如果他们付钱给你devise,那么你devise。 如果你在自己的项目上工作,而且实际上需要完成,那么你可以采取一种基于小成功和不断重构的不同的迭代方法
通常你会得到一组要求,然后开始devise一个架构。 根据一些成本估算模型,你做了一个报价,如果你有生意(你的情况好,你有它,并付出惨痛的代价,: – D),那么你可以继续进行详细的devise。 真正的编码可以通过代码猴子来完成…正确地思考和devise系统是成功的关键:需求满足,成本在预算之内。
devise不是在我看来定义的前,后条件,细节,但更多的定义包和分配/拆分他们的要求。除了定义系统中的大组件,以及它们是如何相互作用。 你必须考虑松耦合它们来提高可testing性(devisetesting)等等,所以重点显然不在现实生活中大规模项目的一些事前和事后条件上。
这更多的是我在这里关注的自上而下的方法,如果你有一套要求,这往往是你必须去做的。
一旦项目运行,没有完成,就会出现一些问题,其中一些问题有待重新devise。 开发过程几乎从不(在简单情况下除外)是线性的,但是是一个迭代过程。
这个架构 – 如果想得够好的话 – 总体上将保持相当稳定,但需要通过详细devise进行很多迭代。
根据项目的不同,我可以select两个我喜欢的选项。
对于我想要快速完成的小型项目,我喜欢遵循http://www.extremeprogramming.org/ (敏捷编程)的规则,在这些规则中“刺激”您的想法而不是完全解决问题。
对于更严肃的项目,虽然我喜欢在开始之前画出基本模型(UML /数据库/序列)。 这个模型是基于以前的要求。 这个模型主要是为了给自己一个关于需要构build什么类,以及应该如何工作的思路。 我从来没有研究过这个方法,那是为了执行时间。
我了解到有一个坚实的基础模型以各种方式加速项目。 对于一个你会创造更less的无用的代码,必须修改后。 其次,在小组工作时,更容易解释思想,确保每个人都朝着同一个方向思考,并朝着同一个方向实施。 第三件事是当你抽出一些时间或者项目较大时,最好有一个什么class做什么的概述:p。
这一切都取决于项目的时间和重要性之间的平衡。 一个高利益的项目将有高层次的利益相关者要求大量的devise才能完成编码。 较小的项目可以享受一些免于过度devise的自由,并且取决于开发者,他们可以在编码和devise之间很好地进行迭代。
关键问题不在于第一次进行devise,而是将devise文档与编码过程中发生的每个决策变更保持一致。
如果一个大项目可以分解成几个比整体大局面更好的小部分,那么分而治之的方法就可以工作得很好。 那些小的任务,编码好可以作为构build块或apis来完成更大的任务。 所以基本上采用自上而下的方法,可以做出一个大任务的划分,然后以自下而上的方式分别完成和testing这些小块。
我只是在学习如何最好地实现编码项目,规划/编码迭代或不迭代。 在计划上花费多长时间等等。
我在网上发现了一篇很棒的文章。 你可以在这里find它。 他经历了function项目计划背后的推理和思考过程。 function项目计划集中在用户的经验和与代码的交互。 首先,这将是devise过程中最重要的部分。 一旦你经历了这一个,你可以做一个技术项目计划,将解决如何实现用户在使用代码时将面对的每个问题的具体细节。 我认为OP是正确的,他说项目计划的一个主要好处是不让他们编码。 但做了一次。 所以当你回去写代码的时候,你可以参考你已经完成的工作。 所以你只需要专注于编码的工作。
这可能听起来像常识,但是…底线:写你的项目计划的意图和想法,你已经做了一些/大部分的工作。 一半的工作是知道要编码。
这取决于特定的项目和特定的客户。 有些人需要能够将系统可视化,以便能够理解它,并从中得到什么。 其他时候,您可能正在devise一个系统,在这个系统中,客户向您提供一个英寸的东西需求规格,对于质量过程必须更高的系统。 另外,有些客户需要正式达成一个要求清单。
在客户不清楚需求的情况下,敏捷方法更适合。 通过这种方式,开发人员可以快速实施新function,并从客户那里获得反馈,从而减less不需要的东西传送的可能性。 这与试图build立一套要求清单并只build立合同约定的内容相反,只是为了交付客户不能接受的东西。
我公司最近聘用了两名在软件开发行业工作了多年的新开发人员,但从未在一家公司工作,在那里有书面或devise文档制作的要求或任何types的SDLC; 一个典型的商店,开发商给一张纸,有一些要求,并告诉“build立这个”。 一旦两个人被迫坐下来反复完成devise文档(更多的是为了自己的学习而不是其他任何东西),他们都向我说,在应用程序出现之前,一个前期devise已经实现了他们永远不会想到的事情,好,真正实施(糟糕)。 不久之后,他们开始写unit testing(在实施之前),而在开始的几个星期里,发现它很奇怪,认为这是浪费时间,他们每天都来找我,并支持他们学到了多less东西有益的unit testing是。
直接冲入编码的实际执行(而不是testing)是我们可能都做的一个新手的错误。
我想你想让我们告诉你,你的教授是错的。 这是一些弹药: http : //www.developerdotstar.com/mag/articles/reeves_design_main.html我还没有发现,如果reeves是100%正确的,但到目前为止,它是。
可能是与你的情况最相关的事情:考虑到一些大型项目很难从小事做起。 你应该总是尽可能的小,但是razor往往不能很好地切割; 可怕的是,你的项目可能是想通过基本的步骤走上课堂。
在编码之前花费的devise时间总是有很大的潜力被花费 – 但只有当你知道如何度过它时! 正如你所注意到的那样,过度工程是非常容易的,早期devise不好的系统,等等。 只要把你当前的项目logging下来就可以体验 – 当你做一个真实世界的项目时,你就会知道要避免哪些devise缺陷!
原型devise也有很大的潜力,要花费时间 – 但只有当你有球扔掉原型,并从头开始,从经验中学习。 如果你曾经不得不讨论sendmail,那么你就知道处理从一个小项目成长为一个可怕的怪物的软件的痛苦,而不是从头开始。
最后请注意,这里有各种各样的方法。 无论好坏,作为一个软件人,你可能需要处理其中的任何一个。 他们中的大多数可以用一些合理有效的方式工作,所以即使某个特定的情况是不正常的,你也不应该让这种方法在一般情况下毒害你。
你不需要做任何devise工作, 除非你希望生产将被别人使用和享用的软件产品。
如果不理解潜在用户的目标,创build一个体面的软件产品是非常困难的(如果不是不可能的话)。 没有研究就无法理解用户的目标,而且没有devise就无法进行研究。
学术教师从来没有做过现实世界的项目:)。 他们负责这个瀑布的精神。 另外,虽然Visual Studio 2010 Ultimate即将到来,但UML工具今天并不方便。
在现实生活中,你可能没有足够的精力来完成精心devise,完全描述你将要build造的东西。 另外,这样做可能会适得其反,因为这样的devise在编码的第一天就会变老而且破碎(在第二天已经过时了)。 遵循Agile
方法,通过迭代构build原型和不断重新分解和细化,更加安全。 在这种情况下,你(或你的团队)几乎可以立即开始编码。 有关Xp和Agile Methodology的一些很好的书籍,比如敏捷开发的艺术 ,可以给出一个更好的主意
说 – 没有devise是不是一个好主意。 你总是需要一个计划。 敏捷计划只是随着你“走”而改变