※ 引述《justsing (只是唱首歌)》之铭言:
: 最近进入一家蛮大的公司
: 才进去没多久已经把目前正在开发中的专案几乎重构过了
: 原因是因为某前辈写的code问题非常多
: 所有变量都用全域变量,导致资料常常出错
: 命名也很爱取那种
: abc1
: abc2
: 这种完全看不出来在干嘛的东西
: 开发完也完全不测试就推到正式branch上
讲到这个我就心有戚戚
最近在公司接手一些案子,这个案子有多厉害
* 用纯 PHP 意大利面方法写
* 无OOP,无框架
* 数据库无正规化、该索引的没索引,不该索引乱索引
* 因为太多专有名词,DB字段直接用 optA、optB、optC..... optH (option?)
* 重复coding的东西太多
例如查询数据库的部份只有字段不同,就干脆直接copy整份程式码,改字段->存盘
(说好的 class、function 呢? 每支程式都在 create connection or die )
例
get_user
edit_user
del_user
get_article
edit_article
del_article
... 你他妈每一个 CRUD 就给我写一个档案 (里面99%一样,只字段不同)
* N+1 query,比如先查询产品列表,再在循环查询每个产品的producer_id
(明明 JOIN 一次或 eager loading 就可以办到的东西)
* 开发途中才进版控,commit 记录全部 "no message"
* 公司把系统某部份再外包给下游接案公司,给PM接洽发包
接案公司心态:交差
程式码收回来之后,PM不懂coding,对方乱写看不懂,现在要维护、加新功能
花更多时间在还技术债,而且对案主还没结案
* 因为外包的关系,所以资料夹里面有好几包,都是独立的一支系统却串在一起
例如后台用某个写法,有自己的library资料夹等;
前台某个功能又自己一包,每个系统各自成一个生态,然后串在一起
: 后来主管们看不下去就请我帮忙改
: 改完后目前系统改善很多
: 但好像也惹得他很不高兴
: 虽然他现在几乎是半冷冻状态
: 但他偶尔只要写个新功能就会产生一堆Bug
: 之前跟主管反应过也是不了了之
: 毕竟主管不会写程式,也很难看懂他的问题在哪
: 通常大家遇到这种情形,会怎么做呢
: 是不是只能快逃了啊
我在进来现在公司以前,公司主管是有直接告诉我
“我们公司现在很多事情没有成型,如果有新的想法的话,可以直接提出”
确实,在进来的时候也讨论了满多的想法,建议导入开发框架跟SA的概念
明明感觉是业界已经非常简单行之有年的东西,却像登天一样难
我真的是活在平行世界吗
可能公司的心态也有差
公司认为简单的东西可以外包减少工程师 loading,结果程式码品质很难去控管
宁愿花一笔钱外包,也不愿意再请人,不就是饮鸩止渴吗?
(第二手接案公司赚到钱,结果债是我们在还)
不过现在看起来,是有慢慢在变好啦... 有吧。
回到你的问题
我接手这个专案之后,什么修改都是假的
到处 include 比乱继承类别还要难 code review,完全不知道变量从哪里开始出现
更别说程式码混著 SQL 跟 js 了
找 PM 要原始的需求,现任 PM 也不太了解 (因为换好几个PM接手)
后来我 refactor 的作法是:
旧程式码直接放一边,在前端把网站点一点,摸一摸 猜他要干麻
把需求反推回去,看着输入的表单,把 schema 推出来
等于是在大便里面挑黄金一样,最后剩下那一点点稀少的 就是最核心的东西
其他都是 a piece of shit bullshit
一边重写,一边SA
想想什么功能有可能扩充,什么功能是重复的
把逻辑抽出来,变得抽象一点,再各自实作
↑然后你会发现 这些东西不都重复的可以共用 class or method 吗
那些 copy & paste 重复的档案是...
大概就是这样吧
重构真的很累,边写你就会边感叹
以前觉得世界奇观要出国才有
结果发现一堆公司的程式码里面也有
(摊手)