透过现象看本质。
Java是企业应用市场的王者,如果一家非互联网公司用Java,那么十有八九是做企业应用的。
所以,这个问题本质上是:为什么做企业应用的公司需要那么多Java程序员。
开发企业应用的公司有其自身的特点。下面9点不一定在所有企业应用的公司身上都存在,但肯定是大同小异。
- 相对于互联网来说,企业应用不是一个公平竞争的市场。互联网公司创业之初往往是因为有好想法好技术,企业应用的公司创业之初是因为老板有人脉有关系。大部分做企业应用的公司都是靠老板的人脉关系活着、靠市场的垄断地位霸占着某个领域。而且也因为老板和高层习惯于人脉和关系,公司也会形成官僚国企文化,而不是工程师文化。所以这些公司技术老旧薄弱,技术人员也从来不会被重视。很多做企业应用的公司虽然有个高新技术认证,但根本没有任何技术含量可言。
- 客户是甲方是老板的上帝,老板得罪不起,因为得罪了就没有人脉和关系,就没有在这个行业的立足之本。所以甲方可以蛮横的在需求、设计、技术方案等各种环节上提出自己的修改。而绝大多数甲方都是自以为是,什么都不懂,仅仅是为了表明自己懂或向领导证明自己懂。在项目实施过程中,和客户对接的程序员完全处于弱势。心中几万匹草泥马奔腾着,却要点头称是,敢怒不敢言。
- 有些甲方其实根本就不懂自己的行业,或者根本不能代表最终用户,不知道自己的需求到底是什么。往往就是一句话:你先做出来再说。所以无意义的需求变更过于频繁,甚至有可能彻底推翻重来。而且这些甲方都是恨不能XP用一辈子的人,他们见不得任何新颖的设计。比如你用了现代化的前端,他们反而不买账。你用Spring Boot了,他们认为你连Tomcat都不知道,反而觉得你太Low。这就更进一步助长了公司内部一些不思进取的人,他们拿着尚方宝剑说:用户不认可这样!
- 项目招标同质化竞争,明着互相压价、暗着陪标围标等各手段都上。一家公司提出免费维护三年,另一家就可能提出免费维护五年。反正不管将来怎么样,先要把这个项目拿下来再说。最后项目工期可能是合同的两倍,而且还要面临着验收后好几年的维护期。维护期可能就需要搭一个人进去,没有任何利润可言。最后造成项目整体式亏本,能收支平衡就不错了。
- 不像互联网应用,客户是网民,没有地域限制。企业应用的客户很可能不在公司本地。客户需要人员驻场开发才放心,我花了钱了就要见到你们的人,否则我怎么控制进度,我怎么知道你们是不是用最后两个月突击完成的。所以差旅住宿成本飙升。为了能有新项目收入,就必然不惜血本继续拿新项目。然后新项目又不断压价,造成恶性循环。
- 公司成立之初,可能有几个骨干技术人员。随着公司慢慢发展,他们就成了技术总监什么的。但是这些人基本不会自我提升,而是想着如何继续把公司的技术把控在自己手里,永远坐在自己的功劳簿上。所以他们就禁止技术升级,禁止他们不会的任何技术出现。这样他们才有用,他们才能管理新入职的程序员。
- 公司不重视技术,也就不重视技术人员。技术人员永远是三等公民,远远有销售的地位高,也不如财务、行政等职能部。程序员在项目的投标、实施整个生命周期中没有话语权。投标时,销售为了中标就胡乱承诺功能和时间进度,根本不会和实际开发的技术人员商量。往往只是给技术总监打个招呼,但是技术总监不会考虑底层程序员的利益。实施中,客户的需求更改根本,不会无论如何软硬兼施会让程序员去实现。
- 在企业应用的公司里,除了程序员以外,所有人对软件开发的理解就是堆代码搬砖头,人月神话在他们这里一次一次真实上演。一堆砖头,4个人6个月能搬完,6个人4个月也可以,上12个人就可以用2个月完成!所以从老板到销售到技术总监,一遇到进度问题,首先想到加人。
- 为了降低人力成本,也为了让客户看到自己公司人多有实力,所以就招聘低水平的研发。本来应该招聘一个两万四的,但更愿意招聘两个一万二的,最后招聘的是三个八千的。这些人谈不上架构水平、代码质量、自测什么的,造成项目交付质量极差,往往让客户充当了测试的角色。这就进一步让客户对公司产生怀疑,认为公司没有全力投入,就要求你驻场开发。
总之,所有的这些因素都在不断恶性循环。循环的结果就是:做企业应用的公司可能会发展变大,但是不会变强。变大是因为程序员、后期维护人员摊大饼式扩展。不会变强是因为技术常年不会有任何变化,人员层次常年不会有任何提升。没有人从提升技术水平和开发效率的方向去考虑问题,都在想如何拿更多的项目、如何跟客户玩游戏。
多说两句:
我毕业20年,一半时间在开发企业应用的公司,经历过几百上千人的国企,经历过十几个人的小私营公司,现在还在给多家企业做技术咨询顾问。我从未见上面的恶性循环趋缓,而是还在不断恶化下去。
每一个有点理想的做企业应用的公司或老板都有一个梦:就是产品化,说白了就是能把产品刻成光盘买(当然这是传统的做法,现在放网上下载也行)。因为只有这样才能突围出怪圈,走上由大变强之路。这需要一家公司有非常深厚的行业经验,能够总结和归纳出需求。需要有非常强的架构和设计能力,让产品可以灵活按需定制。需要有非常强大的编码和测试水平,让产品能够稳定顺畅。
为了能够实现产品化,但又要面对现有技术水平太差的现状,很多公司就采用项目养产品的策略。就是成立一个产品部门或团队,从其他项目组抽调技术还可以的,或者新招聘几个所谓的高手,集中力量研发产品。产品研发是一个周期长高成本风险大的工作,而且在真正出来满意产品前是不挣钱的,只能靠项目赚的钱来输血。这种策略往往都是失败的,因为没有一个公司有实力、有耐心去长时间养着一个不挣钱的团队。所以,几乎没有公司能实现这个梦想,都在继续摊大饼。
这几年一线城市生活、租房等成本飙升,而且必然会传导到程序员的薪资上。所以,最近几年会有大批做企业应用的公司完蛋。因为研发人力成本是公司经营成本中最大的一部分,这部分成本会加速上升。原来活的好的公司会面临巨大压力,原来活不好的公司会面临死亡。
下面咱们谈谈技术。
对企业的负责人,我经常描述一个场景:
有一个工地,几百号人在用铁锹铲子挖坑。我找上门去,问工头:你们知道有一种设备叫挖掘机吗?有的不知道,有的知道。有的以前在别的工地见过或开过,只是来这边以后没机会用了。如果我开一辆挖掘机来,用一天时间干的活就相当于你们这一个工人一个月的工作量,你相信吗?而更重要的是这个挖掘机是免费开源的,仅仅需要学习一下如何操作。
这几百号人的工地就是企业应用项目团队。而我说的挖掘机就是Spring Boot + 前端(Angular/React/Vue)。
正像我上面场景里描述的那样,有很多技术负责人和普通Java程序员都知道Spring Boot和前端框架。但是对于他们来说有点遥远了,可望不可即。有的Java程序员自己在偷偷学,跃跃欲试,但是这种技术氛围的公司不可能给你机会。有的技术负责人也认识到了新技术能够为公司技术带来的提升,但是自己也不会,更没有能力对下属培训和指导。如果新招聘会的人,自己连面试问什么问题都不清楚,又怕找来个水货。总之这些所谓的“新技术”对企业应用市场造成了一定的冲击,但企业自身却有各种困难无法把新技术转换成真正的生产力。
因此,针对上述的这些情况,我特意整理了一下,里面的技术不是靠几句话就能讲清楚,所以干脆找朋友录制了一些视频,很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友可以加我的Java后端技术社区:537775426,里面有阿里大牛直播讲解技术,以及Java大型互联网技术的视频和文档资料免费分享给大家。