在过去四年多的时间里我有四分之三的时间都是呆在创业公司,其中有一年的时间在ThoughtWorks度过。中途有一次机会进入大公司,可是考虑再三仍是放弃了。转而加入了一个创业公司。就这几年在创业公司作技术的经历,来谈一下创业公司的技术选择。程序员
我第一个加入的创业公司是一个很是小的团队,人数最多的时候也就二十多我的(公司总人数)。后端团队从两我的发展到后来的六我的,已是初具规模的团队了。公司主要作过三个大的项目:1. 新浪微博爬虫,2. 基于Web的社交网站,3. 即时通信工具。数据库
新浪微博爬虫是用Java实现的,关于这个项目有一段历史。一开始这个项目是用PHP+MySQL写的,参与项目的一共是三我的。可是写着写着,就发现愈来愈搞不动了。不只性能上不行,并且代码量大了开发效率也不行了。三我的也都比较头疼。项目也进入了一种比较尴尬的局面。好在这时招进来一个大牛。关于这个大牛后边详细介绍。这个大牛进来以后,把原有的技术替换为Java+MongoDB。最后项目不只效率上有很大的提高,并且原来三我的作的事情,如今剩下这位大牛本身搞,最终凭借一己之力完成了这个项目。编程
咱们来分析一下此次技术栈的变动。从结果上看确定是成功的(咱们排除人的技术水品的因素,单纯分析技术)。原来三我的作的事情,如今一我的接管;项目顺利交付,而且性能也有大幅提高。后端
Java和PHP哪一个更好?就这个使用场景来讲确定是Java更合适。由于须要大量调用微博API,咱们能够利用Java的线程技术实现并发和异步编程。
MongoDB从始至今都是总体比较多的技术。一方面你们痴迷于它的性能,以及易用性,另外一方面你们又被它的不稳定性所困扰。好多公司都在MongoDB上载过跟头。并且Mobgodb也对内存也是很是贪婪的。可是在咱们的项目中用mobgodb给咱们带来的好处也远大于它的弊端。项目总体性能的提高一部分缘由要得益于MongoDB。因此说此次项目选型是很成功的。架构
Web项目咱们用的技术是:Java + Nutz + MongoDB。
几年以前那但是SSH的天下,并且Nutz框架我在进入这家公司以前根本没有据说过。可是使用了以后,立马被它的易用性和简洁性吸引。首先学习成本很小,SSH这套框架不说别的,光是配置也够你学几天了,而Nutz几乎是零成本的,并且注解设计的也很是容易理解。还有相信你们也被SSH各类依赖搞疯过吧,而Nutz引入一个jar就能够了。一个jar包就包含了MVC,IOC,AOP等这些功能,没必要强制依赖第三方jar,绝对是一个小而美的框架。并发
仍然是MongoDB。对于创业公司来讲选择MongoDB绝对是一个很是明智的选择。首先你真的不用能够的关系性能问题;其次入门很是简,学习曲线较低;再者若是你的业务真的井喷了,那么MongoDB也可以经过分布式的架构来handle。还有最重要的一点是弱Schema,你不用操心Model改变数据库升级的事儿了,而且版本升级并非一件简单的事情。app
咱们用这套架构作了不少Web项目,效率高,体验好。这一套技术无疑也是一次成功的选择。框架
再接下来咱们开始作一个IM聊天工具。在这个项目上咱们引入了Scala和Akka。在项目只有一我的(就是前边提到的大牛)了解这套技术这套技术的前提下,引入这套全新的技术其实风险仍是比较大的。可是这套技术实际上是很是适合咱们的业务的。最终项目仍是如期的完成了,可是过程当中也有被技术折腾的欲哭无泪的时候,不过有这个大牛做坚实的后盾,好多技术难题都伴随这他一个个通宵搞定了。异步
我的感受,此次技术选型对一个创业公司来讲有些激进了。分布式
那咱们如今回顾一下,这个公司在技术选择一直是比较合理,没有犯过错误的。虽然最后选择的技术过于新潮,可是无疑这套技术是很是适合当时业务的。终于该说一下咱们公司技术负责人,他从小开始编程,在未成年时就混进了外包公司(由于只有外包公司敢要未成年人),到后来成了华为最年轻的架构师。他很是聪明也很是努力常常是连着熬几个夜项目就出来了。并且他的技术品味也很是高。像SSH这个又笨又傻东西是他怎么会选呢。相比之下Nutz这种小而美的框架对他来讲才是很是性感的。Akka,Scala虽然我认为是一个激进的选择,可是对于他来讲确定是在可控范围内,由于好多难题通过他一晚上补眠就搞定了。
对于这个公司的技术选择:1. 小而美,不随大流。2. 激进但可控。选择一些非主流的技术(好比Akka,Scala,在2012年国内市面上不多有这两项经验的人),毕竟会致使项目后续招人上的困难,可是有一个最基本的保障是,技术负责人技术足够扎实,在这关键时刻以一敌三,同时引进新的技术后也在竭尽全力的培养团队成员。
第二家创业公司使用的也是Scala技术栈:Play Framework + Reactive Mongo + MongoDB,也算是一套比较新潮的技术。固然也是这些技术吸引我进入这家公司。进入一家公司以前你老是会抱着一些美好的指望,这种指望每每会在你第一时间看到项目代码时随之破灭。Scala是一门很powerful的语言,固然当你用的不体面是,它只能比Java更具备破坏力。入职的前两天当我看完了需求文档,尝试梳理代码逻辑的时候,那时我恐怕遇到了前半生最困难的一件事情。逻辑遍及在各个地方,并且每段逻辑都没有严格的边界划分。就像在一堆打散的积木中,试图找到一个汽车的模型。
在这家公司Scala这套技术栈不只没有起到提高效率,快速开发的做用,反而成了团队的拖油瓶,绊脚石。由于此时技术已经像一匹脱缰了的野马,不只不会再遵从你的训令,反而会拖着你瞎跑。因此当我熟悉了业务和项目基本信息后,就着手开始了项目重构,固然这也是技术负责人最但愿做的一件事情。
对于这家公司的技术选择:盲目激进,蚍蜉撼树。这家公司的技术负责人是一位Android工程师,对后端开发经验不足。首先本身涉足的是一块没有接触过的领域,用大流技术才是最稳妥的作法。并且具有Android经验,选择Java技术栈至少没有新语言学习成本(固然选择了Java也不愿定比现状好,只是少了一项技术难题)。再者招人容易,像Java,PHP什么的程序员遍地抓(可是大流意味着水平良莠不齐,创业公司仍是先解决有和没有的问题吧)。若是有幸招到一位不错的程序员,也能够弥补本身后端经验缺少的短板。但Scala就不是这样了,除非本身有熟人或者熟人能介绍,不然招到的概率很小很小。大多数使用Scala的公司其实都是有本身培养成员的打算的。但显然对于这家公司来讲本身培养是不现实的。
第三家公司也就是我如今的公司,是作海外电商的。在这里技术用到的技术也是多种多样:Python,Ruby,Java。每一个公司的技术背后都隐藏着不少故事。这里的故事避开不讲了,只说一下结果:后端服务一开始时是由一个技术很是不错的人用Python来写的,他是一个Pythoner。后来由几个Java背景的工程师接管。Java程序员深受着分层架构的毒害,以致于在项目里也搞起了Dao,Service这些东西。本来很清爽的代码被搞得很是臃肿。并且既然分层了,也没有把每层的逻辑隔离好,各层的职责相互渗透。同事们也是抱怨连天。
再有就是Ruby,我刚进来就被分到了这个Ruby项目上。刚看代码的第一天我就隐约感受到这是一个Java程序员写的代码。最明显的标识就是:变量搭配逻辑控制和循环使用,超大方法。虽然项目实现的很差,可是因为业务逻辑简单,尚未到那种不可收拾的地步。
因为深深受到动态语言的打击,在作新的系统的时候,团队又用回Java。这个项目我是从头至尾一直负责的。如今在这个项目上用到的技术有:Spring Boot,JOOQ,Flyway,MySQL。以前数据访问用的是MyBatis,后来被替换为JOOQ。MyBatis算是一个相对轻量的框架,可是仍是感受仍是模板代码,有点死板。用JOOQ能够很好的解决这个问题,你不用再专门的搞一个mapper,让数据库操做更直接。这个项目做了还不到半年的时间,到目前为止,至少从开发体验上来讲仍是很不错的。
对于这件公司的技术选择:探索中前进。刚刚开始团队尝试了一些动态语言Python,Ruby。随着项目的不断发展,代码的可维护性和性能等问题日渐严重。时是团队又选择了大多数人都比较熟悉的Java。这对团队来讲是一次成长的过程,都说动态语言好,适合创业公司做快速迭代开发,可是本身的团队基因不合适,那选择一个你们都熟悉的语言才是性价比最高的。而且如今的Java也不像原来那样笨拙了,开发效率比Ruby,Python也差不了多少。
总结一下,一个创业公司应该怎样选择本身的技术呢?下边分几个阶段来讲一下。
创业之初,这个阶段公司做技术的可能就一两我的,这时公司迫在眉睫的是开发出第一个产品原型。这个阶段必定要用本身选择最擅长的技术,快速的把产品原型开发出来。Ruby也好,Java也罢,先把有没有的问题解决。要知道这会儿少一次查文档的时间就少几分钟加班的时间。
起步阶段,这个阶段是公司业务的快速发展阶段。这个阶段开发的任务一般要比第一个阶段还要重,不过公司在这个时候已经拿到一笔钱了,能够快速的扩建开发团队。这个阶段的技术选择:对于核心业务的选择也倾向于使用主流的技术。一方面是这些技术足够成熟稳定,另外一方面招人相对容易。对于一些非核心的业务能够尝试一些新的技术,为后续作一些经验储备。
再后来的阶段我尚未经历,等有机会再做补充吧。