代码之家  ›  专栏  ›  技术社区  ›  Ape-inago

在开始一个新项目时,值得花时间提前做什么[已完成]

  •  23
  • Ape-inago  · 技术社区  · 14 年前

    更新:

    到目前为止每个人都有很好的答案!每一种方法都有助于找出问题的根源,并确保我和我的搭档都在同一个页面上。我认为很多时候是因为我们没有谈论我们的实际意图,发布时间表和一般的工作流程。

    在这个过程中,我遇到了一些相关的问题,我从来没有想过要解决这些问题,以后可能会发表更多的文章(可能是在 programmers-stack-exchange )


    背景:

    我正在和我的一个大学朋友一起开发网络应用程序。

    我们正在使用MySQL和PHP开发我们的站点,并计划在前端使用一些jQuery。我们的目标是手机和平板电脑,它最终将涉及大量来自大众的数据。我不想多谈具体的项目构想。(如果你认为我应该提供更多细节,请对此发表评论。)

    我们有一个原型,还有一些GUI模型。我们的想法都让人抓狂,而且似乎是从未尝试过的。

    我们的问题:

    我们希望遵循37signals的《重做》一书中的原则。这本书的很大一部分是关于尽早推出产品的想法。它讨论了为什么我们应该关注我们产品的核心,我们应该忽略所有额外的东西。

    基本上是尽可能少的为一个可销售的产品,这样我们就可以发货,并开始得到反馈的想法。我们对这意味着什么都有不同的看法,这将我们引向不同的方向。

    我认为这本书只是在讨论最小的特性,但他觉得这也是关于代码设计的。 我认为有些事情现在值得做来加快速度,但他希望我们尽快,完全跳过这些问题。

    我想做一些准备工作,因为这样可以节省以后的时间。比如从OO开始,设计一个完整的数据库模式,花时间建立 xCSS ,并将问题分解为各个步骤。

    [我理解他的方式:]他甚至想 如果这意味着编写糟糕/草率的代码 只要它能把设计弄出来。他不想被困在基本的代码基础设施上,也不想被困在我们正在进行的重构或枯燥的原则上。他不想花时间决定要做什么,他只想做。例如,他认为对svn进行小的更改只是开销。

    我知道他不想让我们浪费时间去做一个完美的系统,但是 我认为这太过分了,而不是37signals所倡导的。

    本质上是龟兔之争 我也不知道该如何向他解释,如果他不至少做一些简单的节省时间的代码设计选择,并将问题分解成小块来解决,他就会自讨苦吃。

    否则他就是一个好的开发人员,而且有能力把它做好。

    我的问题:

    1. 多少准备太多,多少准备太少?

    2. 在项目开始时,我们应该关注哪些高回报的事情?

    3. 在这个开发阶段,我们应该如何判断什么是值得做的,代码方面的(而不是特性方面的)?

    4. 是否值得花时间实现像xCSS和其他系统这样的东西,以便从一开始就更容易编写干净的代码?

    5. 你将如何向他解释细粒度任务和进行小的原子变化的价值。

    6. 你用你的代码做了什么 导致更快的装船时间?

    最佳答案:

    我会接受最能改变他/我想法的答案。请随意回答我列出的任何问题,并以我们的目标语言为例加分。参考其他37signals的工作可能会有所帮助。

    6 回复  |  直到 8 年前
        1
  •  2
  •   Singleton    14 年前

    多少准备太多,多少准备太少?

    取决于经验和项目复杂性/大小。对于敏捷方法,您应该 为最简单的应用程序计划 顾客 (或用户)某种价值 适合短期释放周期(1-3周)。你已经有了一个原型和模型 ups,所以您的用例和需求有些清晰。但你还是应该计划 你的应用程序的一个子集 完成 在规定的期限内。 如果你事先计划好,你会面临一些困难的问题,这些问题可能会让你慢下来。 那是因为你试图设计你的软件来解决这个问题。但通常 如果你真的要处理这个问题,你会找到一个更简单的解决办法 将消失,因为某些要求已更改或简化。想象你在写 一个博客应用程序。显然你想要一个所见即所得的小部件。在前面你花时间 评估现有的解决方案,甚至自己编写一个解决方案。最后发现 大多数用户喜欢使用纯文本或要求简化标记。 你花了3天到几周的时间白白浪费。开始的时候非常简单, 你会知道人们什么时候需要更奇特的东西。

    在项目开始时,我们应该关注哪些高回报的事情?

    不确定这个问题。如果你谈到数据库和面向对象设计,那么 不会有高回报的。通常一个简单的数据库模式放在 分钟,并随着时间的推移而发展(包括重新分解、标准化)。你的建筑也一样。 这又取决于您的经验,如果您不太了解数据规范化 或者如何应用MVC(即使是在很低的层次上),那么你应该教育自己 很少。

    在这个开发阶段,我们应该如何判断什么是值得做的,代码方面的(而不是特性方面的)?

    保持简单。学习一个完整的堆栈框架(如Symfony或Cake) 可以 保存 很多时间,但他们都有一个像样的学习曲线 遇到的问题 不是微不足道的(至少在扩展/性能方面)。一个好的抽象代码库并不总是 不需要也不有用,对我来说,只要它是可测试的就足够了。有小爱好的项目或 我接受php的简单性。

    是否值得花时间实现像xCSS和其他系统这样的东西,以便从一开始就更容易编写干净的代码?

    别误会,学点新东西总是件好事。但是 清除代码 从你的头脑,你思考,处理和抽象问题的方式开始。xCSS只是 一种会消耗学习时间和引入其他问题的玩具。也要记住 如果你想委托设计任务,你需要找到能使用它的人。

    这些年来,我对这些工具和库越来越保守。 通常,您会遇到一些限制或问题,必须实现丑陋的 或者你必须挖掘并理解整个源头。如果它给你 一些巨大的价值,它可能是值得的,但正如我所说,xCSS是一个玩具。

    你将如何向他解释细粒度任务和进行小的原子变化的价值。

    也许这是你们其中一个或两个的误会。细粒度并不意味着 您应该分别提交每个getter/setter或任何新方法。这通常是合乎逻辑的 一致的承诺(应该有效)。

    示例:

    • 错误2134已修复:管理员密码为空
    • 添加了带测试的基本图书模型
    • 为图书模型添加了逻辑,所有测试都通过了
    • 添加了另一个图书测试
    • 已将代码库迁移到书本
    • 已删除legacy funcs_book.php文件
    • 重构前控制器以支持作为控制器的功能

    提交和注释应该可以很容易地找出何时引入了错误或何时 代码库已更改。一个好的规则是用一行代码作为注释,这对 分析配置管理日志。有大量不连贯的提交,其中包含冗长甚至匿名的评论 实际上,您不得不查看变更集。 此外,还可以将特定更改导出为易于应用于其他应用程序的修补程序 分支甚至存储库。

    你用你的代码做了哪些事情,导致了更快的发货时间?

    • 不要害怕抛出遗留或不可读的代码(使用SCM)
    • 使用供应商libs 只有 对于困难或复杂的任务
    • 定期重构
    • 别让它看起来很花哨,简单点
    • 接受你的语言。有时函数>类

    我认为这本书只是在讨论最小的特性,但他觉得这也是关于代码设计的。

    整体考虑。具有简洁功能的简单GUI工作良好,因为它是可访问的 而且很容易理解。很容易理解三行中的基本for循环,但是 抽象对象树涉及到几十个间接操作,这很难实现。很多开发商不会承认,但是 真的很难。 大规划的代码设计前期是死的。重构和单元测试应该推动 您在不断发展的应用程序中的设计。然而,手边有纸和笔来进行头脑风暴 几分钟的解决方案总是健康的。

        2
  •  7
  •   RabidFire    14 年前

    很高兴又看到37号信号风扇!

    这是他们网上书里的一句话, Getting Real :

    人们经常花太多时间 努力解决问题 还没有。别。见鬼,我们 在没有能力的情况下启动了大本营 为顾客买单!因为这个产品 按月计费,我们知道 有30天的时间来解决这个问题

    基本上, 决定发射日期 . 减少总数 范围 你的申请在那一天发布的最低限度。这将帮助您及时获得应用程序,并为您提供实时数据。

    如果你已经弄清楚了作用域部分,并且想把重点放在编码问题上,那么你应该特别看看这个部分, Managing Debt :

    把一些不好的东西 仍然有效的代码]来自 时不时。事实上,通常 所需的技术可以帮助您完成 尽快把事情搞清楚。但是你 仍然需要承认它是债务 在某个时候通过清洁来偿还 要么修改代码要么重新设计 所以佩奇。

    简而言之,在一开始就放弃xcs的实现,但要确保在稍后的阶段回到它。阅读第九章和第十章“接口”和“代码”。

    最后,我最喜欢的一句话是:

    制造半个产品,而不是半个屁股 产品。你真正想做的是 做半个能让人兴奋的产品。

    希望你们能打造出一款可以向全世界展示的伟大产品。快速解决这些问题也是另一个节省时间的好方法!:)

        3
  •  3
  •   ebonhand    14 年前

    我对你的点没有明确的答案,但在我看来,“太多”是指任何超出“工作代码”范围的东西

    尽快把这件事中最简单,最卑鄙的一点准备好!

    让代码变得难看-它无论如何都会被替换的 让设计看起来像狗的屁股-它无论如何都会被替换的 让事情变得不确定和不安全-它无论如何都会被替换的

    这个想法是让一个内部原型尽快启动和运行。如果它可以被跳过,并且仍然在浏览器中“使用核心思想”或其他什么东西,那么就跳过它。

    一旦你有了 某物 工作,不管多糟糕,第一步就完成了。

    第二步是循环的-回到你已经写过的,让它更好。然后,转到步骤2

    这个 只有 在步骤1中,我不会跳过的部分是单元测试,这是因为在编写代码之前,我使用单元测试来表达我对代码应该做什么的想法。一旦单元测试通过,那部分就完成了-下一步!

    步骤2包括重写代码,使其更干净,处理更多的边缘情况,并且更容易更新、维护和构建。这些都涉及单元测试(通常涉及重写单元测试)

    基本上,你的朋友是对的-除了在单元/集成测试方面

        4
  •  3
  •   sjt    14 年前

    我想说的是,为了说服你的朋友,你需要关注的主要话题是“敏捷估计和规划”。很多人认为敏捷意味着完全没有计划,这是不对的。Scrum——一个基于敏捷原则的软件开发框架建议每个项目从发布计划开始。你的大部分问题都将根据Scrum指南来回答。

    准备多少太多了

    让我们退一步来理解“准备”的含义,它的含义比一个庞大的规划和设计会议更深刻。准备意味着-Scrum发布计划、Sprint或迭代计划、每日Scrum会议计划。你真的从来没有停止你的“准备”工作,它继续。你计划失败的那一刻,就是你计划失败的那一刻。 Scrum发布计划通常只需要一个组织花费15-20%的时间来构建一个传统的发布计划。在这次会议中,我建议您编写一个业务史诗用户故事,以及技术史诗用户故事,并将它们快速分解成块。你不需要详细说明,细节将在Sprint计划中处理。在Sprint计划期间,只需将高优先级的用户故事整理到正确的细节级别,并承诺在当前迭代中完成它们。对于2周的迭代,Sprint计划不应超过4小时。每天的Scrum同步会议只会持续15分钟,因为只有你们两个,所以时间可能会更短。

    少是少?

    在迭代过程中,当你在实际工作中遇到障碍时,你会知道你“准备”得太少了。当事情进展顺利的时候,你知道你花了足够的时间准备。

    在项目开始时,我们应该关注哪些高回报的事情?

    试着集中精力回答下面这个简单的问题: 我们怎样才能以最好的方式把愿景变成一个成功的产品?, 商业史诗般的用户故事,技术史诗般的故事——从技术和基础设施的角度来看,这将是您的产品愿景。例如-你打算使用TDD,持续集成计划,版本控制计划等等。你永远不能忽视这些,无论你尝试了多少。另一件事是找出谁是你的产品用户。ROI和高优先级用户故事的惩罚。为你的产品制定标准,这也适用于你产品的一小部分。我可以继续,所以我会停在这里。

    在这个开发阶段,我们应该如何判断什么是值得做的,代码方面的(而不是特性方面的)?

    在代码方面,最值得研究的是,需要编码的代码段,以获得最有价值的工作特性和可交付性。你可以通过计算投资回报率和没有完成它的惩罚来做到这一点。您必须知道用户是谁,该特性对用户的好处,以及该特性在交付或未交付时对用户的影响。投资回报率和惩罚越高-价值越高。我知道这说起来容易做起来难,但谁说软件生意容易?

    是否值得花时间实现像xCSS和其他系统这样的东西,以便从一开始就更容易编写干净的代码?

    如果你想变得敏捷,那么是的。干净的代码意味着更少的技术债务和更高的软件质量。敏捷建议开发人员持续关注代码的质量。为什么?因为编写敏捷原则的人已经看到太多的项目因为在软件开发过程的早期没有处理技术债务而失败。

    你将如何向他解释细粒度任务和进行小的原子变化的价值。

    与用户故事相关联的细粒度任务的集合,当根据done标准完成时,将生成可交付的软件片段。

    我会这样解释:把你的产品想象成一个多层蛋糕。在你开始制作整个蛋糕之前,你需要知道它将是什么口味的蛋糕,以及它将有多少种不同的层次。风格是模拟屏幕和史诗般的用户故事,层次来自技术史诗故事。这些层包括数据库、中间件、服务器端代码、html、皮肤等。现在一次性构建完整的蛋糕是个坏主意,因为喜欢蛋糕的客户经常会改变他们想吃什么样的蛋糕的想法。一个完整的蛋糕可能比一小块蛋糕需要更长的时间来制作,如果你制作完整个蛋糕(比如巧克力蛋糕)后,顾客要求一个胡萝卜蛋糕怎么办?这会导致一些丢弃的蛋糕或代码:)相反,为什么不一次建立一个小的垂直切片,让客户品尝它,得到一些反馈,相应地修改下一个切片,并不断添加切片,以创建一个完整的蛋糕,这是客户真正想要的!!

    你用你的代码做了哪些事情,导致了更快的发货时间?

    使用分离设计,使用接口继承多于类继承,代码评审,TDD,PMD,Checkstyle,Pair编程,与客户的协作,列表继续。 所有这些事情都会让你的产品“完蛋”。你以后跳过的上述项目越多,你的发货日期就越长。我宁愿给顾客送上一块美味、优质的小蛋糕,也不愿送上一块质量低劣、还没做好的小蛋糕。

        5
  •  1
  •   JeffO    14 年前

    找5-10个你认为对你的网站感兴趣的人来试试。如果你做不到,你们俩就没什么好争论的了。

    在用户面前使用它应该解决两个问题:

    1. 有足够的功能让用户“了解”你的程序将做什么。
    2. 让用户界面足够吸引人,性能也足够好,这样他们就会相信你知道你在做什么。

    完全陌生的人显然会更挑剔,如果被耽搁就永远不会回到你的网站。你身边的人会给你第二次或第三次机会。如果你想创建一个FaceBook克隆,你至少要上传照片并共享它们。等待20秒。为了让主页加载您的猫的图片,要求用户手动键入完整的文件路径,并花5分钟上传一个100kb的jpeg文件将发送用户点击离开。

        6
  •  1
  •   Richard Harrison    14 年前

    由于其目的是快速发布并在此基础上进一步发展,我想说,使用您最熟悉的技术是至关重要的。如果你是一个优秀的OO程序员,那么就使用OO。如果您真的了解数据库,请花几个小时来设计模式。

    你能绝对保证的一件事就是代码会改变。比起试图为一个尚未完全理解的问题设计优雅的代码,IME猛击一堆代码,然后扔掉其中的一半,是一种更好的方法。草率的代码会被替换掉,它的双重作用是发布一些东西,帮助你理解你在做什么。

    太多的准备是当你花数小时/数天的时间去寻找某件事却没有找到答案。解决方法:按照你的第一印象去做。

    要决定代码方面的工作,代码与关键特性直接相关。

    不,你不知道的东西(如xCSS)不值得学。最好是使用一些你确实理解并不断完善的知识 然后雇佣真正的专家 .

    前面已经说过了,我首先要做的一件事就是有层来保持DB、逻辑和UI分离。当我开始使用PHP时,我希望有一个小的框架来完成我没有的所有乏味的工作(Db等),所以最终我以opensource的身份发布了我的工作。我当然建议你读书 how I'd build Db/Logic/UI using my framework 作为一个例子。