请允许我的介绍正确定义我的问题范围:
我对编程世界还很陌生。当我对软件程序有所了解但没有编程经验时,这一切都始于我。我最终走了外包路线来获得这个项目,经过近一年的努力,我们确实让它得以实现和运作。
这个特定的程序是用PHP编写的,是100%基于Web的。我们正在使用大量的ajax,jQuery等。
现在进入它的一年,我一直在学习和学习(我在这里学习很多!!!)我现在主要关注Java来构建Objective-C和iPhone的乐趣(可能就像99所有其他新手程序员的百分比。)
我真的学到了很多东西,而我正在学习的最重要的事情之一是正确的评论和可扩展性。
我现在看到,我们刚刚完成的这项工作在这两方面都非常缺乏。我想要添加和构建这个程序,不仅没有太多的经验,而且我发现如果没有这些评论,我甚至很难对这些功能有所了解......
所以我的问题是 - 开始接收这个项目的最佳方法是什么?完全重写是不可能的,我认为不需要。
我确信这不是第一次新手程序员,软件开发人员一直沿着这条路走下去......其他人在这里做了什么?
程序员是否常常进入一个项目很远,然后“清理”混乱,以使事情有效地向前推进?
如果对于这个问题这是错误的地方(我理解它可能是这样),有人可以指出哪个更合适吗?
谢谢! 乔尔
答案 0 :(得分:5)
我们称之为“refactoring”,这是编程的重要部分。
首先,您必须拥有一套坚如磐石的自动化测试。通常我们使用单元测试框架运行单元测试。
http://www.testingtv.com/2009/09/24/test-driven-development-with-refactoring/
然后您可以进行更改并运行测试以确认您的更改没有损坏任何内容。
在某些情况下,您必须围绕现有程序进行“逆向工程”测试。这不是很困难:您必须专注于“外部”或“主要”或“重要”的接口。
由于你是逆向工程,一开始很难确定应该测试什么(因为它是一个重要的外部特性),以及不应该测试什么(因为它是一个实现细节。)
答案 1 :(得分:2)
我真的学到了很多东西,而我正在学习的最重要的事情之一就是正确的评论和可扩展性。
首先,我很好奇你所学到的关于“正确评论”的内容,因为这种情况有很大的不同。对于一些人来说,它记录了每个类和功能。对于其他人来说,它可能记录了每行代码或根本没有代码。
经历了上面的一些不同阶段后,我和鲍勃·马丁叔叔在Clean Code,说你记录了决定,而不是代码的作用。代码本身应该是可读的,不需要文档。通过添加描述行为的注释,您创建了最终将不同步的重复。相反,代码应该记录自己。使用命名良好的函数和变量有助于准确描述其他人的意图。我强烈推荐使用Clean Code来全面讨论这些概念。
至于可伸缩性,它通常是你想要构建的东西。可伸缩性可能是良好设计的一个功能,或者是对需求的适当设计,但是糟糕的设计会使可伸缩性成为一场噩梦。
我现在看到,我们刚刚完成的这项工作在这两方面都非常缺乏。我想要添加和构建这个程序,不仅没有太多的经验,而且我发现如果没有这些评论,我甚至很难对这些功能有所了解......
我认为这是两件事之一的指标:
写好,意图揭示代码很难,需要多年的练习。
所以我的问题是 - 开始接收这个项目的最佳方法是什么?完全重写是不可能的,我认为不需要。
正如其他海报所提到的,Refactoring。重构是在不改变功能的情况下更改代码以提高可读性和可用性的过程。获得一本关于重构的好书,或者开始阅读您可以在线阅读的所有内容。它现在是一项关键技能。
程序员是否常常进入一个项目很远,然后“清理”混乱,以使事情有效地向前推进?
不幸的是。为了避免陷入这个陷阱,需要很多的努力。尽量让你的代码每天都好一点。
答案 2 :(得分:1)
我不知道这是不是错了,但我会尽可能地回答:
程序员是否常常进入一个项目很远,然后“清理”混乱,以使事情有效地向前推进?
是的,根据我的经验,这很常见。我已经做了超过10年的合同工作了,我无法计算我必须进入的次数和清理一些匆忙组合起来的东西,要么使其扩展,要么能够在其上添加功能。当您将节目外包给另一家公司时,这种情况尤为常见,这种激励就是尽快让它运转起来。
所以我的问题是 - 开始接收这个项目的最佳方法是什么?完全重写是不可能的,我认为不需要。
我不知道这个问题有一个“好”的答案,我唯一可以告诉你的是一次采取一种方法并记录他们在你弄清楚时所做的事情。如果您仍然可以访问最初编写该程序的人员,您可以询问他们是否可以向您提供有关系统的文档,但如果未将其作为原始工作规范的一部分包含在内,我怀疑他们是否会有任何文档。< / p>
我真的学到了很多东西,而我正在学习的最重要的事情之一是正确的评论和可扩展性。
正如您自己发现的那样,正确的评论很重要,我不相信从一开始就建立可扩展性的重要性,遵循YAGNI原则。我认为,随着任何程序的增长,它将经历成长的痛苦,无论是可扩展性还是功能性。有人可能从一开始就建立了twitter,并考虑到它目前需要的可扩展性吗?可能,但是它有可能会失败。
答案 3 :(得分:0)
程序员是否常常进入一个项目很远,然后“清理”混乱,以使事情有效地向前推进?
对于每个程序员来说,这绝对是常见的:)
话虽如此,请记住IIABTFI原则。如果它没有被破坏,请不要修复它。
了解程序的工作原理以及各个部分的用途。
在没有特定目标和商业目的的情况下尝试改进它不是。
答案 4 :(得分:0)
最大的问题是目前运行的程序能否满足使用它的人的需求?虽然它可能不是最好看的代码,但它确实有效,这可能意味着你最终会围绕它进行101次重构练习,以获得足够的基础知识以进行其他更改。
虽然您可能会询问该程序的原始作者,但如果他们认为它很棒并且您认为它是垃圾,那么这可能是一个可能的痛点。这是一个想法,应该在一个人去之前仔细分析并最终烧毁桥梁,因为他们认为你无法欣赏他们所做的天才。
通常这不是以最佳方式完成的,因此当学习更好的方法来做事时,事情就会以更好的方式完成。当然,这是有限制的,但我首先想到的是,你有一些重构课程可以帮助你掌握应用程序的基础知识,然后开始使用增强功能和其他内容来查看真正完成的内容。结束。