使用Mono平台前,请牢记产品观点
技术领域有很多让人深感困惑的地方,不管是架构师、设计师还是程序员,在完成任务之余,偶尔都有自责的地方:程序员在使用新技术完成任务的时候,有时会觉得自己旧技术都没有完全掌握,使用新技术有些好高骛远;设计师对于架构师所采用的新技术和程序员的学习成本表示担忧;架构师觉得自己可能没有完全了解技术细节,关心了客户,却忽略了程序员的感受。
互联网充斥着各种技术,从十几岁编写第一个BASIC程序到现在,我的感受是:我从技术进步中获得生产力的提高,技术更新也带来了新的问题,在新技术的学习和使用过程中,技术创造了无限可能。很好,非常好,但是,大量的学习和试验时间,使得展示创造力的时间变得少之又少,伟大的创造只因技术学习而晚他人一步,非常可惜。刚开始学习BASIC时,我就想编写一个俄罗斯方块的游戏,那是已经确定了基本的矩阵旋转算法,但是,在老式游戏机上控制图形实在不容易,没弄成,我就编写了一个终端版的打字练习作为处女作。以后的日子里,来来回回几次,我都没有完成编写,感觉每天都在恶补,没有时间,终于有一次去朋友家,我们打赌我能不能在两个小时内编出俄罗斯方块,两个小时,确实没编出来,为了方便重用和面向对象,那个简单的程序用了我9个小时,从晚上10点一直到早晨8点,好在他一直都在睡觉,在他醒来时时,我说:“看,我赢了吧”,我作弊,嘿嘿。但是C语言版的俄罗斯方块,我150行左右就能搞定,功能全面。那些都是问题的缩影,更深远的影响在后面。
没料到博客和论坛一样充满争论,技术的团队需要讨论,但是从来都不需要争论,争论反映了参与者试图确定自己正确性,而不是用来确定对最终用户是否有益,技术是用来创造产品和改善生活的,只要做到这一点,就是成功的。对产品而言,只有有市场,就能持续生产,就能建生态圈,就能发展。我们争论和讨论的核心是集中于软件的可行新和正确性的,这是正确的,但是若是过分集中于个人观点,那么对团队无益。当谈及产品观点时,有一个广泛存在的争论就是,有时,人们认为软件设计是高科技产品,不能按常规产品一概而论,软件设计会出现各种特殊因素,要特殊对待。有时,我们坐在一起闲聊时,有人不免抱怨说:“计算机太折磨人了”,很对,我完全赞同,只是,不要忘记:“你坐在电脑前就能实现梦想,过好生活,但是,其他行业可能没有这没好,不一定能这样--自己更多的决定自己的命运。”
当我讨论为准备Mono而制作产品时,人们的反映各式各样,但是对一个平台和技术永远都不要咒骂,因为,存在即道理。微软公司,是优秀的技术托拉斯,成功的商人,有着最优秀的科学家和开发人员,可否记得MFC/ATL带给你的喜悦,可否记得DirectX,很多与计算同起同休的故事,都是跟Microsoft紧密关联的,可以说对于Windows平台而言,软件设计人员的荣耀都是跟Microsoft的战略联系在一起的。微软的传奇之处在,当你看到一款产品时,你认为他是一个应用产品,但是最后,微软总能让他成为战略平台,像Office、SharePoint和Visual Studio 等等。即便在众多公司竞争愈演愈烈的今天,我从来都没有忘记windows所带来的快乐,和Windows平台所创造的可能性。世界从来都是发展的,说到底,技术也是产品。通常意义上的软件设计,是为最终用户设计产品,只要用户满意,软件就能存活;为软件设计人员设计的产品,生产者是平台销售商(像微软、SUN等等),消费者是开发人员。微软公司已经从竞争对手那里学到很多,IBM这些年一直在不停的大把捞钱,居然放弃了自己的PC事业,这足见Money的巨大魅力。对微软而言,微软公司一直从Windows销售、Office销售以及开发工具和服务其产品的销售赚够了钱。这些年,技术公司的收益更多的来自最终客户,这是时代的转变。Google这样的公司,取悦开发者的目的是为了更多的吸引最终客户,虽然单一客户给Google带来受益较少,但是从互联网广泛的客户和市场Google赚够了钱,不用生产信息,只需要收集和顾虑便可,这就是Google的产品,与其说Google是广告中介商,不如说Google将信息发布者变相买给了信息获取者;像IBM这样的公司,关心的是如何吸引大客户,如何从哪些关心事务、逻辑以及自身业务的大公司捞钱;微软关心的是如何维护生态圈,如何适应新潮流,这需要成本,并且通常只能获取间接收益,现在微软公司明显增加了最终客户的比重,更多的制作政府和企业应用软件,那是极富有前景的。过去的辉煌会积累丰富的基础,但是也成为前景的阻力。生产软件,关注客户,这就是生存之道。
搞清楚技术工作的最终目的是什么:首先,和其他人任何行业一样,人最大的满足在于自己,因此,如果你对你的工作很满意,那么请继续;技术是为了展现你的思想,因此,如果她办不到,那么请放弃;技术是为了完成今天的任务,并且能够为明天投资,如果不能,请放弃(生存压力,请慎重);最重要的一点,不要忘记了,技术也是一份工作,辛勤工作的目的是为了享受生活,不要忘记亲近自己家人。
可能朋友们并不反对这些话,只是,我们都未必明白其内涵,满足自己是人办事的一个基本立足点,在团队里,首先明白这些。适当处理问题,保证项目成功,软件工厂是神奇的工厂,不管你多么细心,失败的几率还是很大,小心一点,留住客户的钱,攒给BOSS。个人满足的一个重要部分,就是学习,这是一个风险点,作为个人,会比较趋于这种方式,作为BOSS,在项目成功的前提下,绝对支持,否则,就不那么确定了。技术是为了展现我们的创造力和思想,技术人员面临的事实就是,一年12个月中,我们需要3个月来学习,不管是架构师、设计师还是程序员,谁都不能例外,否则,明天,你将找不到对自己的满足:),时间紧迫,明白想拥有的和你能拥有的,在时间有限的情况下,你可否明白,在你的软件设计生涯中,能否设计一个自己满意的产品,或者是,你一直都在学习,不曾应用,对开发人员10年如一日,大量的应用、市场、规范、标准、数学学习,不管是基础学习、应用学习或者是对自己重新定位和确定新目标,时间总是最大的障碍,也许也是最大好朋友和教师,竞争是永无止境的。牢记一点,软件设计相关的人员不仅仅是生产者,也是消费者,我们消费的能力永远都赶不上技术公司生产的能力。完成任务很重要,为明天投资也很重要,不管怎样闲散,我相信软件设计师、程序员都像蜜蜂一样勤劳,因此,懒惰根本不是问题,问题是你如何为自己投资,你的最终目标是什么,不要忘记概率论的常识。诚然,你如果中了一百万的股彩票,生活会一下子变得非常好,你会因此变得很自在,但是你是否曾经因此就留恋股票的事情,你没有,因为你知道概率,你知道该做什么。同样,当我们学习技术的时候,技术诚然是越多越好,但是有时技术其实也像股票一般,很有魔力,但是,最终收益必然是有部分因素决定的,我们所学习的部分技术供养了我们,并且明天可能会有其他活法。时间是有限的,你必须明白如何投资,概率,找期望值最大的活法。如果忘记概率,那么,技术人员会认为所有的服务器更多的应该采用微软的,更多的技术人员都应该向微软靠拢,毕竟,微软的方案,总体拥有成本是多有多么有吸引力呀,你现在是否为你作为一名开发者刚到骄傲,我相信,每个人都会,谁会忘记Windows带来的快乐呢。停下来,考虑一下,你过得是否如预期的好,你是否发现微软所创造的可能为你创造了价值,Sure,第一批.Net书赫然写着:“微软公司为你未来十年做好了准备......",完全没错,微软公司为自己也为生态圈做了十年准备,并且每年都有新十年J。
不要批评任何人,不要批评任何公司,关注产品,关注付你钱的那些人,有些人会让你赚更多的钱,有些人会最终付你钱,让这些事情发生,打开潘多拉魔盒的神谕就是产品,不要忘记这一点。还记得软件工程给你的提示不?可靠性处理、安全性处理、可扩展性处理、兼容性处理和用户体验处理等等,种种种种,都是以产品为核心的教义,可否记得,可否做到?如果客户没有付你钱,问题在那里?客户之所以付款,是因为客户从软件中的得到了好处,生产力提高、市场的敏捷性、资源和成本的节省,我们的软件是否帮助客户做到这一点,如果做到了,下次索取更多的回报,如果没有,退回你多拿的部分。软件是抽象和难于使用的,客户有自己的最终目标,如果他没有达到,他不会付款。同样的需求说明书,可能交付不同层次的产品,问题在哪里?如果我们为客户的未来进行了投资,软件的可维护性、可靠性,这些能否让客户接受她,我们的软件是否为客户现在进行了足够的投资,软件是否可靠,软件是否易用;如果为现在进行了投资,那么未来呢?很明显,资源是有限的,如何均衡资源,如何达到双赢,永远记住客户要什么、我们想提供什么、我们能提供什么、我们该提供什么。谁是上帝,如何投资,期待什么样的回报,付出什么样的代价,实际上得到什么。今天的合作,明天的合作。生产产品时,如果忘记概率常识,那么就很难成功。在学习中,如果忘记概率常识,那么必将疲惫而死。自己想做的,自己该做的,自己能做的,如何去做。
从Windows DNA战略,到Windows .Net战略,到现在或者是未来的云战略,我们不可能驳斥Microsoft的道路,因为需求所产是的改变和革新是不能阻挡的,Microsoft是正确的,那只是微软,你得到了什么,你应该如何做,如何能适应微软的战略蓝图,还能做好自己的那部分。我一直觉得,如果想要理解微软的策略,我们需要从两头考虑,架构师心目中的微软方案和程序员心目中的微软技术。微软技术是根据用户需求改进的,或者说更多的,微软是由竞争对手所提出的技术方案,确定自己应该如何改进技术战略,微软很少创造什么新思想,最后,却能将新思想表现的淋漓尽致,让她根据时代的发展演变和延续。架构师心目中的微软方案,很明显,是根据战略需要不时改进自己的技术战略,非常平滑,微软高层的视野依然很清晰,10年都就想到的,就知道的,就做到的,今天她做她该做的,她发现,表达不够优美,应用不够广泛,这是程序员视野中技术改进的源动力。至于设计师,那么就是根据两头发挥调节作用,对上提供可能性,对下保证可能性。微软公司从来都没有忘记产品,技术框架就是她们的产品。
我看到有人为Restfull争论,因为表达方式就指着框架的优劣,有些太过火。如果微软有,用就好;没有,要么等,要么创造;尽最大努力发挥创造力,才是目标。
看待产品,请关注时间段,拿一个已经用了十几年的方案、技术和最进几年的新实现相比,显然,老方法不够优美,然后因此说他失败的也太荒唐了,旧产品已经完成了自己的使命,曾经胜出竞争对手就是成功,今天的战争是后来者的故事。典型例子很多, COM/COM+/DCOM、内核结构,关于微软的基础架构优劣的问题总有说不完的话题,我表示中立,这些产品在历史赢得客户、软件生产商、硬件生产商的支持,取得了成功,那么她就是成功的,今天新竞争要用新产品。看待技术,我们过于偏执,忽略了驱动力,技术只是为了生产产品,技术本身就是不断改进的产品。
除了微软之外,世界上还有很多成功的产品:gnu、apache、php、perl、linux、oracle、firefox、safaric、ruby、python、ruby on rails、Novell等等很多,关于这些产品的争论很多,有些没有必要,对微软市场也许很有必要,但是对我们没有必要。软件设计者要足够谦逊,抬头做人,低头做事,关注产品。为争论浪费时间显然不是蜜蜂族的特征,嘿嘿:)
我想Perl、python和ruby程序员可能都不会花时间做长时间的争论,因为他们的方案从全局看起来似乎不够完整,但是,不是所有的客户都要求面技术面面俱到,迎合需求,做好自己该做的事情,发挥创造力,这就是成功的设计者,也是过的最好的人。
在微软的平台下工作就要了解微软,微软提供了任何软件公司都不能提供的巨型软件生态系统,进化的因素包括了框架和开发工具,微软的开发工具平台都会照顾到整生态圈,生态圈就是技术产品存在的理由,这是设计这有时难于把自己事情做好的原因之一,一个技术可以以不同的姿态在多个领域内完美运行,在她所提供的诸多功能之中,你是怎么学习,你如何选择,怎样才是最佳做法,如何扮演好自己的角色,这会比较费力,太多太复杂。有时候复杂的平台遮掩了表达意图的最佳方式,作为微软,必须这样做,作为个体,这有时是一个问题。技术框架带来的潜在优势,是否为你的发展铺平道路,是否帮你更多的解决今天的问题,让你享受劳动权利的同时,是否过的舒适,不要争论优劣了,请关注产品。
微软的正确立场带来了无限的可能,但是永远不要忘记自己,不要忘记消费者身份,不要忘记自己生产的职责,否则就会流失最终客户,流失资金来源。微软的技术属于架构导向的,站在架构的高度架构,很好,很强大。如果站在架构的角度学习技术,那么,他将摧毁设计师和程序员的健康。由于架构决定最终产品,所以,微软采用架构,决定了微软产品平台的质量,也决定了最终客户所见到产品的质量。这个角度不太适合用来学习技术,因为太多太大了。作为最终的设计者必须明白这个差异,做好自己的事情,否则,问题很严重。
程序员经常惭愧的一点就是:即使十几年前的技术,自己似乎都不够了解,这不是一个问题,现有技术是进化的产物,当你了解和学习现有技术的时候,其实你已经是在研读过去了,只是了解历史有利于更好的在现在掌握和利用它,明白她的弱点和优点,预知她的未来(不用参加PDC大会,不用看路线图,玩笑),他的未来就是为我们服务的,永远不用悔过,做好自己的事情就好。
现在,也许应该说以前,当ruby程序员在炫耀ruby on rails 对 rest 技术的内在支持时,你会怎么想,你可能会说:“耶,很酷,太棒了”,完了,这就是你该说的全部,你只需知道微软迟早会提供Rest的支持,并且,更重要的是,确定这是否对你项目产生风险,找到方案在现在避开他。如果你惋惜微软的缓慢,那么,很抱歉,你不适合在微软的框架下工作,微软公司首先关注生产力,其次关注创造力。最早了解技术动向(特别是互联网领域,微软为垄断的领域),在微软社团可能有些困难,但是通常这是好事,等晚些时间,客户刚刚意识到需要这种技术时,微软已经制造出了商业产品级的技术,产品、文档和示例俱全,你用的时候到了J。
不管是最终产品还是技术产品,市场和用户就是存在理由。
Mono平台提供者(Novell) 不用急急茫茫实现wpf、企业服务等等,第三方社团的产品能让她工作的很好,至少对php、本地程序员甚至是perl程序员而言,mono都能提供他们希望的社会环境(Open Source, may be partly)和技术环境(.Net, even just partly),这就是Mono的存活理由,当然还有Suse和Novell。良臣当侍明主,选一个好的方案是很重要的,不要听信什么技术(语言)消亡,技术是活的不断改进的产品,技术的消亡只是因为支持公司的无能,无法跟进市场的需求改进方案和技术,跟微软肯定是跟对了。不要忘记自己的目标,软件设计者的梦想不应该是仅仅为了解和掌握最新的技术,而是制造优秀的软件,改善我们的生活。最终,回到键盘时,你的目标不会是要应用微软方案提供的所有功能,而是遵守够用就好的原则。没有这些新技术(更贴切的说是新的表达方式)前,我们就体验了近乎完美的产品,今天表达方式的进步,为产品创造了更多可能,不过,让你记住技术的……,可能更多的是产品吧。
Mono平台,对于Linux本地程序员很好,对那些使用perl的牛仔程序员也很好,对与php程序员也不错,在以网站为中心的中小规模应用,应该是没有问题。技术人员的一个重要特点就是推销,好不容易学到的东西,一定要用到项目中去,最终客户未必喜欢,我们要给客户需要的,不是“好”的技术,更多是产品,这更多在我们自己的修炼。当各种新思潮步入我们这个文明的国度是,你是否记得是什么技术帮他们达成心愿,论坛、博客、维客、社交网络等等,你是觉得ASP.Net程序员的资源似乎太多了,充足的资源限制了创造力。微软给的太多,我们用的太少,我们满足的是学习,客户关心的是应用,我们的价值却必须通过客户才能体现,这是基本的矛盾。IBM不用自己开发基础平台,它使用自己的数据库、自己的CASE工具、自己的开发工具以及社团的工具就能不断的捞钱,你是否知道原因:客户认为IBM生产了优秀的产品,这就是全部。关系数据库(也许更多)概念的提出来源于IBM,概念提出者不但获得了图灵奖,更多的,他们将数据的概念留给IBM,这就是生存至宝,IBM获得客户的信任,赢得了市场,取得了成功。回过来,当你向客户展示产品时,客户会不会仅仅因为你是ASP.NET程序员就给项目更高定位,客户只关心产品(这也包括成本)。微软创造了可能性,就展现了自己的价值,而你的价值只有通过你的产品才能实现,这就是生活。
不管处于哪一个阶层,明白你的客户是谁、你能生产什么样的产品、客户需要什么样的产品、你应该生产什么样的产品,这才是软件公司的生存之道,也是软件设计者的生存之道。
如果你选择了Mono那么,你必然加倍努力,你应该了解更多。并且从Windows .Net 到 Mono .Net 成本是高昂的,除非能够生产更好的产品,满足你的利益取向,否则,Mono并不适合你。或许,你应该花更多的时间在.Net上,只需要更加努力并且关注产品即可。