主题:【原创】好吧,给一个铁道部订票系统的正确答案 -- 布老虎
为任何一个行业做软件,重要是了解行业流程和需求,正常软件从业者都该有这种觉悟。
“东部某发达省某银行曾经从印度引进过据称是使用Java先进技术开发的银行业务系统,结果每到高峰时段就会出现10分钟以上的延迟和停摆,断断续续解决了两年没有解决,最后忍无可忍换掉了供应商。”
Java先进技术,这尼玛哪里来的词?老子怎么从来没听说过?
我老一句话解决问题:典型的Java GC,没有控制好流量。JVM只适用小流量。
这尼玛还要两年?老子服务器down机,trading floor顶多给你5分钟。
不到之处,请指点,毕竟脱离这行也快5年了,唉。。。。
从本质上来说,布老虎与红黑客的基本观点应该是一致的。
布老虎:
红黑客:
简单来说,都是一回事,太多用户一起涌过来是不行的,大伙乖乖地排队吧。
两位关键的不同在哪里呢?左看右看,就是数据库的选择。
布老虎的选择:
红黑客的没有说明选择,但是:
估计他会选择Oracle,再不济也得用Sql Server吧?
这稀泥应该怎么和呢?
这不是跟和面查不多吗?面粉多了,加水,水多了加面粉!
简单来说,就是看菜下饭。钱多的主,就用红黑客的方案,钱少的主,就用布老虎的方案,这不就和好了吗?
我也算科班出身,软件开发的专业,也算国内最好的学校之一了。从毕业几乎就没做过什么通用软件,基本上都是定制化的业务软件。开始的时候,想法很简单,客户有什么需求就说,我肯定都给你做出来。后来发现,真不是这么回事。业务人员所描述出来的业务,肯定只是业务的一个表象和片面。如果真的在某个项目里面能够碰到一个啥业务都懂的客户,那真是烧了几辈子的高香了(当然还得祈祷这不是个大忽悠)。所以如何理解多个用户从各自的角度所描述出来的业务,如何理清背后的业务逻辑和数据关系,这真的不是技术精通就能够解决的问题。如果对于业务逻辑没有足够的理解,你会在快上线的时候发现,哎,这个需求当时怎么没说,这个需求你当时说的不是这样啊等等.......。用户不是专家,他不了解从系统的角度都需要了解什么内容,你也很难保证当时说的话真的完全匹配现场的情况。这就需要你对所做业务的一定程度的了解,既要有深度,又要有广度。更不要说,在业务系统里面,同样有那种可能会超出一般技术水平的要求,对于他们可能就是一句话的事情,但对于开发人员真是苦逼大了。
特别对于红黑客所说的后面的政治要求等特殊的背景问题,更是从一立项开始就要充分考虑的因素。这个将会影响到报价,工期,技术方案,项目组织方式,上线安排等等一系列的事情。如果项目经理没有这个意识,基本上不要想做好项目了。而且这不是所谓的中国或者国企特有的,私企也是一样,国外也是一样,看看医改网站就知道了。区别只是在于影响的要素有所不同罢了。
在选取MySQL还是Oracle上,欢迎各自的支持者详细比较两者的优缺点。
他们必须选择Oracle,因为这个是收费的,收费的就意味着有人要承担责任。免费软件很多时候在国内是要受到限制的。
其实很多工业届用的东西都是不敢改的。比如IBM的那些数据库,里面老程序,谁也不敢碰,40年前的东西一个字符都不能改。最多在上层改一改。
记得看过Bjarne Stroustrup的一个有关嵌入式编程的ppt。上面放一个战斗机的照片,下面写上你程序错了慢了是要死人的。(现在F35里面三千多万行的代码改起来很痛苦。F22程序不收敛摔飞机的录像到处都能看到)记得Stroustrup老兄一上来写到的铁律是嵌入式编程不许用new,malloc和calloc等等,原因是这些操作有不确定的结果。
大公司的系统一般都是又老又旧的东西。而且都是自己培养人写程序。比如沃尔玛核心IT程序员三千人。加上部分长期外包的更多。核心数据都是mainframe/cobol的。网站和各店铺收款台的吞吐能里比亚马逊高很多。全公司里里外外大概有几百万个数据库表(各个店铺里面的机器的重复的只计算一次),每个店铺里面服务器的自己写的程序就有超过六千个。很多程序70-80年代就写成了,一直在用。店铺里面AIX系统换成Linux换了大概整整两年的时间。本来包给accenture做,结果做不下去了。后来只好沃尔玛的人亲自做,一个一个程序到现场手工测试(不是所有东西都可以自动测试的)。
nosql,大数据啥的搞搞海量日志统计比较适合。真正需要严格一点的地方都不敢用。
实际上只要涉及到钱,都会有对账平账的问题
而且并不是纯软件就能解决的,都涉及到账务人员的人工操作
很奇怪大家都自动无视了红黑客提到的PostgreSQL数据库。选开源的数据库时,推荐PostgreSQL而不是MySQL,给我的感觉更像高手,呵呵。
我没有仔细看大家给出的方案,但是仅凭常识来讲,觉得红黑客比布老虎要正确。就算不涉及政治,就算不涉及态度,光是技术方面,布老虎就有几个地方明显说错了。
选PostgreSQL也可以做集群,不一定是“单机版”
选PostgreSQL也可以NoSQL,这个估计他也不知道。
否则会降低说服力。
比如京沪线,如果有人买了北京到徐州,那徐州开始就动态多出了。
我觉得用mysql的可能性不大,虽然从实际情况来看,mysql的潜力也不小。facebook就把mysql的潜力挖出很多。问题是在于facebook很可能是一开始用上了php和mysql,更换系统的风险太大,所以就这么抗下去了,另外也有资源去补丁。还有个风险是在于mysql被oracle收购了,谁都得对它的将来要保持点疑心。
前段时间工作实在太忙,只能抽空零零星星地反驳。铁手说少骂人,以理服人。今天周末,我老作为国内青年码工的思想导师,对当前的一些现象深恶痛绝。我觉得这些丑恶现象集中体现在了红黑客的帖子里,好吧,我老以理服人,特批判如下。
首先要提的,就是技术水平的低下。 我估计此人是.net程序员。
作为一个码工,居然能说出 "事实上,根据我在开源世界十多年的经验,开源产品虽然创意足够多,但真正能够保证质量,懂得业务的产品几乎没有。"这样的话,这一听就是从来没有干过正经开发的,估计此人平时工作就是堆业务逻辑。软件开发(懂这个词吗?)和做应用写业务逻辑程序完全不一样。铁道部的问题,是需要进行软件开发,而不仅仅是应用开发。你明白这里面的区别?
别的不说,你知道不知道Java就是开源软件?你平常写程序应该不是用的Java,估计应该用的是.net之类拉拉控件的弱智玩意。你如果用java,不可能不用Eclipse,不可能不经常下载升级,不可能不知道Eclipse就是开源软件,基本上是Java开发的唯一工具(netbeans不提了)。你对开源毫无概念,所以应该是做.net的。
开源软件对于闭源软件的优势,是无可比拟的。你TM到底知道不知道开源软件的优势在哪里?为什么那么多的公司偏好开源软件而不是闭源软件?(以下培训,我老就不收费了)因为开源软件免费,有无数的用户使用,错误发现快,纠错快。公司里的高手还可以Code Review,跟踪JIRA,甚至提交patch和feature来影响软件方向,这和自己开发没区别,省了很多力气。你到底懂不懂?闭源软件,你要是大公司还差不多,小公司的就免谈了。即使像微软这样的大公司,数千码工,做出来的东西(IE为例)还是跟狗屎一样,没法和FF/Chrome比。Java如果不是开源,有那么多的高手在JCP,根本无法取得现在的地位。就这样,还闹出来很多笑话,比如EJB之类。
不要神神秘秘地拿什么Java先进技术没法解决高峰响应问题来举例子,这明显是隔行如隔山的提法,你以为这说明了.net比java厉害?5分钟能发现的问题你们拖了两年多没法搞清楚,这就是技术低下的证明,并不能证明.net比java性能好。Java在大数据上的应有是微软无法相比的。
.net程序员普遍存在的问题,就是微软把很多底层的东西掩盖住了,结果对系统理解的水平差很多,把问题简单化到了极点。有一个猪一样的队友(或者干脆就是马甲),说“免费方案中,红黑客会选开源中最好的PostgreSQL”。你就那么肯定? 先不说这哥们根本不懂开源软件是什么意思, 你以为铁道部问题的解法(或者“方案”,就是简单地数据库存取?你以为就是简单地选哪个数据库的问题,结果全国人民都搞复杂了,就你一针见血?选对了数据库,得永生?选错了,就完蛋?你以为这就是一行程序的问题?
那我TMD写那一大篇干什么?Google搞MapReduce/Spanner是吃饱了撑的?Amazon做Dynamo是为了好玩?java的解法是绕过数据库解决流量瓶颈问题,这点你是完全没有办法理解的,因为这需要对transaction(国内叫事物,应该翻译成交易)有深刻的理解,知道很多情况下可以放松ACID的限制,不会出现问题。你的问题就是不知道ACID到底要达到什么目的,不理解ACID也可以放宽,只知道简单地机械地套公式。存钱取票?好,那就数据库,才能保证ACID。至于为什么一定要ACID,不知道,洋大人说的,那还有错?
我老指出了message queue的方法,你终于理解了这个challenge,赶紧补上一个什么spooling。我不知道你从哪里google来的什么spooling,从来没听说过,是不是又是microsoft .net的shit?
其二,技术水平的低下,只会简单机械地套公式结论,导致了不可知论,和因此引致的恐惧,自卑,讲政治不讲技术。
你的主要论点是政治责任,只要用了开源,出了事就有责任。这几句稀里糊涂的话,我老听了,也是稀里糊涂。这软件的东西,我老给各位小的们介绍一下,是deterministic的,知道这个词吗?就是确定性。出了事?具体说说,这个系统会出什么事?啥时候出事?你连这个都没搞明白,你敢把系统放上线?尼玛人吓人,吓死人。
任何一个,注意,任何一个,有一点SLDC经验的程序员,都可以随时指出这个问题。最基本的常识步骤,是这样的大系统,应该有QA和release的计划,很简单地举个例子,比如首先可以只卖郑州始发,观察系统性能,然后加上北京始发,然后加上广州始发,然后一步一步推广到全国。哪里有什么不可预见的事件?哪里来的恐惧感?这恐惧感,完全是愚昧导致的,除此没有别的解释。你提到的那些big bang release的做法,倒是很像铁道部的傻叉们的手笔。老实招了吧,铁道部的那个down机的系统,是不是就是你那一行程序连到数据库干出来的?
我还不明白的一点,就是推给厂商为什么就可以没有责任?这里面的潜台词是不是,你看,洋大人都没有办法解决的问题,我当然也没有办法。这样的说法也能过关?我老真是服了。国内那么多年了,还是那套第三世界国家的自卑思维。美国这里,可没有什么洋大人,Oracle down机了,你一样要负责,怎么可以推到厂商就可以免责?厂商也是你选的吧?你选了一个问题厂商,你可以不用负责?或者这个厂商的系统没用好- 比如只能支持几百个并发,你给老子搞了几十万个并发,你可以没责任?这边trader一句话,老子blow off tons of dollars on techology,你他妈的就得给我保证好。老子不听excuse。
最后,对铁道部业务的错误理解,导致了错误的技术选择。我老看来看去,就是铁路票控计划部门每天把票输进系统,大家抢票,有啥滚过来滚过去的事务难题?你为什么会觉得这是个难题?这么基本的业务流程都能搞错?
我老的结论,就是国内程序员要有自尊心,要研究底层技术和上层系统技术,不能满足只是堆代码。要脱离.net,加入java, 不要有偷懒依赖,天塌下来有高个子挡着的第三世界国家的心理。另外就是微软实在害人不浅。
最后,在你的帖子里隐隐约约,但是反复提到我老的建议价格,也就是2000万美刀,太低。要不,你就是那个铁道部选的供应商?说吧,你报了多少?一个亿美刀?给我老一点回扣,我老就高抬贵手了。