您首先看什么:代码还是设计?


17

如果您刚刚被介绍到一个新项目中,那么想要了解其工作原理的第一件事是什么?

您首先寻找设计吗?如果有设计,您会在其中寻找什么?类图或部署图或序列图还是其他?

还是直接输入代码?如果是这样,您如何理解不同层之间的相互作用?


一旦编写了代码,设计在那时就几乎是人为因素了……

Answers:


24

我从代码开始。单独的设计文档(如果有的话)很可能是错误的或被误解的。因此,我首先尝试通过代码跟踪一些简单的流程;例如,如果是Web应用程序,则可以是一个请求或一系列请求。完成此操作后,我便有了一种骨架,可以多加理解。然后,我可能会回去阅读设计或其他文档,但是到那时,我有一些具体的东西可以将它们关联到并进行验证,以便可以检测到Duff信息。或者我可能只是继续阅读代码或测试用例等。


传哥!有句话:注释不能进行单元测试。除在极少数情况下是从功能测试屏幕截图自动生成外,对于大多数文档来说都是相同的。
DomQ '11

您是否首先编写或设计了此答案?
Mateen Ulhaq 2011年

两者都没有,我只是把头撞在键盘上,直到觉得无聊为止。
Tom Anderson

9

我将从更高的层次开始。如果有任何面向用户的文档-用户手册或指南。如果失败,请查看需求规范,以便您对软件的功能有所了解。我将比照一下设计,然后尝试将其映射到代码文件上。希望这些文件以某种明智的方式组织到文件夹中。然后,我将选择设计的一部分并进入文件以遵循代码流程,而不会陷入过多的细节中。


我同意,我想直接研究代码,但是如果有的话,我认为至少必须浏览一下文档。当您首先进入代码时,这可能是一个很好的入门。
克里斯,2010年

6

我首先建立一个开发人员系统。我使用记录的程序。这可以让猫从书包中脱颖而出,了解有多少文件与现实同步。

它还告诉我什么是依赖项。这很重要。

现在,我已经完成了开发人员的设置,(并且我在进行更正时将设置文档标记为正确的内容),现在可以构建一个版本。在这个阶段中,我最终都会提出问题。

现在它已经构建好了,我将根据用户手册进行介绍性练习。这大致告诉了我系统的实际功能。

现在,我对系统有了部分线索,我阅读了设计文档,而我相信这些文档与到目前为止文档的错误程度成正比。

一旦获得了实际的行为文档,我就可以开始研究代码并查看其中的实际内容。他们从来没有排队,但我现在知道有多少要相信。

然后,查看IDE输出的“ todo”和“ fixme”注释。像“ 2.0版中的修复”之类的东西也是小费。

因此,所有这些都是关于学习准确性的,并且正如人们指出的那样,单独的设计文档很少是最新的或正确的,但是它确实告诉您人们在某个时间点的想法。当然,这些人可能不在周围询问。


这都是非常明智的。关于文档经常出错的想法围绕着这个问题的许多答案,但是蒂姆走了一步,问它有多错误,以及这意味着什么是错误的。
汤姆·安德森

4

我更喜欢从设计入手,以对项目进行概述,并在深入研究细节之前尝试了解其一些关键功能和/或结构。


4

永远是设计。使用代码值得进行开发人员设置步骤(签出源代码,构建项目,进行所需的任何配置更改),但是试图从代码中学习应用程序的结构毫无意义。这仅告诉您结构是什么,而不是结构为何,或者其他开发人员认为该结构的重点和坏处是什么。您可以从白板图中学到的内容,还可以与开发人员聊天。


3

对于复杂的软件,我会大致将其视为新开发项目。从大的想法开始,即远见,背景,范围,利益相关者。通读一些用户文档,并了解其用法。如果可能(或适用),请对该软件进行一些用户培训。然后开始研究需求和设计文档,以大致了解其工作原理。与设计师保持联系。从不同的角度来看系统架构。从那里开始,深入研究核心功能并查看一些代码,然后根据需要返回需求和设计。在查看代码时,请运行软件以查看其运行情况。一直以来,请编译一些摘要文档以备将来参考-您拥有Cliffs Notes。进行分支,直到您对所有组件的工作方式和组合方式有了很好的了解,然后专注于将要使用的部分。到目前为止,您已经对整个系统或至少适用于您的部分有了从上到下的理解。

当然,在现实世界中,您可能没有时间在必须开始动手之前,特别是在大型项目上,没有时间去完成所有这些工作。但这是我该怎么做的。


3

您应该在代码本身和任何设计文档之间来回工作。

  • 您可以从代码或设计开始,这并不重要。阅读代码,直到您完全感到真正的困惑为止,然后查看设计文档。或者,阅读设计文档以获取高级图片,然后查看代码以查看外观。只要您正在处理代码,就可以无限期地重复。

  • 请注意,设计文档几乎总是过时的,并且在许多方面都不正确。但是,只要牢记这些要点,过时的文档仍然可以帮助您了解过去某个时候的作者的想法。许多高级问题和疑虑仍然有效,即使您对作者最初认为它将去向何处的日期都留有陈旧的印象,您也很可能能够更快地了解代码到达何处。走。

  • 在研究代码和设计时,请创建自己的文档来描述您对当今代码的理解。也许这些文档只是一两个简单的草图,也许它们是Wiki中的文字,也许它们是其他东西。不要太复杂:没有30页的word文档。写下您的想法,这将大大阐明您自己的想法。


2

这取决于应用程序的类型。如果它是一个以数据为中心的应用程序,那么我通常从数据库设计开始。如果它具有UI,则可以运行(或良好的屏幕设计),这些UI也可以使您很好地了解应用程序的运行速度(我在这里最多只聊几个小时)。之后,我开始研究代码,因为我知道应用程序在做什么,这将更有意义。


2

我从设计文档开始。尤其是规范-告诉人们所看事物的意图。

如果可能的话,我将查看设计说明和文档,以大致了解其完成方式,思考过程,有关人员的风格和性质。

然后,如果可能的话,我会与研究它的人交谈-它是做什么的?怎么样?为什么?尸体埋在哪里?

开发人员中有一种倾向使用代码:“让我向您展示此代码”。这对他们来说很好,但往往会劫持我的需求-这是为了理解高级内容,从而为低级内容提供上下文。

它使用大量的脑力,在完整的上下文中查看少量代码,并理解任何有意义的内容。因此,如果可能的话,让开发人员讨论原理,结构,单元,模块,无论什么都会引起对任务的赞赏。

只有这样,才值得尝试进入代码。

在大型方案中,查看代码就像查看一个充满0和1的页面。有含义,但要花很长时间才能弄清楚。了解外观以及有意义的部分有助于缩小搜索空间。

话虽如此,当没有doco,没有人,只有代码时,除了查看代码之外,别无所求。

在那种情况下,我通常不会尝试通过缓慢的深度阅读来理解它,而是快速浏览并略读所有内容。有时,这只是打开的文件,然后按向下翻页键。通过这样做,您可以对全局有一个惊人的欣赏。(在某些情况下,我什至将字符串可执行文件转储并拖曳它们,以寻找签名和模式。在过去的20多年中,这卓有成效。)


1

我从测试开始。如果单元测试和集成测试写得很好,它们将描述用例。如果它们写得不好,或者根本没有写出来(不幸的是,在很大程度上就是这种情况),我将从代码中的入口点开始,然后将它们与设计相匹配。

然后,我将为每个用例编写测试,在调查入口点后,您将通过树找到它们,以探查代码并使用代码覆盖率实用程序来查看我所缺少的内容。这些测试准确地告诉了我代码的工作方式。

我总是努力为自己看的东西增加价值;编写测试,清理代码,重构大型(超过20行)功能。

我发现仅创建文档并不会给代码带来任何实际价值,因为它永远不会与代码交互。


1

那么,什么是“设计”?自述文件?uml图?您可以中途制作设计文档(大多数情况下可以这样做),您不能中途编写代码

任何设计都只是一个意见,而代码就是事实

我只会在不了解代码推理的情况下才引用辅助文档

阅读代码是开发人员的一项基本技能。您最好现在就学习它,无论如何您都不会在职业生涯中看到很多有用的文档



1

首先设计,然后编码,如果需要的话,请自上而下进行设计,因此我了解必须工作的每个层次的上下文。

但是,如果我必须做一个非常具体的更改,例如修复报告或计算,我就去看看代码。

更具体地说,我的“设计优先”方法是这样的:

我首先从de domain模型开始,如果没有,则至少建立一个基本模型(一个很好的起点是数据模型)。它定义了应用程序的“词汇表”以及对象(类)之间的关系。

它通过应用程序描绘“处理了哪些对象”。

然后,我寻找用例模型来找出应用程序“完成了哪些流程”,尽管我更喜欢一个流程图,如果该流程图是一个,则显示了流程序列。

在那之后,我应该对应用程序有一个很好的了解,然后就可以设计更改了。

顺便说一句,以上答案是在业务应用程序的上下文中。


1

代码没有说谎。首先了解项目概况,以了解什么是个好主意它。但是,如果您的任务是要详细了解项目的工作原理,那么至少对于我来说,看代码就像逐块看拼图一样,只是您要看的每个类都在添加另一个一块拼图。如果代码结构合理,您甚至可以在不调查类功能的情况下看到由类名称形成的模式。在许多情况下,您可以从代码中获得提示和线索,这将进一步为您提供帮助。

最后,您将了解程序的功能,这是一个完整的拼图游戏。文档可能不完整或不准确,但是代码永远不会说谎。您可以完成所有这些操作而无需弄清楚每种方法的作用。并非每个人都可以通过这种方式了解项目,但是如果您经常这样做,对您来说会变得更容易,更不用说您可以在几个小时的学习中获得中型应用程序的要旨。虽然我认为这一切都归结为偏好。


1
  1. 应用的功能目的
  2. 应用程序的功能范围和流程以及与客户其他系统的链接。

在看到最关键的模块/应用程序点的代码之后:看到代码,我可以验证设计的优点。

例:

您必须从事有关财务报告的Web应用程序的应用程序管理。

  1. 我询问并阅读有关此目的的文档:必须报告哪些数据?谁在使用此应用程序?
  2. 什么是链接系统?接收或发送数据给任何人有最后期限吗?如果该系统宕机,还有哪些其他应用程序受到破坏或停止,还有哪些其他部门受到了破坏?

在我阅读了有关消息的代码,启动和结束应用程序(用于db中可能的锁定),创建数据的主过程(必须报告的内容)等之后(例如,在储气中,主过程与计算具有供应和注入的客户存储区域中的天然气存量;第二步是关于先前计算出的该数据的账单)


1

既不是代码也不是设计。我喜欢与利益相关者和最终用户交谈,并从他们的角度了解其工作原理。一旦可以从他们的脑海中创建图片,便可以快速浏览技术设计,然后浏览代码。


0

我将先进行设计,然后再进行编码。这非常重要,因为每个项目都是不同的。您需要从A到Z制定一个计划和高水平的流程,然后才能同时开始处理代码。每个决策都应记录在案,以便正在/正在开发代码的其他团队(或您自己)将知道最新更新以及已确认的内容。


0

如果有一个好的高级设计文档,我将使用它。它必须简洁明了且最新。如果太冗长或过时,我将去看代码。

当然,这取决于项目,不是吗?通过文档可以更好地处理极其复杂或多方面的项目(如果文档足够可靠的话)。

在我看来,单个简单的模块或简单的应用程序几乎总是在代码级别上最好的方法。

在每种情况下都没有正确的答案!

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.