本文整理自知乎上的同名讨论帖:《为何有些大公司技术弱爆了?》,版权归原做者全部。原文地址:www.zhihu.com/question/32039226mysql
知乎程序员
有网友提问:算法
今年年初,到一家互联网公司实习,该公司是国内行业龙头。不过技术和管理方面,却弱爆了。那里的程序员,天天都在看邮件,查问题工单。这些问题,多半是他们设计不当,形成的。spring
代码写的一团糟,全是复制粘贴,连做者都没改,你们广泛不写注释,也不格式化,代码歪歪扭扭。sql
一个项目里,httpclient居然出现了四种。一种是该公司研发部写的,一种是老版本的开源项目,一种是新版本的开源项目,还有一种是开发人员造的轮子。docker
打接口请求响应日志,居然不知道用拦截器。编程
打错误日志居然不打上下文信息,每一个人一种日志风格,千奇百怪。数组
许多重要的中间流程,竟然不打日志。服务器
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,编辑器是没有语法高亮和实时编译的,编译器是没有智能准确的报错的,没有如今这么多知识、也没有这么多规范和好资源、好工具。不过咱们仍是把项目作出来了,把公司一步步推到了如今的位置。
不过这个问题是客观存在的问题,谁也不否定,可是你知道为何你被分配到了一个『代码看上去一团糟也不够规范』的项目吗?咱们须要新鲜血液来重构一些老代码,因此你会被分配到艰苦的岗位上。咱们但愿你是敢于战斗的战士,咱们更但愿你能成长为经验丰富的老兵,而把你放到这种岗位,是对你来讲成长最快的方式。
你认为
你不知道的是,咱们最初用了开源软件(也就是你所说的『老版本』),它构成了咱们早期项目的基石,随着业务复杂性增长,咱们改进并最终切换到新版本。
这个软件跑老业务很是成熟,可是在一些新业务上有不可调和的矛盾,因此在痛苦的适配后,研发部的同事们挺身而出用 20% 的时间写了新业务的组件——是的你没看错咱们也有 20% 时间,咱们鼓励工程师的创新。
至于你说的开发人员造的轮子——这提及来可真有趣,它实际上是前年来的一个清华大学实习生写的。
当时他来了以后,针对他接手业务的需求,向我抱怨说现有的 3 种都很差,要写一个新的来『统一天下』,这话是他的原话,我记得很是清楚,由于以我多年经验来看这样的作法是不可取的,可是本着锻炼年轻人的心态(加上他的确是不可多得的天才),我赞成了他的请求,因而我用本身的业余时间接管了他的大部分工做,全力支持他写一个新的组件,帮他挡住了全部上面的压力,后来的故事就是你看到的这样。
是的,他后来越深刻、就愈来愈感到业务的复杂,不断推翻重构、拆东墙补西墙,但始终发现和本身想的根本彻底不同,受不了了就走了,留下来这个。
咱们明年的规划中,就包括剔除这个组件的 codebase,由于它实在是太糟糕了。
你又说
拦截器并不如你所想的那班美好,也许你在本身的电脑上写过一些玩具代码,以为这样很方便、酷炫,可是真正到了战场,你会发现没什么才是必须的、好的,只有适合的才是对的。
至于配置文件,这么说吧,IDE 的配置文件传到代码仓库是我定下的规矩,『怎么会有人定这样的规矩?』,是的你可能从软件工程的教科书上或者某些『知名博客』上读到了不能这样作,但实际上这样作在不少状况下是必须的。
缘由何在?
这样能够确保代码克隆便可用,而不是让每一个人都去设置一大堆无聊的东西,这样不只节省时间,也确保了每一个人的环境一致性,你想一想这几年火热的 docker,应该明白了这样作的正确性和必要性了吧?
你可能会说即使如此、插件也不用上传到服务器保存,我告诉你这样是不行的,你要考虑到咱们这个项目先后十余年,你以为几个插件能坚挺十余年?极可能咱们早期用的软件,如今你已经彻底不可能找到了,因此保存一份备份是很是有必要的,决不能错误地认为是冗余。
教科书只会教你基本通用的原则,树立你基本正确的观念,可是若是只是死守教条,如何能拥抱日益复杂的变化呢?
你看的教科书,且不说时间上已是二十多年前的了,在适用性上,也不说就是真理,IT 行业发展突飞猛进,几个月就是沧海桑田,为了适应这样的变化,认真地思考、总结、判断才是最重要的。
你以为
你大概不知道,当初跑在你口中的「一个没什么qps的边缘接口」上面的业务带来了公司曾经 90% 的收入,因此咱们用了复杂的设计以应对当时的需求,固然如今业务转变,老系统再也不须要处理那么多业务了,可是更没有理由为一个『works perfectly well』而且再也不重要的业务重构代码吧?
因此,不是咱们秀技术,而是业务需求 + 业务变动使然,年轻人还须要多学习一个。
你抱怨
我再强调一次——咱们是全中国同类公司中技术能力第一的,你所说的问题,固然是不存在的。
咱们有专门的 Hadoop 集群来分析日志,固然也就用不着 Excel 了。
对于咱们这种体量的公司来讲,不存在什么『常数集合』,代码必须用合适的数据结构——这是常识吧?
特殊的算法和业务掺杂以增长内聚性,这是咱们多年的经验,的确,它和教科书上说的不同,可是我前面说了,死守教条是不行的——想必你必定知道 OSI 7 层网络模型吧?
公司的技术氛围浓厚,是和公司的基因分不开的,咱们公司最重要的原则就是——『拥抱变化』,从十几年前的机房托管单机到如今的庞大自建集群,技术跃迁了何止千万里,因此每一个人都在学习新知识、每一个人都沉浸在新知识的喜悦中。
你的问题,大多都是由于没有考虑到公司的庞大致量和十几年的技术跃迁才有的疑问,这点再也不赘述,自行体会吧。
你想的是
其实那不是 SVN,那是咱们公司自主研发的适应咱们内部需求的 源代码管理系统 和 文件管理系统,你能够往里面听任何东西。
你所说的「无心义提交、一多半的提交连都编译不过去」其实只是表象,这套系统代号 TITAN,它自带 CIDD(持续继承、交付、部署),因此这些没法编译的提交都是不会有机会走到下一步流程的的。
若是你工做了一年,你就会发现这个需求是很重要的,改动、尤为是大型改动,中间会有不少非可用但有须要存档的步骤,现有的源代码管理系统都不能很好地支持这些需求,所以你也被教育了一套适应落后工具的思想。人啊,最重要的能力是改进工具,因此用 TITAN 的时候要拥抱全新思惟,不要被落后思惟捆绑。
若是你工做了几年,你可能还会问为何咱们没用 Jenkins、Travis 等工具,其实呀,就在 TITAN 之中呀,它凝结了公司最优秀的人才的十几年宝贵经验和心血。
By the way,咱们最近正计划开源它,为中国开源社区作贡献,也但愿提升业界的综合素质。欢迎你提交 PR 哦。
你最后说
为何不用 pg?若是你抱着这种想法,那用了 pg 也要被喷的,到时候就就会说 —— 「为何不用 sqlite,轻量简单,搞这么复杂真的有必要吗?」,真的有必要。。。
这只是一个很简单的系统,作的事情也很简单,当初作这个系统的同事更熟悉 MySQL,固然 MySQL 是不二之选了,对于简单的东西,追求的是开发速度、使用便利性。
你以为一个月跑一次的审计代码,8 分钟有什么问题吗?就算是一周跑一次,固然也是没问题的。
程序员的单位时间是如此宝贵,为了优化一段一个月跑一次的 8 分钟代码,值得花费数天的时间来作这件事吗?
重复一遍,你的问题,大多都是由于『没有考虑到公司的庞大致量和十几年的技术跃迁才有的疑问』,这点再也不赘述,还请自行体会。
固然,年轻人乐于思考,这是好事,是但愿,新鲜血液替换老旧部件系统才能健康发展成长,人如此、公司如此、国家也是如此。
但愿你勤于思考,努力学习,有问题的话,咱们公司是鼓励同事们向 CEO、CTO 写信的,否则也不会有 CEO、CTO 信箱了你说对吗?
固然,这样的技术性问题、你写给我就好,CEO 是船长,不须要关心底层锅炉房的细节。
另外我想补充一下个人想法,但愿对你有所帮助。
你看你都没说加班问题,咱们公司没加班啊,这多好,怎么作到激烈竞争下还能不加班的?都亏了公司老领导和元老们的一手决策
因此我想补充的不是技术问题,技术问题都不是问题,年轻人能够学习、交流,技术都会很快成长,毕竟年轻人的冲劲大、头脑灵活。
我想说的是总体观、大局观、大棋战略。
黄金的导电性最好,为何电脑主板还要用铜?
清华大学最好,为何有人要去普通学校?
飞机最快,为何还有人坐火车?
由于资源都是有限的,咱们在现实生活中——而不是教科书上——必须兼顾成本和产出的平衡。
你问我每行代码都多人多层人工 review 好很差?问我支不支持?我说好,review 我怎么能不支持呢?我今天在知乎这个公众平台我明确说了我支持。
可是你也应该多学习一个,这个现实毕竟是现实,咱们要兼顾各类考量。
你今天在这里渲染「大公司技术和管理这么差劲」,是不对的、是失实的、是欠妥的、是缺少认真思考的、是未加深刻考量的。
未来舆论出了误差,你虽然不用负责任,可是你认识到本身的错误的时候,会后悔、会内疚、会难过的吧?
何处乌托邦?或许……等下一代?
总结就是,生产效率才是最重要的,世间万物最重要的是平衡。
怎样取舍、如何妥协,这不只是大天然的规律,也是咱们前进、发展的准绳和仰仗的原则。
地址:www.zhihu.com/question/32039226/answer/75823779
题主你看到了不少槽点,但我认为你不能只看到槽点和大概怎么解决。有没有想过怎么改进,若是是你的话你怎么作,这些项目里面临的主要挑战是什么,次要的挑战又是什么?
不要只告诉我技术A弱爆了,用B就能够完爆这个项目了。你知道用B的优劣,B的适用场景以及适用B的成本吗?对于一间公司来讲,成本是很重要的。我这里说的成本不是金钱。而是,假如你看不爽一份代码,你打算重构它,你以为你须要投入多少时间,多少人力?重构以后,又要花费多少时间和人力去升级依赖这份代码的其余项目?不要觉得开会无用,老板就只是在每天发邮件。若是你重构了一份代码,不能经过沟通说服其余组去升级他们的组件,又或者你只是重构了一份虽然很丑陋,但其实并无多少程序依赖它的代码,又又或者你重构了代码只是让代码技术含量更高了,更好看了,却没给公司带来多少收入甚至KPI,那你的工做和成果就很尴尬了。
其实上述也解释了为何你身边的同事都眼睁睁地看着这些丑陋的shit存在而无动于衷。由于他们也是须要投入成本的。先不论他们我的技术水平高低,试问谁愿意挑一个又艰难,又不能产生多少效益的任务去作?固然,你会说,写好代码是程序员的节操。抱歉,节操多少钱一斤,北京三环商品房多少钱一平?
编程高手都有真爱,但现实就是编程高手百里挑一。咱们身边的大部分同事可能只是但愿养家糊口,他们头上还挂着十几个bug等着修。咱们数落他们没追求,但追求历来都不是嘴上说说,吐吐槽就能实现的。
人心如此,公司也如是。
矛盾分主次,公司的目标都是同样的:用最少的成本投入到最能产生效益的项目中去,或者投入大成本去解决公司最须要解决的问题,这间公司才能继续运做。
因此题主你想一想,在你吐槽的个案中,有多少是公司真正关心的?有哪些是你的老板认为能够创造最大效益的?有哪些才是主要矛盾或者挑战须要最牛逼的人自告奋勇第一时间解决?去辨别,解决这些关键的问题吧,骚年。必要时带上(忽悠)一队人马(同事)跟你一块儿干,苟富贵,勿相忘。不要像祥林嫂同样,每天抱怨着生活,日日思考着辞职。得罪点说一句:“沦落”到要跟这样的人共事工做,难道本身身上就没有缘由?
这个世界有更好的公司,有更牛逼的人。若是你认为解决这间公司的这堆问题不值得,又或者同事实在太不给力,就远走高飞吧。
我之前也跟题主同样,看我第一份正式工做的不少技术环节都至关不爽。这份代码写得丑,那个设计像大学生做品,重要的项目竟然连单元测试都没有……可是我后来反观我本身,并无发现比起那些丑陋代码和糟糕实现强悍多少。我跟个人同事没有质的区别。我笑话他们代码混乱bug不尽,我未尝不是少处理了一个field,倒腾错了一个片断的数据搞到要翻工重跑?在我心底里艹了隔壁组那个“个人程序好像不能跑,你帮我debug下”的同事一千次以后,带我作ML让我倒腾数据而且被个人程序搞坏了几份数据(固然后来搞好了)的T9君在会议上说:“她已经很努力了,我认可我有时候也逼得她太紧,她应该有多些时间的。”
关注Java技术栈微信公众号,在后台回复关键字:Java,能够获取一份栈长整理的 Java 最新技术干货。
最近干货分享
点击「阅读原文」加入栈长的战队~