点击上方 Java后端,选择“设为星标”
优质文章,及时送达
源 | 知乎
本文整理自知乎上的同名讨论帖:《为什么有些大公司技术弱爆了?》,版权归原作者所有,原文地址:
www.zhihu.com/question/32039226
有网友提问:
今年年初,到一家互联网公司实习,该公司是国内行业龙头。不过技术和管理方面,却弱爆了。那里的程序员,每天都在看邮件,查问题工单。这些问题,多半是他们设计不当,造成的。代码写的一团糟,全是复制粘贴,连作者都没改,大家普遍不写注释,也不格式化,代码歪歪扭扭。
一个项目里,httpclient竟然出现了四种。一种是该公司研发部写的,一种是老版本的开源项目,一种是新版本的开源项目,还有一种是开发人员造的轮子。
打接口请求响应日志,竟然不知道用拦截器。
打错误日志竟然不打上下文信息,每个人一种日志风格,千奇百怪。
许多重要的中间流程,居然不打日志。
idea、eclipse、myeclipse的配置文件竟然全部传到项目里去了。
该公司混了两年的程序员,跟快递公司做查询接口,竟然不知道加密运单号。
所有服务间通讯,都没有设requestId,导致跟踪会话很困难。
一个没什么qps的边缘接口,居然做消费者生产者+阻塞队列的异步模式。
显得你技术少是不是。
不知道异步会增加维护成本,提高测试难度吗?
而且,任务队里没有考虑持久化,赶上发布,丢了好多任务。
读取一个小小的xml和exc配置文件,居然用流式解析,没见过这么二逼的,真是醉了。
做优化全靠拍脑门拍大腿,难道不会用excel分析日志,用jprofile扫项目?
一个100以内的常数集合遍历,他也要写个优化算法进去,算法跟业务还搅在一起,一团乱麻。
每个人都在嚷嚷性能、算法、分布式计算……
几乎没有文档,全靠从代码反推逻辑。
有枚举他不用,非要在每个页面上,把枚举值挨个儿写死,知道后面改代码多么费劲吗?
欺骗性的变量名,里面存储的是AES加密的,变量名后缀却写成了DES;里面存的是小写字母,却写成upperStr。
一个方法十几个参数,有三分之一是极其简略的缩写,注释肯定也没有的。
一个类写到三四千行是常事。
开发自测,居然要把代码全丢到公共机器上,而且都是走svn,他们把svn当ftp用。
svn里面大量的无意义提交,一多半的提交连都编译不过去。
我看到有个应届生,改了两句话,马上提交,说是怕代码丢失。
一个运行了两年的项目,spring的包扫描明显配错了,有些bean根本扫不进来,居然没有人发现。
一半的bean在spring管理下,另一半的bean他们自己写单例模式来实例化。
他们用mysql来做审计系统,出报表,有个报表要跑8分钟。
原来是有人用字符串来存多值(逗号分隔),sql里写了like,导致没有利用到索引。
为什么不用pg,pg在sql编程方面,功能更丰富,更适合做统计,它本身就支持数组。
程序员们都是得过且过的态度,怎么把代码灌进去,跑的通测试,就算交差了。
为什么大型互联网公司,技术和管理这么差劲,是怎么形成的?
萧井陌的回答:
地址:
www.zhihu.com/question/32039226/answer/76059969
楼主你好,我试着给你解释一下,希望你能满意。
新手经常会有这样的想法——「这代码怎么这么烂?写的人干什么吃的?怎么能这样?为什么不按照书上说的做?」,这很正常,大家都年轻过,经历过这种阶段,我懂你心里的想法,所以也愿意详细地向你解释,这一切发生的原因是什么。
你说
不过技术和管理方面,却弱爆了。那里的程序员,每天都在看邮件,查问题工单。这些问题,多半是他们设计不当,造成的。
你真的觉得『国内行业老大的互联网公司』会是技术和管理弱爆了的样子吗?
你以为团队应该像永动机,但现实永远有各种摩擦、辐射、损耗。
内燃机的能量转化率,通常只有 30% – 50%,但是它却是驱动全世界运转的核心引擎,顺丰京东的快递小车、联通全国的高铁动车绿皮、瞬时直达的飞机……
机器尚不能 100% 效率运转,何况是人呢?
你说我们的程序员每天都在查看邮件、问题工单,你说这些问题多半是我们设计不当造成的,请问你有试过统计数据吗?你大概只是『感觉』如此吧?
事实上,经过十几年的发展,我们内部的『效率改进团队』已经非常高效成熟,每月、每周、甚至每天都会有新的改进,现在的业务处理方式,不说全世界,我可以自豪地说在全国我们是领先的,甚至是遥遥领先,不然凭啥坐到了全国龙头老大的位置呢?
所以啊,你只看到了程序员花在业务上的时间,没看到我们内部的『效率改进团队』为程序员们省掉的时间,我觉得我有必要站出来为默默付出的『效率改进团队』说几句。
当然,楼主作为实习生,不知道这些事情进而产生了这些疑问,也暴露了我们的不足。我已经在『团队建设委员会』里提出了这个问题,大家一致通过了决议,以后我们会对新员工——包括实习生加强企业文化、历史培训,确保我们的新伙伴们不仅知道要去哪儿,也要清楚我们从哪里来,长路漫漫,我们一同前行。
你觉得
代码写的一团糟,全是复制粘贴,连作者都没改,大家普遍不写注释,也不格式化,代码歪歪扭扭。
当初公司起步的时候,整个项目都是几个初创程序员加班加点熬出来的,我知道你看过《代码大全》、《程序员修炼之道》、《Unix 编程艺术》,你对上面的准则信手拈来,你可否翻开床头柜上的这几本书,看看它们的出版时间呢?
是的,公司起步的时候,这几本书根本还没有出版,彼时中国互联网方兴未艾,大家都是摸着石头过河。现在你遇到问题,你可以问朋友、问导师、用谷歌、用栈溢出、用知乎,我们写程序那个年代,看的是谭浩强、严蔚敏,用的是 52k 拨号上网,语言只有 C,编辑器是没有语法高亮和实时编译的,编译器是没有智能准确的报错的,没有现在这么多知识、也没有这么多规范和好资源、好工具。不过我们还是把项目做出来了,把公司一步步推到了现在的位置。
不过这个问题是客观存在的问题,谁也不否认,但是你知道为什么你被分配到了一个『代码看上去一团糟也不够规范』的项目吗?我们需要新鲜血液来重构一些老代码,所以你会被分配到艰苦的岗位上。我们希望你是勇于战斗的战士,我们更希望你能成长为经验丰富的老兵,而把你放到这种岗位,是对你来说成长最快的方式。
你认为
一个项目里,httpclient竟然出现了四种。一种是该公司研发部写的,一种是老版本的开源项目,一种是新版本的开源项目,还有一种是开发人员造的轮子。
你不知道的是,我们最初用了开源软件(也就是你所说的『老版本』),它构成了我们早期项目的基石,随着业务复杂性增加,我们改进并最终切换到新版本。
这个软件跑老业务非常成熟,但是在一些新业务上有不可调和的矛盾,所以在痛苦的适配后,研发部的同事们自告奋勇用 20% 的时间写了新业务的组件——是的你没看错我们也有 20% 时间,我们鼓励工程师的创新。
至于你说的开发人员造的轮子——这说起来可真有趣,它其实是前年来的一个清华大学实习生写的。
当时他来了之后,针对他接手业务的需求,向我抱怨说现有的 3 种都不好,要写一个新的来『统一天下』,这话是他的原话,我记得非常清楚,因为以我多年经验来看这样的做法是不可取的,但是本着锻炼年轻人的心态(加上他的确是不可多得的天才),我同意了他的请求,于是我用自己的业余时间接管了他的大部分工作,全力支持他写一个新的组件,帮他挡住了所有上面的压力,后来的故事就是你看到的这样。
是的,他后来越深入、就越来越感到业务的复杂,不断推翻重构、拆东墙补西墙,但始终发现和自己想的根本完全不一样,受不了了就走了,留下来这个。
我们明年的规划中,就包括剔除这个组件的 codebase,因为它实在是太糟糕了。
你又说
打接口请求响应日志,竟然不知道用拦截器。打错误日志竟然不打上下文信息,每个人一种日志风格,千奇百怪。许多重要的中间流程,居然不打日志。idea、eclipse、myeclipse的配置文件竟然全部传到项目里去了。该公司混了两年的程序员,跟快递公司做查询接口,竟然不知道加密运单号。所有服务间通讯,都没有设requestId,导致跟踪会话很困难。
拦截器并不如你所想的那班美好,也许你在自己的电脑上写过一些玩具代码,觉得这样很方便、酷炫,但是真正到了战场,你会发现没什么才是必须的、好的,只有适合的才是对的。微信搜索web_resource 关注获取更多推送。
至于配置文件,这么说吧,IDE 的配置文件传到代码仓库是我定下的规矩,『怎么会有人定这样的规矩?』,是的你可能从软件工程的教科书上或者某些『知名博客』上读到了不能这样做,但实际上这样做在很多情况下是必须的。
原因何在?
这样可以确保代码克隆即可用,而不是让每个人都去设置一大堆无聊的东西,这样不仅节省时间,也确保了每个人的环境一致性,你想想这几年火热的 docker,应该明白了这样做的正确性和必要性了吧?
你可能会说即便如此、插件也不用上传到服务器保存,我告诉你这样是不行的,你要考虑到我们这个项目前后十余年,你觉得几个插件能坚挺十余年?很可能我们早期用的软件,现在你已经完全不可能找到了,所以保存一份备份是非常有必要的,决不能错误地认为是冗余。
教科书只会教你基本通用的原则,树立你基本正确的观念,但是如果只是死守教条,如何能拥抱日益复杂的变化呢?
你看的教科书,且不说时间上已经是二十多年前的了,在适用性上,也不说就是真理,IT 行业发展日新月异,几个月就是沧海桑田,为了适应这样的变化,认真地思考、总结、判断才是最重要的。
你觉得
一个没什么qps的边缘接口,居然做消费者生产者+阻塞队列的异步模式。显得你技术少是不是。不知道异步会增加维护成本,提高测试难度吗?而且,任务队里没有考虑持久化,赶上发布,丢了好多任务。读取一个小小的xml和exc配置文件,居然用流式解析,没见过这么二逼的,真是醉了。
知
道,当初跑在你口中的「一个没什么qps的边缘接口」上面的业务带来了公司曾经 90% 的收入,所以我们用了复杂的设计以应对当时的需求,当然现在业务转变,老系统不再需要处理那么多业务了,但是更没有理由为一个『works perfectly well』并且不再重要的业务重构代码吧?
做优化全靠拍脑门拍大腿,难道不会用excel分析日志,用jprofile扫项目?一个100以内的常数集合遍历,他也要写个优化算法进去,算法跟业务还搅在一起,一团乱麻。每个人都在嚷嚷性能、算法、分布式计算……几乎没有文档,全靠从代码反推逻辑。有枚举他不用,非要在每个页面上,把枚举值挨个儿写死,知道后面改代码多么费劲吗?欺骗性的变量名,里面存储的是AES加密的,变量名后缀却写成了DES;里面存的是小写字母,却写成upperStr。一个方法十几个参数,有三分之一是极其简略的缩写,注释肯定也没有的。一个类写到三四千行是常事。
开发自测,居然要把代码全丢到公共机器上,而且都是走svn,他们把svn当ftp用。svn里面大量的无意义提交,一多半的提交连都编译不过去。我看到有个应届生,改了两句话,马上提交,说是怕代码丢失。一个运行了两年的项目,spring的包扫描明显配错了,有些bean根本扫不进来,居然没有人发现。一半的bean在spring管理下,另一半的bean他们自己写单例模式来实例化。
人啊,最重要的能力是改进工具,所以用 TITAN 的时候要拥抱全新思维,不要被落后思维捆绑。
欢迎你提交 PR 哦。
他们用mysql来做审计系统,出报表,有个报表要跑8分钟。原来是有人用字符串来存多值(逗号分隔),sql里写了like,导致没有利用到索引。为什么不用pg,pg在sql编程方面,功能更丰富,更适合做统计,它本身就支持数组。程序员们都是得过且过的态度,怎么把代码灌进去,跑的通测试,就算交差了。为什么大型互联网公司,技术和管理这么差劲,是怎么形成的?
如果你抱着这种想法,那用了 pg 也要被喷的,到时候就就会说 —— 「为什么不用 sqlite,轻量简单,搞这么复杂真的有必要吗?
」,真的有必要。
。
。
就算是一周跑一次,当然也是没问题的。
都亏了公司老领导和元老们的一手决策
问我支不支持?
我说好,review 我怎么能不支持呢?
我今天在知乎这个公众平台我明确说了我支持。
或许……等下一代?
下面是陈萌萌的回答:
你知道用B的优劣,B的适用场景以及适用B的成本吗?对于一间公司来说,成本是很重要的。
我这里说的成本不是金钱。
而是,假如你看不爽一份代码,你打算重构它,你觉得你需要投入多少时间,多少人力?
重构之后,又要花费多少时间和人力去升级依赖这份代码的其他项目?
不要以为开会无用,老板就只是在天天发邮件。
如果你重构了一份代码,不能通过沟通说服其他组去升级他们的组件,又或者你只是重构了一份虽然很丑陋,但其实并没有多少程序依赖它的代码,又又或者你重构了代码只是让代码技术含量更高了,更好看了,却没给公司带来多少收入甚至KPI,那你的工作和成果就很尴尬了。
因为他们也是需要投入成本的。
先不论他们个人技术水平高低,试问谁愿意挑一个又艰难,又不能产生多少效益的任务去做?
当然,你会说,写好代码是程序员的节操。
抱歉,节操多少钱一斤,北京三环商品房多少钱一平?
我们身边的大部分同事可能只是希望养家糊口,他们头上还挂着十几个bug等着修。
我们数落他们没追求,但追求从来都不是嘴上说说,吐吐槽就能实现的。
用最少的成本投入到最能产生效益的项目中去,或者投入大成本去解决公司最需要解决的问题,这间公司才能继续运作。
不要像祥林嫂一样,天天抱怨着生活,日日思考着辞职。
得罪点说一句:
“沦落”到要跟这样的人共事工作,难道自己身上就没有原因?
如果你认为解决这间公司的这堆问题不值得,又或者同事实在太不给力,就远走高飞吧。
这份代码写得丑,那个设计像大学生作品,重要的项目居然连单元测试都没有……但是我后来反观我自己,并没有发现比起那些丑陋代码和糟糕实现强悍多少。
我跟我的同事没有质的区别。
我笑话他们代码混乱bug不尽,我何尝不是少处理了一个field,倒腾错了一个片段的数据搞到要翻工重跑?
在我心底里艹了隔壁组那个“我的程序好像不能跑,你帮我debug下”的同事一千次之后,带我做ML让我倒腾数据并且被我的程序搞坏了几份数据(当然后来搞好了)的T9君在会议上说:
“她已经很努力了,我承认我有时候也逼得她太紧,她应该有多些时间的。
”
荐
阅
读
在看
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。