第一次遇到这样惊险的一次编程,差一点需要重构:Eonval/Feedval的开发实况(6)

王志勇 发表于 2019年06月02日 06:35

Eonval、Feedval、Blogval整个平台的程序部分,在昨天已经终于接近99.999%完成。Blogval的开发时间超出了预期,本来想着应该不会太复杂,但还是遇到了很多难题。就在这些天不断工作,完成了这些大量的任务之后,昨天最后再次调试在线升级时,发现升级会出现中断,于是赶快排查错误的原因。(后面会分析导致出错的原因。) 在这之前,当时开发“在线升级/多站点遍历在线升级”的功能时,是完美运行的。

排查错误,首先要找到相应的语句片段。昨天用了半个多小时,已经找到了。虽然找到了,但是由于平时的编程工作太多,需要记忆的信息已经远超出我的记忆力范围,所以昨天发现这些语句已经彻底读不懂,因为这个单项功能里面有几十个逻辑关系,必须还原开发时的思路才能读懂。

这个“在线升级/多站点在线升级”的功能,是一个大功能,单项功能的主程序已经达到10.1K,开发日记当时也记录了一些,如《Eonval开发实况(5)》。预料中就是一个很难的部分,它是一个单独的大功能,已经数不清是几天完成的,这次这个单项功能估计用了6~8个工作日+加班完成,估计60~80小时左右。

由于有个关键语句没有读懂,那么怎么办?唯一的办法就是把之前花了大量的时间完成的“在线升级/多站点在线升级”的功能,整个删除再重构,再重来一遍

由于平时的这些工作量实在是太多,所以一般不做笔记。开发思路有少量记录了下来,也有少量写在了博客。这些很难做笔记,也有很多直接看语句我自己能看懂,能回想起来。
有很多程序,即使做了笔记,过了3个月也会看不懂,因为工作量多,太容易忘。不太复杂的程序,一年之后,我一般还是能看懂70%-95%左右。

这个关键语句,到现在我还是没有完全读懂,还是没有回忆起当时的开发思路。这里面的逻辑关系是这样的,当时设计的在线升级功能,假如用户已经错过了20期的更新,那么当他更新时,这20期的更新内容,是一键完成的。在程序里,这20期的文件不能一次下载,为了防止报错,需要分成10期为一个大的分页,且每15个文件为一个文件分页,一次最多下载15个文件,然后自动跳转到下一页,接着自动下载文件。也就是1-10、11-20为2个大分页,假设1-10中有145个文件,则会分成10个文件分页。

将这20期合并为一次更新,还有个好处是因为多期的更新,里面会有大量的重复文件,重复的文件只需下载一次。比如20期中更新过73个文件,除去重复的文件,其实总共更新了17个文件。合并之后,只要更新这17个文件就好,这一功能是在程序设计里实现的。

上述提到的“下载”,并不是下载到用户的电脑中,而是自动下载到用户的远程Web服务器中

昨天的一个错误,是大的分页、文件分页的翻页这里有个语句遗漏了。是什么导致遗漏呢?因为当时的完美运行的,是不会出现这个遗漏的。

后来我分析了一下,可能是由于这些大量的数据写入的程序,我都是在虚拟硬盘里编写、测试的。恰好这个程序,忘记了拷贝到了实体硬盘。

在虚拟硬盘里写程序,是非常非常麻烦的事情。因为虚拟硬盘是将内存条划分出部分空间,关机后虚拟硬盘的所有数据会丢失,所以修改的文件必须拷贝到实体硬盘,拷贝是个繁琐的事情,每次都需要搜索所有的文件,然后按照时间排列来分析当天更新的文件。

必须用文件搜索的方法,来分析更新的文件。因为程序开发中,需要思考的事情过多,根本记不住当时更新了哪些文件,这种情况下,人脑记忆极容易有遗漏。

但是大量的数据写入、测试,则必须用虚拟硬盘。

除了这个遗漏,我发现导致这次在线更新中断,还有个原因,在线更新调用的一个远程程序,也有个写错的地方。为什么那个远程文件会写错呢?原因也是同上,可能是忘记了把虚拟硬盘中的文件,拷贝实体硬盘,导致实体硬盘里的文件是开发中的半成品。(这种写错在开发中每时每刻都在发生,但是成品很少有这样的错误,因为成品是经过了超大量的测试。因此,可以判断这是个半成品语句。)

而开发完成的成品,是在当时的虚拟硬盘里,没有及时更新实体硬盘里的文件。

2条评论:
1   angel2018 2019-06-02 19:20
勇哥,看了全文,好可惜。如果有个工作过程的快照记录,或定时间抓拍工作屏幕的快照就好多了。

自由勇 2019-06-03 08:18
谢谢阅读!我有做过很多的屏幕截图,记录最后的工作环境。开发中,也有定期整站打包备份。

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

王志勇:1980-09-26 (43周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2023 auiou.com All rights reserved.
此Blog程序由王志勇编写