我继承了一个PHP项目,结果证明这是一场噩梦.以下是重点:
所有原始开发者都离开了
代码没有版本控制
所有开发和测试都是通过重命名和编辑PHP文件在实时服务器上完成的.每个文件index.php,index2.php,index3.php等有多个副本,并且不清楚哪些文件真正被使用
每个文件中有多个包含文件,其中包含包含其他文件的其他文件等.
项目中有多个开发人员,每个人都有自己的做事方式.例如,有一个JavaScript框架的大杂烩,一些数据库查询使用SQL,另一些是XML接口,其他人调用数据库中的过程函数.
由于所有这些问题,开发速度令人沮丧.除了向Stack Overflow发泄我的挫折之外,还有关于如何开始这个烂摊子的任何建议?我自己也很熟悉PHP开发,但它似乎设置了某种开发环境,以便在不破坏实时服务器的情况下测试更改是第一步.有关如何入门的任何提示?什么是典型的测试方法?在我的桌面上设置本地版本的网站似乎需要做很多工作(服务器是Linux,但这里的桌面是Windows).我可以在实时服务器上创建一个子目录进行测试,还是......?那数据库怎么样?
其次,是否有某种分析我能够跟踪服务器上实际使用的文件?我想删除实际上没有包含的重命名的副本.更好的是,有没有办法告诉文件的哪些部分没有被执行?有许多复制的函数和垃圾,我怀疑它们也没有被使用.同样,对于包括,任何解决混乱的提示?
好吧,我会停止在这里发泄,让自己受到每个人的怜悯.:)
首先,按原样在版本控制中获取文件.在完成之前不要超过#1.
建立测试环境.
清理文件
我做到了这一点.你有同情心.如果您的护照不是最新的或由于某些其他原因您不能躲避这样做,这就是我接近它的方式:
步骤零是让它进入版本控制,无论它多么糟糕.如果它甚至有效,并且你破坏了某些东西,你需要能够回到工作状态 - 或者至少比较你对它的改变以找出问题所在.在进行重构时,请经常进行小规模检查,并且当出现神秘错误时,您将获得更少的代码.(事情会神秘地出错.)
在那之后,我将从数据库开始.确保所有内容都相对较好地标准化,列名称清晰,等等.
接下来是PHP代码.如果代码真的那么拼凑,我会继续并适应框架.看看CakePHP或Symfony - 他们的Rails-ish分离关注点的方式使问题"这段代码应该去哪里?" 很容易回答.这不是一项小任务,但是一旦你完成了它,你可能比拥有一个理智构建的应用程序更好.此外,良好的Web框架的内置测试工具使重构FAR更容易 - 在更改之前编写测试以涵盖现有功能,并且您将知道在更改后是否损坏了任何内容.
一旦您对数据库进行了排序并在模型中包含模型代码并在控制器中包含控制器代码,那么您可以担心表示级别的内容,例如在单个JS/AJAX库上进行标准化,清理CSS等.
至于开发环境:你应该绝对设置一个本地开发环境.那里有交钥匙WAMP包,或者你可以安装到Linux机器/ VM(我建议使用VirtualBox进行虚拟化).您还应该有一个单独的集成测试环境,模仿实时服务器.除了实时代码,应该在实时服务器上运行.
至于调试/分析工具,我知道Symfony带有一套非常漂亮的工具,包括一个小的JS工具栏,它出现在你的页面上(仅在调试模式下),带有日志记录和分析信息.
祝好运.
嗯,首先要做的事情.我一直处于你所处的境地,而且很糟糕.我认为你想要开发和运行开发环境是正确的.
这将包括Web服务器/脚本引擎/数据库引擎堆栈,以及最有可能的IDE.
对于LAMP堆栈安装程序,我建议使用以下方法之一:
http://www.apachefriends.org/en/xampp-windows.html
http://www.easyphp.org/
http://www.nucleex.com/nucserv/
进一步阅读LAMP堆栈:
O'Reilly的OnLamp网站
对于一个好的PHP IDE,我建议使用以下方法之一:
Zend Studio
ActiveState Komodo
Jetbrains PhpStorm
IBM开发者网站上的文章比较了几个IDE
对于Source控件,您可以使用Team Foundation Server,SVN或Git - 只需使用您知道的内容即可.我建议首先将所有内容都放在源代码控制中(对于您可能进行的任何紧急维护),然后计划进行相当大的改造.
您提到您甚至不知道使用了哪些文件,并且他们使用文件命名约定作为伪版本控件.一旦开发和运行开发环境,您可能希望在那里开始大修.有几件事可以帮助你:
您的应用客户/用户
细致而有组织的笔记
一个好的日志框架
您的客户/用户很重要,因为这听起来像您是项目的新手,他们会知道应用程序的行为应该比您(最有可能)更好.
细致记笔记非常重要,因为您将从根本上重写任何要求/设计/最终用户文档.如果你要这样做,你需要了解内部.如果你要了解这个系统的任何内容,你需要自己写下来(或者你现在正在阅读预制文档,而不是阅读Stack Overflow);-)
最后,日志框架很重要,因为您需要修复问题,而无法修复您不知道的事情.通过日志记录框架,您可以查看没有任何明显UI的应用程序部分.将其插入应用程序的各个部分,然后查看日志,可以让您清楚地了解代码执行的时间和顺序.
你需要专注于捕获(在纸上)应用程序应该如何工作,然后慢慢删除不必要的文件,同时试图不破坏任何东西.密切关注日志以帮助调试.确保您的客户不会尖叫有什么东西坏了.确保您的笔记符合记录的内容以及客户的意见.
将所有内容重新检入源代码管理.希望到目前为止,您将获得更新,更精确,更好的目录结构.
获得测试结构.即使这只是意味着获得一个基本的单元测试框架并在每次部署后进行一些基本的冒烟测试,但总比没有好.理想情况下,您应该拥有一名测试工程师或知识渊博且值得信赖的客户,他们可以在每次部署后花时间进行测试.
如果您增加了多个开发人员,请部署一个部署流程.控制对生产环境的更改应该是您的首要任务.(你要做的最后一件事就是再次讨论这个问题吧?)你应该有一个清晰而简单的过程来在环境边界之间移动(比如开发 - >测试然后测试 - >生产).
大多数情况下,您可以使用grep判断文件是否正在使用.
grep -r "index2.php" *
您还可以使用PHP解析器来帮助您进行清理.这是一个示例脚本,它打印出声明的函数和函数调用:
#!/usr/bin/php type = $rawToken[0]; $this->contents = $rawToken[1]; } else { $this->type = -1; $this->contents = $rawToken; } } } $file = $argv[1]; $code = file_get_contents($file); $rawTokens = token_get_all($code); $tokens = array(); foreach ($rawTokens as $rawToken) { $tokens[] = new Token($rawToken); } function skipWhitespace(&$tokens, &$i) { global $lineNo; $i++; $token = $tokens[$i]; while ($token->type == T_WHITESPACE) { $lineNo += substr($token->contents, "\n"); $i++; $token = $tokens[$i]; } } function nextToken(&$j) { global $tokens, $i; $j = $i; do { $j++; $token = $tokens[$j]; } while ($token->type == T_WHITESPACE); return $token; } for ($i = 0, $n = count($tokens); $i < $n; $i++) { $token = $tokens[$i]; if ($token->type == T_FUNCTION) { skipWhitespace($tokens, $i); $functionName = $tokens[$i]->contents; echo 'Function: ' . $functionName . "\n"; } elseif ($token->type == T_STRING) { skipWhitespace($tokens, $i); $nextToken = $tokens[$i]; if ($nextToken->contents == '(') { echo 'Call: ' . $token->contents . "\n"; } } }
设置开发服务器(正如Greg Hewgill所说,VirtualBox和Virtual PC是很好的选择).
将当前站点文件(包括相关的Web服务器和PHP配置!)放入版本控制中.
找出正在使用的文件 - 使用开发服务器设置通过删除所有fooN.php文件进行测试,看看它是否仍然有效.
祈祷......很多(好吧,这不是必需的,但听起来你需要它).
如果这是最糟糕的情况,代码全部被解压缩,并且所有显示都与逻辑和数据库调用混合在一起,你可能会做我必须做的一个PHP项目.
我尝试了重构方法,给了它三个开始.这就像在摩托车上爬山,每次都达到10%的路程.所以我采取了另一种方法,最终做得更好.
我以用户身份登录,
并且我可以找到每个屏幕和每个用例.
我将html保存为静态文件,
并记录了程序操作和明显的业务规则.
我这样做了3天,然后记下了笔记并与利益相关者进行了长时间的交谈.
在获得一些第一步的协议后,我使用良好的一致设计和抽象重新实现了所有html UI.滚动后,我每天可以做几个屏幕.
然后我将结果反馈给利益相关者,并查看了一堆用例.(利益相关者对第1步和第2步非常满意,因为他们根本不喜欢第一次实施(惊喜),现在看起来似乎有改进的希望,而不仅仅是恢复了理智的应用程序.
结果证明这是艰苦工作的结束(也是利益相关者感知到的项目风险的终结.)
事实证明,第一批工作人员已经陷入了他们自己的错误意外的意大利面,实际上工作的内容相对较少,所以复制它的范围比每个人都怀疑的要少.
但关键的决定是原始代码,无论是内容还是结构,都是不可能的,我需要从一个完全外观的角度来看待一个经过适当设计的新框架.
您可以考虑的一件事是在开发环境中安装PHP"xdebug"扩展,将其设置为跟踪所有函数调用,然后尽可能完全(可能通过自动UI测试)运行整个应用程序.然后,您将能够分析/解析xdebug跟踪文件,以查找应用程序使用的所有文件/函数.
这个帖子上的其他人都有很好的建议.我也遇到过这种情况.可能每个人在他们职业生涯的某个时间都走进了一个看起来像被龙卷风击中的项目.
我要补充的一个建议是,在进行其他人描述的任何清理之前,您需要获得管理层的支持.
根据此主题的建议制定计划.
描述创建开发和测试环境所需的任何新硬件或软件,并对其进行定价.
找出您需要接受哪些新技能来设置和使用开发和测试环境.估算获得这些技能所需的时间和费用.例如书籍或付费培训.
估计工作时间表以便进行清理.在源代码管理下获取代码需要多长时间?多长时间了解数据库?多长时间了解PHP和javascript代码?
向你的经理提出这个问题,并根据他的利润来说明目标.例如,一旦清理完所有内容,进行更改或推出新功能将更快,调试错误将更加可预测,并且增加新员工将更容易.
当然,你需要继续使用当前的混乱,因为它是一个实时站点.管理实时站点具有优先级,因此清理工作必须是后台任务.这意味着它需要更长的时间.我将清理中等规模项目作为后台任务的经验通常需要6到12个月.由于该网站将在此期间继续发展,因此您可能需要修改或重新完成一些已完成的清理任务.确保你的经理也理解这一切.
如果经理对您的计划进行了清理,或者不打算清理它,至少那么您就会知道为什么所有其他开发人员都离开了这家公司!
我有一些关于如何进行的具体建议:
除了所有其他好的建议,我建议使用Joel Test作为基准.您的清理计划应该会导致在Joel测试中获得良好成绩的工作环境.
阅读我的答案" 理解不熟悉的数据库的最佳方法是什么? "
启用网站登录,以便分析实际调用的PHP页面.至少可以告诉你index2.php,index3.php,index4.php等中的哪一个真的已经过时了.
PHP有一个函数get_included_files()
返回当前请求中包含的所有文件的数组.通过记录此信息,您可以找出正在使用的PHP文件,即使它们未显示在Web服务器日志中.
您确实需要一个与您的生产服务器匹配的测试和开发环境.在Windows上进行测试并在Linux上部署是没有用的.在开发期间使用MySQL 5.0并在生产中使用MySQL 4.0并不好.您可以使用更适度的硬件平台(虽然兼容).
我会:
坐下深呼吸;
确定这是否真的在你想要的地方;
假设是的,那么我会卷起我的雨具,一次挑选一个烂摊子开始工作.
我知道我们不能仅限于一次只完成一项任务; 但是,在处理日常任务时,您可以限制您的工作一次解决一个混乱.
您可以通过将其放在页面底部附近来查看所有包含/所需文件的列表: