Back

拯救腐朽项目的步骤 (steps to save a fallen project )

发布时间: 2014-08-07 03:01:00

在搭建环境的过程中:

1. 没有文档。 不知道如何在本地搭建环境

目前: 所有的开发都是直接把代码'dui3'到生产服务器上。 在钢丝上敲代码。 

  要安装哪些lib, 哪些 dependency, 哪些数据库,都要写清楚。   比如:  项目A,依赖了3中DB: mysql, mongodb, redis.  

2. 没有本地数据库。  

目前: 所有开发都是链接生产数据库。 

解决办法: 把远程的生产数据库导出来。 由于远程数据太多,所以mysqldump 时只导出前2000条数据 。  

3.   文件不全。

目前:很多配置文件和运行文件都不在SCM中。

解决办法: 对比远程的数据,把文件一点一点下载到本地。 对于某些敏感的配置文件, 把它从 settings.py 变成 settings.py.example

4.  部署方式不规范

目前: 改好代码之后, 把相关的代码SFTP到生产服务器上。   

解决办法:  使用capistrano 做部署, 可以自动化部署,省时省力。而且可以回滚。

5. 有很多多余的文件,放到了 SCM中。 

目前: .pyc 这样的编译文件, 以及 .svn 文件,都保存在了 git 中。 

解决办法: 把它们都删掉。

 
$ git rm *.pyc
$ find . -name .svn -exec git rm -rf {} \;

6. css, js 文件 过多,没有合并。

目前:  124个外部 js 文件,  26个外部 css 文件, 每次加载时间 在800ms

150 requests  ❘  78.3 KB transferred  ❘  740 ms (load: 793 ms, DOMContentLoaded: 760 ms

解决办法:  将各种 js, css 都合并。   (例如ruby中的 asset_packager: https://github.com/sbecker/asset_packager )

7. 命名不规范。 

目前:  page2/index.html    page3/index2.html   ,       xyh = '',   btz = ''  ,完全看不懂。  甚至还有f#ck 这样的文件名。 -_-! 

解决办法:  改成有意义的名字,比如:  apple = ''    tree = ''    is_from_remote = ''   ,

8. 各种依赖的外部地址,直接写在了代码中,没有提取出公共的常量,

目前: 某个地址依赖的外部应用 : some_app.com 总共出现了6次。而如果不考虑端口,则出现了20多次。

解决办法:把所有依赖的外部应用都提取到一个配置文件当中。这样修改起来也会很方便。

9.方法过长:

目前:程序的入口方法,超过了1200行。注意:这是一个方法哦亲!

解决办法: 重构,extract method.

10.代码没有整理过。处女座情何以堪。

Screenshot From 2014 08 07 13:33:25

解决办法: 果断代码美化啊亲! http://jsbeautifier.org/  (非常给力, 原来7000行的代码,美化之后(变成 4220 行))

11. 各种 bad smell 的代码:

# 老旧代码:
        if res_u != None:
            c.execute(" select user_id,role_id from `stat_acl_role_user` where user_id = %s  " % res_u[0])
            res = c.fetchall()
        else:
            c.execute(" select user_id,role_id from `stat_acl_role_user` limit 1  "   )   
            res = c.fetchall()

# 整理后的代码: (这里用一个 三元表达式 更合适 )
        if res_u != None:
            sql_string = " select user_id,role_id from `stat_acl_role_user` where user_id = %s  " % res_u[0]
        else:
            sql_string = " select user_id,role_id from `stat_acl_role_user` limit 1  " 
        c.execute(sql_string)
        res = c.fetchall()

Back