小弟在一个创业型小公司 10 个人搞 golang 项目。最近模块连调的时候发现一个 bug 追到另一个人写的代码里去了,直接崩溃了。
1.那个人一共撸 4 万行代码(包括注释换行),其中 3 万行在一个文件夹下,一个文件夹下直接 30 个.go 源文件。。。。没有任何逻辑和层次,甚至分类。
2.很多函数复制粘贴多次,后面修改代码,得跟着所有函数改一遍。
3.几乎没有封装,要用另外一个 package 的函数,直接大写,导成全局函数。
4.当看到 package 里一个 go 文件全局变量是这么定义的( types 为另外一个包)
var( a=types.Function1 b=types.Function2 ...... ...... n=types.Functionn )
一共定义了 100 多个全局变量。。。。。。
这个人自称 10 年开发经验,我怀疑他是故意这么写代码的。我当时就觉得项目上线 1 个星期内肯定黄,这种代码如何维护更新,我看我要准备跑路了。。。。。 当你想好好做事的时候,碰到这种货,,,哎。。。。。。。。重头再来了。
![]() | 1 awolfly9 2020-07-07 12:15:57 +08:00 ![]() 项目黄不黄其实和代码没有一点关系 |
![]() | 2 Muninn 2020-07-07 12:19:28 +08:00 如果是别的语言还好…… 如果是 golang,你没法说啥,因为最开始官方就是推荐这么写的。 铺 100 个文件的著名项目都多得是。 所以 1 不是问题。 2,算是半个问题,社区有很多过度封装的讨论,有些情况复制是更好的。 3,是 1 和 2 衍生的问题,也不是问题。 4,确实有点问题 总的说来 创业公司刚开始主要是跑通业务 很多公司刚开始用 php 或者啥别的 cms 改改后面再重来。 |
![]() | 3 u823tg 2020-07-07 12:19:37 +08:00 ![]() 10 年这样肯定是故意这么写的,不用怀疑。 |
![]() | 4 zhuangzhuang1988 2020-07-07 12:24:32 +08:00 还好是 go 要是 js, 或者 python, ruby 那才是要黄 |
![]() | 5 luoqeng 2020-07-07 12:30:58 +08:00 ![]() Golang 就是当代的 PHP |
![]() | 6 liujialongstar 2020-07-07 12:33:44 +08:00 之前疯传过一篇如何写出无法维护的代码的文章, 这位深得其中真意, 或许这样, 这位就变得无可替代了 |
![]() | 7 xiangyuecn 2020-07-07 12:41:31 +08:00 ![]() 一言不合就重构 又可以多混半年工钱 |
8 george404 OP @Muninn 1. 要是著名项目就算了,这种 low b 项目根本没到那档次。再说好的项目至少不同版本不会全部塞一个文件夹下吧?整个项目基本上就 2-3 个 package 。 不是过度封装,是几乎没有封装,一个文件夹下 aa_handler.go, bb_handerler.go,cc_handler.go ,然后 aa_handler_v2.go, bb_handler_v2.go 全是这种东西,恶心不?公共函数和逻辑都不提出来。直接 copy-past,大概看一眼,全是每个源文件里面的函数名都基本上相似。 好像我在哪看到,go 中尽量避免使用全局可变的变量,容易被误修改。我是比较认同这种说法 |
9 george404 OP @u823tg 嗯,我也是觉得,这样做快,不用考虑接口,老板看功能好的快,开心,同时,自己又不可替代了,呵呵。。。。。没有人会接那烂摊子。 |
10 george404 OP @liujialongstar 同意! |
11 luojian666 2020-07-07 14:15:07 +08:00 via Android 跑路跑路 |
![]() | 12 xuanbg 2020-07-07 14:27:23 +08:00 还好吧,才 4 万行代码,里面有效代码估计不足 1 万行。实在不行重写一遍也费不了多少时间。总之,这个正在向不可替代发展的先干下去再说,不然还真的要变成不可替代的了。 |
13 qinfensky 2020-07-07 14:33:20 +08:00 via iPhone 大道至简 |
![]() | 14 DJQTDJ 2020-07-07 14:36:04 +08:00 ![]() 这么说吧,公司可以没有你,但是不能没有他。 他的代码只有他知道怎么改。 你一改你就得懵圈 |
![]() | 16 fy1993 2020-07-07 14:41:27 +08:00 不可或缺的人 |
![]() | 17 murmur 2020-07-07 14:41:57 +08:00 我记得 lua 年代就有把库里的函数再定义出来一次加快运行速度的例子 比如 local cosine = Math.cosine |
18 roundgis 2020-07-07 14:41:59 +08:00 via Android 系能用? |
![]() | 19 iwh718 2020-07-07 14:46:12 +08:00 via Android 第一版的话,能跑通就可以了。 |
![]() | 20 DelayNoMay 2020-07-07 14:52:35 +08:00 改需求的话,自己也得累死啊 |
![]() | 21 fiypig 2020-07-07 14:54:33 +08:00 via iPhone 你们没有个主程吗 |
![]() | 22 cnbattle 2020-07-07 14:57:00 +08:00 跟他聊下代码思路 大概是按怎么样的逻辑 结构写的, 可能聊完 再看就没那么乱了 |
![]() | 23 reus 2020-07-07 15:03:48 +08:00 ![]() 第一点问题不大,官方的 net 包,180 几个文件也是同一个目录: https://github.com/golang/go/tree/master/src/net 。用前缀大致区分即可。 第二点有问题,但可以重构 第三点问题也不算大,命名和原来的一样就行 单看你这个描述,其实也说明不了质量,只是你一时适应不了不同的方式而已。 |
![]() | 24 robotdiy 2020-07-07 15:07:40 +08:00 如果是别人写的,你提交下你查到的 bug,让他修改不就得了。 |
25 chenqh 2020-07-07 15:18:32 +08:00 @luoqeng 比 php 差远了,php 的创始人如果想 golang 那批人那么有钱,php 肯定要比 golang 好 |
26 Jooooooooo 2020-07-07 15:25:14 +08:00 ![]() 项目黄不黄完全看业务 再烂的代码能跑起来就行 |
![]() | 27 la2la 2020-07-07 15:31:19 +08:00 如果是业务驱动型项目,项目黄不黄跟代码质量毛关系都没有; 以我司为例 ssm 这一套接口,还没有管理工具,一个 java 文件 7000+是常有的事情,据说是出现过源码文件太大的错误,但是丝毫不影响公司赚钱 |
![]() | 28 szdubinbin 2020-07-07 15:48:07 +08:00 ![]() |
![]() | 29 Kilerd 2020-07-07 15:56:52 +08:00 |
![]() | 31 heiheidewo 2020-07-07 16:17:34 +08:00 这不是标准写法么 |
32 ydpro 2020-07-07 16:24:19 +08:00 ![]() 真十年经验(深知不可替代性 |
![]() | 33 FreeEx 2020-07-07 16:35:31 +08:00 ![]() 幸亏是 Go 语言,如果是 Java 的话,众人皆云:Java 是真的像老太婆的裹脚布一样嗦,我 xx 语言 yy 行就能搞定。 |
![]() | 34 crella 2020-07-07 17:35:55 +08:00 google 的开源项目就没****** |
35 yoke123 2020-07-07 18:00:53 +08:00 ![]() |
![]() | 36 Mohanson 2020-07-07 18:12:26 +08:00 via Android ![]() 菜鸟看到屎山会想办法重构然后被屎淹没,高手看到屎山会维持不倒塌的情况下再把自己的屎拉上去。 |
![]() | 37 yousabuk 2020-07-07 18:55:49 +08:00 via iPhone 不要提出问题,谁提出问题谁解决问题。 |
![]() | 39 itabas016 2020-07-07 19:31:58 +08:00 via Android @DJQTDJ #14 小公司太多这类的”大牛“了,真不知道出了问题修 bug 的时候,他自己是不是也恶心。 |
![]() | 40 zhuangzhuang1988 2020-07-07 19:59:00 +08:00 看这个 t/687773?p=1 |
41 xjq 2020-07-07 20:00:50 +08:00 via Android ![]() 我之前做了个项目也是写的很烂了,感觉要黄,但是老大把坑填完了,只要有负责的有能力的人在,再坑也不至于黄 |
![]() | 42 nasmatic 2020-07-07 20:15:44 +08:00 太年轻,有经验了你会在屎山上巧妙的避开然后再优雅的拉一坨屎上去 |
43 liangch 2020-07-07 20:37:01 +08:00 代码烂的多了去了。但好多应用还是跑得好好的。 想想为什么。 |
![]() | 44 justin2018 2020-07-07 20:48:51 +08:00 sleep(100000) 大法好~ |
45 jin7 2020-07-08 06:50:31 +08:00 感觉没啥问题 |
47 george404 OP @reus 官方 net 下面都是网络相关的,至少整个项目不止是 2 个 package,不会一个类似功能的函数 copy-past 吧?是,什么都可以重构,这么说,都不是问题了。 |
48 george404 OP @zhuangzhuang1988 不错! |
![]() | 49 LokiSharp 2020-07-08 07:46:15 +08:00 via iPhone Golang 不就是这样写的么? |
![]() | 50 Narcissu5 2020-07-08 08:41:02 +08:00 |
![]() | 51 2379920898 2020-07-08 09:08:18 +08:00 小伙子太年轻了,这么多问题,明天你就要领盒饭了 |
52 zh5e 2020-07-08 09:32:01 +08:00 golang 这种包管理方式就是个坑,访问控制用大小写来区别也是个残废。golang 开发项目稳定性没啥问题,重构比脚本语言方便多了,基本满足需求 |
53 mimi888 2020-07-08 09:38:39 +08:00 via Android 4 万行 10 个人一周就能重构好 |
54 leapV3 2020-07-08 10:02:27 +08:00 上面就有些人不明白越分工越细,越被容易替代;和流水线工人有啥区别 |
![]() | 55 Telegram 2020-07-08 10:29:46 +08:00 |
56 exploreXin 2020-07-08 10:36:04 +08:00 技术层面确实让人大跌眼镜,但在资本市场的世界里面,这不算啥,什么设计什么整洁,都是次要的,在老板看来什么是好项目?能赚钱就是好项目。我还见过手动备份 sql 的,就是下班前手动用可视化工具把整个项目库数据导出来存到硬盘里带回家,第二天如果发现 bug 导致数据问题,再整个导进去慢慢恢复数据,我在任职第二年就离职了,但项目运营了五六年 。。。。。。 |
![]() | 57 LennieChoi 2020-07-08 10:40:25 +08:00 你见过一个文件铺 2w+行代码的吗,js 就能做到,我特么刚来公司直接崩溃了,webstorm 打开文件超慢,打开 2w 行的那个文件时候,编辑器右边栏的 warning 提醒显示跟读进度条一样,从那时起 我被逼的入了 vscode 真香大法。代码毫无规范,毫无设计模式,简直代码怎么臭怎么写,刚进公司的时候我以为是先人留下的代码一顿吐槽,后来安了 vscode 的 gitlens 插件后 能看到每一行代码的提交作者,才发现原来是现员工写的,然后我就明白这公司的技术上限了 |
![]() | 58 LennieChoi 2020-07-08 10:46:45 +08:00 @LennieChoi 有时候怀疑,写代码 10 多年了 还写这样的代码,是真的编程能力有问题 还是故意这么写确保自己在公司的地位不可替代性。但是入职这公司,接受这烂代码之后,悟到了没有什么是不能被替代的,这么写代码恶心自己,还恶心下一波人。靠写混淆烂代码确保不可替代性 有这想法的人,本身就是能力欠缺的表现,我们新生代 coder 不可追从 |
![]() | 59 lewinlan 2020-07-08 12:57:12 +08:00 via Android 10 年经验算啥?我相信有不少 10 年经验的所谓大牛真的就是比初学者还菜。 话说回来,业务赚不赚钱跟技术好不好并没有必然关系…… |
60 Cookieeeeee 2020-07-08 17:09:33 +08:00 @nasmatic 好比喻 |
61 fanyingmao 2020-07-08 17:45:08 +08:00 要逼自己写难以维护的代码也挺难的,多少都会有代码洁癖。 |
![]() | 62 overthemoon 2020-07-08 17:59:19 +08:00 我目前就是这种情况。 代码两个人写 |
63 qwefdrt 2020-07-08 18:02:58 +08:00 为什么要故意这么写呢? |
64 george404 OP @qwefdrt 这样弄快啊。 如果家里装潢想在卧室新增加一个插座,肯定是直接从外面拉一根线进来比重新在墙上装插座,布线快。 |
65 george404 OP @exploreXin 牛逼! |
66 george404 OP @LennieChoi 我觉得老板给你这份钱,你就得对得起这份钱。人家给你 10 万块钱盖房子,那你用纸板随便盖,人家给你 100 万盖房子,你再随便盖,毫无层次,良心何在? |
![]() | 67 OHyn 2020-07-09 10:21:53 +08:00 @LennieChoi 淡定。我初学 js 的时候也是这样写的,他们可能。。。圈地自萌 |
![]() | 68 adoontheway 2020-07-09 10:56:49 +08:00 项目黄不黄 跟代码质量其实是没有关系的 |