高阶技术管理岗空降落地实践指南

在互联网企业中,技术同学从大厂高 P 出来,空降到中小型的创业公司做技术管理的情况常有发生,这对于高 P 同学来说是一个较大的转变,会有一个适应期,有些比较顺利的渡过了这个适应期,也有些可能水土不服,甚至回流到大厂的情况。那么,作为一个高阶技术管理岗应该如何空降落地呢?如何在落地过程中保持平和的心态?如何快速上手业务,搞定事情?基于这些问题,我们有了这个落地实践指南。

高阶技术管理空降落地的关键点我觉得主要是两个大的方面,一个是心态,一个是节奏。

1. 心态

中国古代有一个”心态过门尤当先“的寓言笑话:

  洞房花烛夜,羞羞答答的新娘低头看着地上,忽然掩口而笑,指着地上对新郎说:“看,看,看老鼠在吃你家大米。”

  第二天,新娘早早起床洗漱,看到老鼠又在吃大米,大声怒喝:“该死的老鼠,竟敢偷吃我家大米!”

  接着是“嗖”的一声,一只鞋飞了过去。

  新郎听了大喜,知道新娘的心已经离开原来的娘家,过门到现在的这个家了。

  过了门儿啦,新娘心态的转变从她对待老鼠的态度上就可见一斑,所以说,“心态过门尤当先”。

这个笑话对于我们新加入一个公司同样适用,心态很大程度上决定了是否能适应这个新的公司。 心态可分为 4 个点

1.1 对过往的态度:保持敬畏

在大厂工作多年,已经熟悉了大厂的流程和做事方式,习惯了有完善的制度和流程,习惯了强力的支撑系统。到新的公司,可能会觉得这里不行,那里也不好,甚至觉得自己是过来拯救团队的,是救世主。一上来就高谈阔论,方法论,高可用高性能等等,或者直接全部推翻重来,甚至会有直接换一个技术栈,这样操作往往会闹笑话,出问题,这里背后的原因是在于心态。有些急了,有些不切实际。

高 P 技术同学新入职一家新的公司,负责某块的技术,首先要有谦卑的心态。谦卑,就是对万事万物怀一颗敬畏之心,持一份包容情怀,谦卑的人更懂得尊重别人。

新的公司肯定是存在一些问题才会请你过来,所以有问题是一件很正常的事情,但是我们来了后,要保持谦卑,对原来的架构保持一颗敬畏之心,一个公司发展到这个规模,经历了非常多的风风雨雨,还能存活到现在肯定是有其道理的,而且还有一些从表面上看不到的问题,如冰山一样,深埋在水下,保持敬畏,尊重历史成绩。

1.2 快速融入的秘诀:不着急,不害怕,不要脸

“不着急,不害怕,不要脸”是冯唐在《冯唐成事心法》中常提的九字真言,对时间不着急,对结果不害怕,对别人的评价不要脸。

到新的公司,每一个新同学都会想想快速融入,想快点搞清楚公司的做事逻辑、业务流程,技术实现,想快点出成绩,想快点……

这些都是正常的,不要着急,给自己一些时间,给周围的同学一些时间,给事情的发生和发展足够的时间,遵从事物发展的客观规律,尽心尽力,有定力和耐心,在理解公司战略的基础上,沉下去把业务做起来,不用害怕,一切都会是最好的安排。

不要脸,是指快速融入现有团队不要脸,多听听大家的意见,为大家争取一些小的利益,和大家一起吃饭,一起加班,一起讨论问题,有空出去多聚餐,喝点酒,喝多了才好称兄道弟。

同时,放下过去的种种,不管你在过去是什么岗位,带多大的团队,不管是 CTO 还是技术总监,这都是过去的平台给你的,都已经是过去式,在新的地方你就是一个萌新,最多算一个工作很多年的老萌新,作为一个萌新就是要多看,多问,多想,不要脸的那种。

多看看公司的文档,虽然文档刚开始不那么全,但是只字片纸也能让我们对业务有更多的了解;多看看同事的做事方式和流程,知道在这样一个新团队里面大家的工作方式和节奏,发现好的地方和不好的地方,先记下来;多问问公司呆的久的人,有问题的时候多问问业务线的负责人,寻根究底的把项目搞清楚;多想想一个项目或一个团队是放在那里,多想想一个人为什么会出现在某个项目,多想想自己是来做什么的,多想想自己能带来什么价值。

在融入的过程中,不要怕丢脸,敢于被打脸,你问问题的人可能年龄比你小,工作年限比你少或者各方面都不如你,但是在这项目就是比你熟悉;或者一个完全陌生的人,很慢才回你的问题,甚至不回,这些都不重要,关键点是能得到你要的信息,能够帮助你更多的了解公司或项目。在公司的会议上敢于发表自己的意见,可能是错的,可能会被打脸,这些都不重要,关键点是能让更多的人认识你,更快速的融入新的公司。

如此,不着急,不害怕,不要脸,快速融入。

1.3 应有的工作态度:尽心

是尽心,而不是尽力,因为尽心和尽力是两回事。尽心做事和尽力做事,有天壤之别。

其差别关键点在于投入度,如果有人问有没有把握把事情做好,回答是尽力而为,这个回答没有错,也显得很敬业,但是其潜台词通常是“我的能力只有这么多,所以就只能做这么多”,但是每个人的潜力都是很大的,个人的力量可以释放得更充分一些。

如果是尽力,其潜台词是“我一定能完成任务,而且能做得更好、更多”。尽力有些给自我设限,只对自己的能力负责,缺少一些进取之心,只有尽心才能释放潜能。在选择团队成员的时候,一个尽心的员工,哪怕能力差一些,技术差一些,进展慢一些,但是投入度高,能全心全意的投入来完成工作,非常积极,假以时日,能力,技术、进度都将不会是问题。假设一个人的能力值是 1 ,一个尽力的人最多只愿意发挥 1 的能力值,甚至 0.8 ,而对于一个尽心的人来说,哪怕自己的能力值没有 1 ,其也会想办法达到 1 ,甚至超过。不给自己设限,释放自己的潜能。

尽心能带来安全感。尽心做事的时候会有特别重的 Owner 感,有那种这个事情就是我的,和其它东西无关,纯粹是想把这个事情做好;我的心血,我做的东西都在上面,就有了极强的安全感。 这里还有一个前置逻辑,就是信任,组织对个人的信任,组织认为这是你的事情。

1.4 能成事的做事方式:躬身入局

罗胖在 2019 年的跨年演讲中提到了一个概念–躬身入局,是曾国藩讲的一个故事,让人印象至深。 故事是这样的:

  两个农人,挑着沉重的担子,相遇在农田间狭窄的田埂上。
  他们谁也不愿意相让,因为那样的话,想让的那人就要一脚踩到泥泞的水田里,沾一脚泥。他们就那样顶上了,谁也不让谁。

  作为一个旁观者的你该如何相劝呢?
  我们能想到的是:退让一步,海阔天空,要不都走不了。
  其实大多数人,有时候脑子里想的就是:“我凭什么要让你?大不了都不走,看谁犟得过谁!”

  曾老先生从另一个角度提出了解决问题的方法——做一个躬身入局的人:
  旁观者跳入水田,接过其中一个人的担子,让他先过。这样,问题就解决啦。

  这也就是曾老先生所说的:”所谓天下事,在局外呐喊议论总是无益,必须躬身入局,挺膺负责,方有成事之可翼。“

何为做事之人?

不是置身事外,指点江山。而是躬身入局,把自己放进去,把自己变成解决问题的那个人。

躬身入局是对一个管理者基本的要求,是对其执行力的要求。真正的执行力是深入业务场景,和产品,运营、开发小伙伴在一起,共同解决问题、共同克服困难、共同面对挑战、共同承担责任。败则拼死相救、胜则举杯同庆。时时刻刻思考“自己在团队发展过程中扮演什么角色”这个核心问题,以及如何把深度思考后的结论付诸行动,持续迭代。

清晰了心态,我们再聊一下入局的节奏。

2. 入局节奏

人生犹如棋局,职场更甚。能识局者生,善破局者存,掌全局者赢。

2.1. 识局

  1. 了解行业大背景,公司所在的赛道是什么?如果是创业公司,投资人是否关注这个赛道?主要营收靠什么?竞争对手有些?竞争对手的生存情况如何?这个步骤应该是面试这家公司之前就做了一些,本次就是细化其中的更多的关键数据,为后续的一些判断和决策提供顶层的支撑。
  2. 了解公司大背景:公司的文化是什么?大家是如何协同工作的?时间管理是怎样的?做事的价值观是怎样的?怎样的人在公司会更能得到大家的认同?
  3. 了解所在位置: 所负责的业务在公司的位置在哪?所负责的团队在公司的位置在哪?对接的部门,合作的人是哪些?有哪些诉求?业务边界在哪里?利益的边界在哪里?公司大的项目有哪些,干系人有哪些?项目历史情况,现在的情况如何等等;
  4. 了解团队成员:逐一和团队成员做一次 1v1,了解其背景,从 HR 处拿到入职时间 / 工作年限 / 级别 / 薪资结构等信息,了解人才梯队
  5. 了解现在的问题有哪些?挑战点有哪些,是人的问题,流程的问题,还是历史的问题等等,了解清楚公司招我过来是希望我解决什么问题的。

2.2. 破局

2.2.1 先小后大,以点破面

新官上任不用着急,先梳理业务逻辑,人才梯队,业务流程等等,找到问题点,找到破局点。

不要图大而全,不要一上来就搞大系统,先做小,从小点突破,拿到业绩和成果,建立信任,然后再做大的规划。 大的规划从规划到落地需要的时间太长,这样一个很长的时间里面如果没有产出,没有看到有成效的内容出现,可能还没有等到开始落地就已经出局了。 做小点是为了解决生存问题,做大的规划是为了解决发展的问题,顺序不能搞反了。

常见技术破局点:某些服务的性能问题,频发的告警服务,高负载的数据库,客诉问题多的点,新项目的技术架构方案,研发流程中的卡点,构建发布流程的优化,长期没有人能解决的问题、痛点或难点并且能快速解决的。

2.2.2 搭班子,带队伍

除了专注于破局的点和事项以外,尽快搞定人的问题,把团队搭起来,把人才梯队搭建好,管理者更多的是通过一线同学的手来拿结果,没有一个合格的团队,破局难,掌局更难。

首先,做好现有团队的沟通工作,不要让人觉得你是来抢事的,要让他们相信你是来帮忙的,来帮大家解决问题的,空降后和团队在行政上是上下级关系,但是根本上是合作的关系,来的作用是帮忙大家的。带领大家一起赢,遇到问题,是跟我上,而不是给我上。

其次,尽量用现有团队成员,也可适当新招或带一些人过去。现有团队有其优点,也会有其缺点,这些人在公司的时间长,掌握的信息量和资源都是一个新人缺失的,甚至有的人是跟了老板多年的老员工,能在老板面前说上话,甚至可能老板会问新来的这家伙感觉怎么样。在刚到团队的时候,要团结这些原有团队的人,有助于快速掌握资源和信息,加速你融入和破局的过程。

最后,在团队中找到志同道合的人,作为核心成员培养他们,让他们成为你的得力助手。饼还是要画的,落到手的实际也是需要有的,大棒和枣一个都不能少。

如果现有团队里面有不服你的人,极度不配合,但是还是要想办法去融入,不要脸的那种,等站稳后再看怎么处理。比如有一个 leader 不服,到处鼓动大家不配合工作,没关系,继续安排工作,只要工作能完成得好就行,而且还给比较好的绩效,针对好的绩效再提出高的标准,如果没有达到标准再降绩效,同时,招聘或内部提拔一个可以替代的同学,半年或者一年以后,站稳了后再视情况考虑后续的操作。

凡事都有套路,还是套路得人心,常用管理套路:

沟通反馈:1v1、个人目标制定、OKR、反馈、周报、周会、月会、团队建设、非正式沟通、向上管理
项目管理:项目进度、风险管理、紧急需求、复盘、跟进、反馈、拿结果
项目质量:线上稳定性、代码质量、Code Review、交付质量
人员管理:备份、淘汰、晋升、激励、绩效管理,360
人员招聘:业务盘点、人才盘点、人才素质模型、人才梯队、实习、试用
学习:总结、分享、交流、达摩院

2.2.3 破局

在和团队充分沟通,了解一些业务,了解业务中的痛点后,根据难易程度和优先级,选择个人觉得有挑战,好突破的点,找到破局点后,和领导沟通,得到充分的支持和授权,拉兄弟们一起干,和团队一起拿结果,在这些小点的累积中,上级对你的信任、团队对你的信任慢慢就建立起来了,如此,在这个新环境算是存活下来了,至此,已破局。

2.3 掌局

破局以后,随着时间的增加,从一个新人慢慢变成老人,对业务越来越熟悉,对人也越来越熟悉,此时不能飘,得躬身入局,把自己放进去,把自己变成那个解决问题,能掌控全局的人。

掌控全局可以从人员管理、团队演进和流程机制三个方面来掌控。

2.3.1 人员管理

人员管理主要是人的聘用育留。

  • 招人:招人得先有业务,研发是为业务服务的,先搞清楚业务是要做啥,然后才是盘人,看看现在有什么人,都有什么样的人,还需要什么样的人,这样的人在哪里可以找到,以及给这些人我们可以提供什么样的待遇,什么样的机会等等;常用套路:业务盘点,人才盘点,人才画像,人才素质模型,人才地图,面试流程,面试官标准,人才策略,内推,专场,
  • 用人:一线执行的同学看才能,对于技术同学来说就是技术水平怎么样,另外,还会看态度,或者说是工作的投入度,对于投入度高的同学会有一些资源倾斜;中层看德行和才能,这里的中层是指有管理职能的同学,同样也需要看技术能力,同时要看规划的能力,项目管理能力,沟通能力等等;高层看格局,是不是能从让公司更好出发来解决问题,而不是局限于自己的一亩三分地;常用套路:聚集,复盘,人才梯队,人才密度,分层用人,360度考核,加减分制,模块负责人,需求负责人,项目管理,风险管理,老人做新业务,新人做老业务
  • 育人:这块主要是培训分享,新人融入,以老带新,员工成长,常用套路:IDP,导师制,分享会,管理培训,技术通道,自我迭代,培训体系,职级体系,文化,价值观,方法论,系统化
  • 留人:基层基本上是看待遇,这里的待遇除了薪水,还看一些软性的福利和团队氛围,说白了就是看呆得爽不爽,有没有成就感,有没有感受到成长;中层靠情感,主要是领导是不是靠谱的领导,能不能帮助他提升,是不是一起奋斗过,对团队有感情了就不那么容易走;高层就要看事业了,主要是看这个事情是不是能做得大,大家在一起最后会不会把这个蛋糕做得更大,能让自己有那种事业的成就感,并且在事业中能得到较大的回报。

2.3.2 团队演进和价值观

对于一个团队来说,一般分为三个级别,初级,中级,高级,但是这三个级别并不是泾渭分明的,可能会三个级别的东西会同时存在,因为团队中包含的内容模块较多,不同的内容模块所在的级别不一样。

  • 初级团队:初级团队靠骨干,以人治为主,这个阶段把核心骨干找到或者培养起来,让他们来搞定事情;
  • 中级团队:中级团队靠规范,以人治 + 流程规范为主,在核心骨干的基础上,把好的经验以流程规范的方式沉淀下来,就算是核心骨干走了,还有东西可以传承;
  • 高级团队:高级团队靠系统,把好的规范做成系统,用系统来驱动团队的进步,在系统的支撑下,让好的东西传承下来,让大家更高效更好的工作。

三个层面团队不是一蹴而就的,也没有清晰的分层,是一个演化的过程,从培养骨干开始,到规范化,到系统化落地,一点点积累,这样整个团队就会变得更好一些。这也是带研发团队最大的挑战。

在清晰了解团队所在阶段的同时,团队领导者需要从平时的工作中提炼出适合自己团队的价值观。

价值观是什么?

团队的价值观就是表达一个团队赞同什么,反对什么,是一个团队做事的行为准则。 价值观会潜移默化地体现在团队成员的做事的态度和方式方法上。

如我们的价值观是:

  • 允许犯错,但不容忍罔顾教训、一错再错 这个是《原则》这本书里面提到一个观点,也是我们非常认可的一个观点,允许犯错是让大家不要畏惧挑战,敢于试错,不容忍罔顾教训是我们遇到问题和错误要复盘和总结,找到问题的根本原因,总结出方法论,后续可以规避类似的错误。
  • 长期有耐心,基于深度思考的持续迭代 长期有耐心是一本讲美团的书里讲的内容,对于我们同样适用,持续迭代,长期有耐心的把业务做好,提升自己,自我迭代。

2.3.3 机制和系统化建设

带研发团队,在流程机制方面主要是关注研发效率和研发质量。对于研发效率和质量需要有一个完整的研发流程来保证,一般的流程如下:

流程保障之外,还需要和产品,UI 等各方确认协同的节奏,如周需求评审机制,双周 APP 版本发布,版本回顾会等等。 同时我们需要制定团队的标准和规划,并且在过程中根据需要迭代这些标准规范,常见标准和规范如下:

  • 人员标准:技术职级标准、绩效考核标准、候选人评估标准、干部评估标准
  • 质量标准:代码质量标准、Code Review 标准、测试质量标准、线上质量标准
  • 性能标准:服务端性能标准、客户端性能标准、前端性能标准
  • 安全标准:代码安全标准、数据安全标准、线上安全标准
  • 研发规范:代码风格规范、数据库设计规范、代码分干管理规范、代码提交规范、错误码规范
  • 协同规范:架构规范、技术方案规范、技术文档规范、接口规范

在流程规范和协同之外,研发的效率和质量需要有一些基建来保障,如好用的框架,集成在框架中的静态代码分析,流畅且稳定的构建系统,靠谱的日志系统和监控系统,好用的链路跟踪系统等等。如果公司暂时没有这些,那么先看看业界有哪些,做一些选型后,把最合适的用起来。

你好,我是潘锦,超过 10 年的研发管理和技术架构经历,出过书,创过业,带过百人团队,也在腾讯,A 股上市公司呆过一些年头,现在在一家 C 轮的公司负责一些技术方面的管理工作。早年做过 NOI 和 ACM,对前端架构、跨端、后端架构、云原生、DevOps 等技术始终保持着浓厚的兴趣,平时喜欢读书、思考,终身学习实践者,欢迎一起交流学习。微信公众号:架构和远方,博客: www.phppan.com



除了眼前的苟且,还有架构与远方。

介绍创业路上的技术选型和架构、大型网站架构、高性能高可用可扩展架构实现,技术管理等相关话题,紧跟业界主流步伐。

qrcode_for_gh_5d3f534e15fe_344 (1)

交付是一种基本的态度

前言

在很早以前看过一篇有点心灵鸡汤的文章,文章标题是《月入 3 千和月入 3 万有什么区别》,文章的具体内容不太记得了。特地去百度了一下,有了最新的微信截图版,内容差不多,如下:

同样,看另外一个案例:

有两位行政助理接到领导任务,要买3张次日去北京的动车票,以参加展会。
这两位行政助理查了车次,发现没票。

第一位行政处理直接回复领导说,太晚了,目前没票,只能再刷刷,看看后续有没有票放出来。

第二位行政处理找到领导,说明情况后,提出4个备选方案。

方案1: 用抢票软件继续刷票,同时找票贩子加价,大概每张加价100元,下午应该能拿到。

方案2:换个地点倒车,可以买到票,但时间会多出4个小时,价格每人多200元。

方案3:改乘飞机,每个人会多800元,但时间能缩短1个小时。

方案4:包车过去,总体会贵1000元,时间会多出4个小时。

先不说是否标题党,是否杜撰的,从需求方的角度来看,是不是都会喜欢第二个人一些。为什么呢?

因为他们多做了一步或者两步,多想了一些,让事情和结果更完整。

什么是交付能力

这就是我们要说的交付能力。 所谓交付能力,就是指能提供具有可用性、完整性成果的能力。一个人的职场价值,很大程度上由交付能力所决定。

从我们的实际工作中来看也有存在没有完整交付的情况,通常其表象是需求模糊,信息未对齐、沟通效率低、质量不高造成返工等等。

原因客观分析有很多,但是归根到底还是人的问题,人的意识问题和态度问题。我们做一件事情,要有头有尾,头一般都有,但尾不一定,而且大家对于这个尾的定义不一样,这就是我们这里要说的结果,要说的交付。

对于一个开发同学,一件事情的交付绝不仅仅是把代码写完。在代码高质量的基础上,完成多场景的自测,多次的 Code Review,完善的文档,对性能的评估,对安全的评估;在完成以上这些后提交给联调的同学,积极主动的解决联调中的问题,再一起完成提交给 QA同学,积极的解决反馈的 BUG,上线的时候一起值守,持续观察线上日志,完全没有问题就告一段落;上线后看有没有相关告警,关注业务的数据,等数据出来,再次迭代,这才叫完整的交付。

研发各端交付标准

研发各端具体交付要求如下:

后端交付标准

对于后端同学,稳定靠谱是基本要求,后端完整的交付包括:

  1. 优雅的架构设计和编码;
  2. 完善的设计文档和接口文档;
  3. 完整且可快速 MOCK 的接口协议;
  4. 多场景的自测和多次的 Code Review;
  5. 性能 / 安全等非功能性的评估;
  6. 积极主动的联调配合和问题解决;
  7. 上线过程各环节的推进和关注;
  8. 关注线上问题及业务数据。

前端和移动端交付标准

对于前端和移动端同学,界面还原和更好的产品 sense 是基本的要求,其完整的交付包括:

  1. 优雅的架构设计和编码;
  2. 完善的设计文档;
  3. 高保真的界面还原;
  4. 多场景的自测和多次的 Code Review;
  5. 界面性能 / 系统安全等非功能性的评估;
  6. 积极主动的联调和问题跟进;
  7. 上线过程各环节的推进和关注;
  8. 关注线上问题及业务数据。

QA 交付标准

对于 QA 同学,虽然现阶段不涉及业务的开发,但其交付的重要度会更重一些,因为 QA 同学的交付对象是用户,是我们研发侧最后的一道防线。QA 同学的交付包括:

  1. 比产品和开发更熟悉整体业务流程;
  2. 输出完整而全面的测试用例文档;
  3. 积极主动的跟进测试中的问题,严格要求质量,确保需求达到上线的要求;
  4. 跟进上线发布流程,线上回归,确保主线路和当前需求正常;
  5. 有理有据的测试报告,对过程中的问题进行回顾,并下次迭代;
  6. 对线上问题敏感,归档记录线上的问题,跟进到解决。

总结

最后,在高质量高效完成需求的基础上,思考当前模块有什么问题,技术上可以做一些什么改进,提升工作的质量和效率,当出了一个问题后,能够快速定位问题,解决问题,并为后续规避此类问题提出系统性的解决方案,这是更高一级的交付,我们称之为掌控

从零开始搭建创业公司后台技术栈

说到后台技术栈,脑海中是不是浮现的是这样一幅图?

[图1]

有点眼晕,以上只是我们会用到的一些语言的合集,而且只是语言层面的一部分,就整个后台技术栈来说,这只是一个开始,从语言开始,还有很多很多的内容。今天要说的后台是大后台的概念,放在服务器上的东西都属于后台的东西,比如使用的框架,语言,数据库,服务,操作系统等等,整个后台技术栈我的理解包括4个层面的内容:

  • 语言: 用了哪些开发语言,如:c++/java/go/php/python/ruby等等;
  • 组件:用了哪些组件,如:MQ组件,数据库组件等等;
  • 流程:怎样的流程和规范,如:开发流程,项目流程,发布流程,监控告警流程,代码规范等等;
  • 系统:系统化建设,上面的流程需要有系统来保证,如:规范发布流程的发布系统,代码管理系统等等;

结合以上的的4个层面的内容,整个后台技术栈的结构如图2所示:

[图2 后台技术栈结构]

以上的这些内容都需要我们从零开始搭建,在创业公司,没有大公司那些完善的基础设施,需要我们从开源界,从云服务商甚至有些需要自己去组合,去拼装,去开发一个适合自己的组件或系统以达成我们的目标。咱们一个个系统和组件的做选型,最终形成我们的后台技术栈。

一、各系统组件选型

1、项目管理/Bug管理/问题管理

项目管理软件是整个业务的需求,问题,流程等等的集中地,大家的跨部门沟通协同大多依赖于项目管理工具。有一些 SAAS 的项目管理服务可以使用,但是很多时间不满足需求,此时我们可以选择一些开源的项目,这些项目本身有一定的定制能力,有丰富的插件可以使用,一般的创业公司需求基本上都能得到满足,常用的项目如下:

  • Redmine: 用 Ruby 开发的,有较多的插件可以使用,能自定义字段,集成了项目管理,BUG 问题跟踪,WIKI 等功能,不过好多插件 N 年没有更新了;

  • Phabricator: 用 PHP 开发的,facebook 之前的内部工具,开发这工具的哥们离职后自己搞了一个公司专门做这个软件,集成了代码托管, Code Review,任务管理,文档管理,问题跟踪等功能,强烈推荐较敏捷的团队使用;

  • Jira:用 Java 开发的,有用户故事,task 拆分,燃尽图等等,可以做项目管理,也可以应用于跨部门沟通场景,较强大;

  • 悟空CRM :这个不是项目管理,这个是客户管理,之所以在这里提出来,是因为在 To B 的创业公司里面,往往是以客户为核心来做事情的,可以将项目管理和问题跟进的在悟空 CRM 上面来做,他的开源版本已经基本实现了 CR< 的核心 功能,还带有一个任务管理功能,用于问题跟进,不过用这个的话,还是需要另一个项目管理的软件协助,顺便说一嘴,这个系统的代码写得很难维护,只能适用于客户规模小(1万以内)时。

2、DNS

DNS 是一个很通用的服务,创业公司基本上选择一个合适的云厂商就行了,国内主要是两家:

  • 阿里万网:阿里 2014 年收购了万网,整合了其域名服务,最终形成了现在的阿里万网,其中就包含 DNS 这块的服务;

  • 腾讯 DNSPod: 腾讯 2012 年以 4000 万收购 DNSPod 100% 股份,主要提供域名解析和一些防护功能;

如果你的业务是在国内,主要就是这两家,选 一个就好,像今日头条这样的企业用的也是 DNSPod 的服务,除非一些特殊的原因才需要自建,比如一些 CDN 厂商,或者对区域有特殊限制的。要实惠一点用阿里最便宜的基础版就好了,要成功率高一些,还是用DNSPod 的贵的那种。

在国外还是选择亚马逊吧,阿里的 DNS 服务只有在日本和美国有节点,东南亚最近才开始部点, DNSPod 也只有美国和日本,像一些出海的企业,其选择的云服务基本都是亚马逊。

如果是线上产品,DNS 强烈建议用付费版,阿里的那几十块钱的付费版基本可以满足需求。如果还需要一些按省份或按区域调试的逻辑,则需要加钱,一年也就几百块,省钱省力。

如果是国外,优先选择亚马逊,如果需要国内外互通并且有自己的 APP 的话,建议还是自己实现一些容灾逻辑或者智能调度,因为没有一个现成的 DNS 服务能同时较好的满足国内外场景,或者用多个域名,不同的域名走不同的 DNS 。

3、LB(负载均衡)

LB(负载均衡)是一个通用服务,一般云厂商的 LB 服务基本都会如下功能:

  • 支持四层协议请求(包括 TCP、UDP 协议);
  • 支持七层协议请求(包括 HTTP、HTTPS 协议);
  • 集中化的证书管理系统支持 HTTPS 协议;
  • 健康检查;

如果你线上的服务机器都是用的云服务,并且是在同一个云服务商的话,可以直接使用云服务商提供的 LB 服务,如阿里云的 SLB,腾讯云的 CLB, 亚马逊 的 ELB 等等。如果是自建机房基本都是 LVS + Nginx。

4、CDN

CDN 现在已经是一个很红很红的市场,基本上只能挣一些辛苦钱,都是贴着成本在卖。国内以网宿为龙头,他们家占据整个国内市场份额的40%以上,后面就是腾讯,阿里。网宿有很大一部分是因为直播的兴起而崛起。

国外,Amazon 和 Akamai 合起来占比大概在 50%,曾经的国际市场老大 Akamai 拥有全球超一半的份额,在 Amazon CDN入局后,份额跌去了将近 20%,众多中小企业都转向后者,Akamai 也是无能为力。

国内出海的 CDN 厂商,更多的是为国内的出海企业服务,三家大一点的 CDN 服务商里面也就网宿的节点多一些,但是也多不了多少。阿里和腾讯还处于前期阶段,仅少部分国家有节点。

就创业公司来说,CDN 用腾讯云或阿里云即可,其相关系统较完善,能轻松接入,网宿在系统支持层面相对较弱一些,而且还贵一些。并且,当流量上来后,CDN 不能只用一家,需要用多家,不同的 CDN 在全国的节点覆盖不一样,而且针对不同的客户云厂商内部有些区分客户集群,并不是全节点覆盖(但有些云厂商说自己是全网节点),除了节点覆盖的问题,多 CDN 也在一定程度上起到容灾的作用。

5、RPC框架

维基百科对 RPC 的定义是:远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。

通俗来讲,一个完整的RPC调用过程,就是 Server 端实现了一个函数,客户端使用 RPC 框架提供的接口,调用这个函数的实现,并获取返回值的过程。

业界 RPC 框架大致分为两大流派,一种侧重跨语言调用,另一种是偏重服务治理。

跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等。这类 RPC 框架侧重于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合多语言调用场景。但这类框架没有服务发现相关机制,实际使用时需要代理层进行请求转发和负载均衡策略控制。

其中,gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现框架的功能需要进一步的开发。

Hprose(High Performance Remote Object Service Engine) 是一个 MIT 开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。

服务治理型的 RPC 框架的特点是功能丰富,提供高性能的远程调用、服务发现及服务治理能力,适用于大型服务的服务解耦及服务治理,对于特定语言(Java)的项目可以实现透明化接入。缺点是语言耦合度较高,跨语言支持难度较大。国内常见的冶理型 RPC 框架如下:

  • Dubbo: Dubbo 是阿里巴巴公司开源的一个 Java 高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。当年在淘宝内部,Dubbo 由于跟淘宝另一个类似的框架 HSF 有竞争关系,导致 Dubbo 团队解散,最近又活过来了,有专职同学投入。
  • DubboX: DubboX 是由当当在基于 Dubbo 框架扩展的一个 RPC 框架,支持 REST 风格的远程调用、Kryo/FST 序列化,增加了一些新的feature。
  • Motan: Motan 是新浪微博开源的一个 Java 框架。它诞生的比较晚,起于 2013 年,2016 年 5 月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。
  • rpcx: rpcx 是一个类似阿里巴巴Dubbo 和微博 Motan 的分布式的 RPC 服务框架,基于 Golang net/rpc 实现。但是 rpcx 基本只有一个人在维护,没有完善的社区,使用前要慎重,之前做 Golang 的 RPC 选型时也有考虑这个,最终还是放弃了,选择了 gRPC,如果想自己自研一个 RPC 框架,可以参考学习一下。

6、名字发现/服务发现

名字发现和服务发现分为两种模式,一个是客户端发现模式,一种是服务端发现模式。

框架中常用的服务发现是客户端发现模式。

所谓服务端发现模式是指客户端通过一个负载均衡器向服务发送请求,负载均衡器查询服务注册表并把请求路由到一台可用的服务实例上。现在常用的负载均衡器都是此类模式,常用于微服务中。

所有的名字发现和服务发现都要依赖于一个可用性非常高的服务注册表,业界常用的服务注册表有如下三个:

  • etcd,一个高可用、分布式、一致性、key-value方式的存储,被用在分享配置和服务发现中。两个著名的项目使用了它:k8s和Cloud Foundry。
  • consul,一个发现和配置服务的工具,为客户端注册和发现服务提供了API,Consul还可以通过执行健康检查决定服务的可用性。
  • Apache Zookeeper,是一个广泛使用、高性能的针对分布式应用的协调服务。Apache Zookeeper本来是 Hadoop 的子工程,现在已经是顶级工程了。

除此之外也可以自己实现服务实现,或者用 Redis 也行,只是需要自己实现高可用性。

7、关系数据库

关系数据库分为两种,一种是传统关系数据,如 Oracle, MySQL,Maria, DB2,PostgreSQL 等等,另一种是 NewSQL,即至少要满足以下五点的新型关系数据库:

  1. 完整地支持SQL,支持JOIN / GROUP BY /子查询等复杂SQL查询;

  2. 支持传统数据标配的 ACID 事务,支持强隔离级别。

  3. 具有弹性伸缩的能力,扩容缩容对于业务层完全透明。

  4. 真正的高可用,异地多活、故障恢复的过程不需要人为的接入,系统能够自动地容灾和进行强一致的数据恢复。

  5. 具备一定的大数据分析能力

传统关系数据库用得最多的是 MySQL,成熟,稳定,一些基本的需求都能满足,在一定数据量级之前基本单机传统数据库都可以搞定,而且现在较多的开源系统都是基于 MySQL,开箱即用,再加上主从同步和前端缓存,百万 pv 的应用都可以搞定了。不过 CentOS 7 已经放弃了 MySQL,而改使用 MariaDB。MariaDB 数据库管理系统是 MySQ L的一个分支,主要由开源社区在维护,采用GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQ L闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

在 Google 发布了 F1: A Distributed SQL Database That Scales 和 Spanner: Google’s Globally-Distributed Databasa 之后,业界开始流行起 NewSQL。于是有了 CockroachDB,于是有了 奇叔公司的 TiDB。国内已经有比较多的公司使用 TiDB,之前在创业公司时在大数据分析时已经开始应用 TiDB,当时应用的主要原因是 MySQL 要使用分库分表,逻辑开发比较复杂,扩展性不够。

8、NoSQL

NoSQL 顾名思义就是 Not-Only SQL,也有人说是 No – SQL, 个人偏向于Not – Only SQL,它并不是用来替代关系库,而是作为关系型数据库的补充而存在。

常见 NoSQL 有4个类型:

  1. 键值,适用于内容缓存,适合混合工作负载并发高扩展要求大的数据集,其优点是简单,查询速度快,缺点是缺少结构化数据,常见的有 Redis, Memcache, BerkeleyDB 和 Voldemort 等等;
  2. 列式,以列簇式存储,将同一列数据存在一起,常见于分布式的文件系统,其中以 Hbase,Cassandra 为代表。Cassandra 多用于写多读少的场景,国内用得比较多的有 360,大概 1500 台机器的集群,国外大规模使用的公司比较多,如 Ebay,Instagram,Apple 和沃尔玛等等;
  3. 文档,数据存储方案非常适用承载大量不相关且结构差别很大的复杂信息。性能介于 kv 和关系数据库之间,它的灵感来于 lotus notes,常见的有 MongoDB,CouchDB 等等;

  4. 图形,图形数据库擅长处理任何涉及关系的状况。社交网络,推荐系统等。专注于构建关系图谱,需要对整个图做计算才能得出结果,不容易做分布式的集群方案,常见的有 Neo4J,InfoGrid 等。

除了以上4种类型,还有一些特种的数据库,如对象数据库,XML 数据库,这些都有针对性对某些存储类型做了优化的数据库。

在实际应用场景中,何时使用关系数据库,何时使用 NoSQL,使用哪种类型的数据库,这是我们在做架构选型时一个非常重要的考量,甚至会影响整个架构的方案。

9、消息中间件

消息中间件在后台系统中是必不可少的一个组件,一般我们会在以下场景中使用消息中间件:

  • 异步处理:异步处理是使用消息中间件的一个主要原因,在工作中最常见的异步场景有用户注册成功后需要发送注册成功邮件、缓存过期时先返回老的数据,然后异步更新缓存、异步写日志等等;通过异步处理,可以减少主流程的等待响应时间,让非主流程或者非重要业务通过消息中间件做集中的异步处理。

  • 系统解耦:比如在电商系统中,当用户成功支付完成订单后,需要将支付结果给通知ERP系统、发票系统、WMS、推荐系统、搜索系统、风控系统等进行业务处理;这些业务处理不需要实时处理、不需要强一致,只需要最终一致性即可,因此可以通过消息中间件进行系统解耦。通过这种系统解耦还可以应对未来不明确的系统需求。

  • 削峰填谷:当系统遇到大流量时,监控图上会看到一个一个的山峰样的流量图,通过使用消息中间件将大流量的请求放入队列,通过消费者程序将队列中的处理请求慢慢消化,达到消峰填谷的效果。最典型的场景是秒杀系统,在电商的秒杀系统中下单服务往往会是系统的瓶颈,因为下单需要对库存等做数据库操作,需要保证强一致性,此时使用消息中间件进行下单排队和流控,让下单服务慢慢把队列中的单处理完,保护下单服务,以达到削峰填谷的作用。

业界消息中间件是一个非常通用的东西,大家在做选型时有使用开源的,也有自己造轮子的,甚至有直接用 MySQL 或 Redis 做队列的,关键看是否满足你的需求,如果是使用开源的项目,以下的表格在选型时可以参考:

[图3]

以上图的纬度为:名字 成熟度所属社区/公司 文档 授权方式 开发语言支持的协议 客户端支持的语言 性能 持久化 事务 集群 负载均衡 管理界面 部署方式 评价

10 、代 码管理

代码是互联网创业公司的命脉之一,代码管理很重要,常见的考量点包括两块:

  • 安全和权限管理,将代码放到内网并且对于关系公司命脉的核心代码做严格的代码控制和机器的物理隔离;
  • 代码管理工具,Git 作为代码管理的不二之选,你值得拥有。Gitlab 是当今最火的开源 Git 托管服务端,没有之一,虽然有企业版,但是其社区版基本能满足我们大部分需求,结合 Gerrit 做 Code review,基本就完美了。当然 Gitlab 也有代码对比,但没Gerrit 直观。Gerrit 比 Gitlab 提供了更好的代码检查界面与主线管理体验,更适合在对代码质量有高要求的文化下使用。

11、持续集成

持续集成简,称 CI(continuous integration), 是一种软件开发实践,即团队开发成员经常集成他们的工作,每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。持续集成为研发流程提供了代码分支管理/比对、编译、检查、发布物输出等基础工作,为测试的覆盖率版本编译、生成等提供统一支持。

业界免费的持续集成工具中系统我们有如下一些选择:

  • Jenkins:Jjava写的 有强大的插件机制,MIT协议开源 (免费,定制化程度高,它可以在多台机器上进行分布式地构建和负载测试)。Jenkins可以算是无所不能,基本没有 Jenkins 做不了的,无论从小型团队到大型团队 Jenkins 都可以搞定。 不过如果要大规模使用,还是需要有人力来学习和维护。

  • TeamCity: TeamCity与Jenkins相比使用更加友好,也是一个高度可定制化的平台。但是用的人多了,TeamCity就要收费了。

  • Strider: Strider 是一个开源的持续集成和部署平台,使用 Node.js 实现,存储使用的是 MongoDB,BSD 许可证,概念上类似 Travis 和Jenkins。

  • GitLabCI:从GitLab8.0开始,GitLab CI 就已经集成在 GitLab,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个Runner,即可进行持续集成。并且 Gitlab 与 Docker 有着非常好的相互协作的能力。免费版与付费版本不同可以参见这里:https://about.gitlab.com/products/feature-comparison/

  • Travis:Travis 和 Github 强关联;闭源代码使用 SaaS 还需考虑安全问题; 不可定制;开源项目免费,其它收费;

  • Go: Go是ThoughtWorks公司最新的Cruise Control的化身。除了 ThoughtWorks 提供的商业支持,Go是免费的。它适用于Windows,Mac和各种Linux发行版。

12、日志系统

日志系统一般包括打日志,采集,中转,收集,存储,分析,呈现,搜索还有分发等。一些特殊的如染色,全链条跟踪或者监控都可能需要依赖于日志系统实现。日志系统的建设不仅仅是工具的建设,还有规范和组件的建设,最好一些基本的日志在框架和组件层面加就行了,比如全链接跟踪之类的。

对于常规日志系统ELK能满足大部分的需求,ELK 包括如下组件:

  • ElasticSearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

  • Logstash 是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用。

  • Kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。

因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。加上配置 Nginx 实现简单的用户认证,一定程度上提高安全性。另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。ELK 架构如图4所示:

[图4] ELK 流程图

对于有实时计算的需求,可以使用 Flume+Kafka+Storm+MySQL方案,一 般架构如图5所示:

[图5] 实时分析系统架构图

其中:

  • Flume 是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume 提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
  • Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,由 Scala 和 Java 编写。其本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,它以可水平扩展和高吞吐率而被广泛使用。

Kafka 追求的是高吞吐量、高负载,Flume 追求的是数据的多样性,二者结合起来简直完美。

13、监控系统

监控系统只包含与后台相关的,这里主要是两块,一个是操作系统层的监控,比如机器负载,IO,网络流量,CPU,内存等操作系统指标的监控。另一个是服务质量和业务质量的监控,比如服务的可用性,成功率,失败率,容量,QPS 等等。常见业务的监控系统先有操作系统层面的监控(这部分较成熟),然后扩展出其它监控,如 zabbix,小米的 open-falcon,也有一出来就是两者都支持的,如 prometheu s。如果对业务监控要求比较高一些,在创业选型中建议可以优先考虑 prometheus。这里有一个有趣的分布,如图6所示

[图6 监控系统分布]

亚洲区域使用 zabbix 较多,而美洲和欧洲,以及澳大利亚使用 prometheus 居多,换句话说,英文国家地区(发达国家?)使用prometheus 较多。

Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库( TSDB )。Prometheus 使用 Go 语言开发,是 Google BorgMon 监控系统的开源版本。相对于其它监控系统使用的 push 数据的方式,prometheus 使用的是 pull 的方式,其架构如图7所示:

[图7] prometheus架构图

如上图所示,prometheus 包含的主要组件如下:

  • Prometheus Server 主要负责数据采集和存储,提供 PromQL 查询语言的支持。Server 通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目标。根据这些目标会,Server 定时去抓取 metric s数据,每个抓取目标需要暴露一个 http 服务的接口给它定时抓取。

  • 客户端SDK:官方提供的客户端类库有 go、java、scala、python、ruby,其他还有很多第三方开发的类库,支持 nodejs、php、erlang 等。

  • Push Gateway 支持临时性 Job 主动推送指标的中间网关。

  • Exporter Exporter 是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为 Prometheus 支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。Prometheus提供多种类型的 Exporter 用于采集各种不同服务的运行状态。目前支持的有数据库、硬件、消息中间件、存储系统、HTTP服务器、JMX等。

  • alertmanager:是一个单独的服务,可以支持 Prometheus 的查询语句,提供十分灵活的报警方式。

  • Prometheus HTTP API的查询方式,自定义所需要的输出。

  • Grafana 是一套开源的分析监视平台,支持 Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch 等数据源,其 UI 非常漂亮且高度定制化。

创业公司选择 Prometheus + Grafana 的方案,再加上统一的服务框架(如 gRPC ),可以满足大部分中小团队的监控需求。

14、配置系统

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、降级开关,灰度开关,参数的配置、服务器的地址、数据库配置等等,除此之外,对后台程序配置的要求也越来越高:配置修改后实时生效,灰度发布,分环境、分用户,分集群管理配置,完善的权限、审核机制等等,在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求,业界有如下两种方案:

  • 基于 zk 和 etcd,支持界面和 api ,用数据库来保存版本历史,预案,走审核流程,最后下发到 zk 或 etcd 这种有推送能力的存储里(服务注册本身也是用 zk 或 etcd,选型就一块了)。客户端都直接和 zk 或 etcd 打交道。至于灰度发布,各家不同,有一种实现是同时发布一个需要灰度的 IP 列表,客户端监听到配置节点变化时,对比一下自己是否属于该列表。PHP 这种无状态的语言和其他 zk/etcd 不支持的语言,只好自己在客户端的机器上起一个 Agent 来监听变化,再写到配置文件或共享内存,如 360 的 Qconf。

  • 基于运维自动化的配置文件的推送,审核流程,配置数据管理和方案一类似,下发时生成配置文件,基于运维自动化工具如Puppet,Ansible 推送到每个客户端,而应用则定时重新读取这个外部的配置文件,灰度发布在下发配置时指定IP列表。

创业公司前期不需要这种复杂,直接上 zk,弄一个界面管理 zk 的内容,记录一下所有人的操作日志,程序直连 zk,或者或者用Qconf 等基于 zk 优化后的方案。

15、发布系统/部署系统

从软件生产的层面看,代码到最终服务的典型流程如图8所示:

[图8 流程图]

从上图中可以看出,从开发人员写下代码到服务最终用户是一个漫长过程,整体可以分成三个阶段:

  • 从代码(Code)到成品库(Artifact)这个阶段主要对开发人员的代码做持续构建并把构建产生的制品集中管理,是为部署系统准备输入内容的阶段。
  • 从制品到可运行服务 这个阶段主要完成制品部署到指定环境,是部署系统的最基本工作内容。
  • 从开发环境到最终生产环境 这个阶段主要完成一次变更在不同环境的迁移,是部署系统上线最终服务的核心能力。

发布系统集成了制品管理,发布流程,权限控制,线上环境版本变更,灰度发布,线上服务回滚等几方面的内容,是开发人员工作结晶最终呈现的重要通道。开源的项目中没有完全满足的项目,如果只是 Web 类项目,Walle、Piplin 都是可用的,但是功能不太满足,创业初期可以集成 Jenkins + Gitlab + Walle (可以考虑两天时间完善一下),以上方案基本包括 制品管理,发布流程,权限控制,线上环境版本变更,灰度发布(需要自己实现),线上服务回滚等功能。

16、跳板机

跳板机面对的是需求是要有一种能满足角色管理与授权审批、信息资源访问控制、操作记录和审计、系统变更和维护控制要求,并生成一些统计报表配合管理规范来不断提升IT内控的合规性,能对运维人员操作行为的进行控制和审计,对误操作、违规操作导致的操作事故,快速定位原因和责任人。其功能模块一般包括:帐户管理、认证管理、授权管理、审计管理等等

开源项目中,Jumpserver 能够实现跳板机常见需求,如授权、用户管理、服务器基本信息记录等,同时又可批量执行脚本等功能;其中录像回放、命令搜索、实时监控等特点,又能帮助运维人员回溯操作历史,方便查找操作痕迹,便于管理其他人员对服务器的操作控制。

17、机器管理

机器管理的工具选择的考量可以包含以下三个方面:

  1. 是否简单,是否需要每台机器部署agent(客户端)
  2. 语言的选择(puppet/chef vsansible/saltstack)开源技术,不看官网不足以熟练,不懂源码不足以精通;Puppet、Chef基于Ruby开发,ansible、saltstack基于python开发的
  3. 速度的选择(ansiblevssaltstack) ansible基于SSH协议传输数据,Saltstack使用消息队列zeroMQ传输数据;大规模并发的能力对于几十台-200台规模的兄弟来讲,ansible的性能也可接受,如果一次操作上千台,用salt好一些。

如图9所示:

[图9 机器管理软件对比]

一般创业公司选择 Ansible 能解决大部问题,其简单,不需要安装额外的客户端,可以从命令行来运行,不需要使用配置文件。至于比较复杂的任务,Ansible 配置通过名为 Playbook 的配置文件中的 YAML 语法来加以处理。Playbook 还可以使用模板来扩展其功能。

二、创业公司的选择

1、选择合适的语言

  • 选择团队熟悉的/能掌控的,创业公司人少事多,无太多冗余让研发团队熟悉新的语言,能快速上手,能快速出活,出了问题能快速解决的问题的语言才是好的选择。
  • 选择更现代一些的,这里的现代是指语言本身已经完成一些之前需要特殊处理的特性,比如内存管理,线程等等。
  • 选择开源轮子多的或者社区活跃度高的,这个原则是为了保证在开发过程中减少投入,有稳定可靠的轮子可以使用,遇到问题可以在网上快速搜索到答案。
  • 选择好招人的 一门合适的语言会让创业团队减少招聘的成本,快速招到合适的人。
  • 选择能让人有兴趣的 与上面一点相关,让人感兴趣,在后面留人时有用。

2、选择合适的组件和云服务商

  • 选择靠谱的云服务商;
  • 选择云服务商的组件;
  • 选择成熟的开源组件,而不是最新出的组件;
  • 选择采用在一线互联网公司落地并且开源的,且在社区内形成良好口碑的产品;
  • 开源社区活跃度;

选择靠谱的云服务商,其实这是一个伪命题,因为哪个服务商都不靠谱,他们所承诺的那些可用性问题基本上都会在你的身上发生,这里我们还是需要自己做一些工作,比如多服务商备份,如用CDN,你一定不要只选一家,至少选两家,一个是灾备,保持后台切换的能力,另一个是多点覆盖,不同的服务商在CDN节点上的资源是不一样的。

选择了云服务商以后,就会有很多的产品你可以选择了,比较存储,队列这些都会有现成的产品,这个时候就纠结了,是用呢?还是自己在云主机上搭呢?在这里我的建议是前期先用云服务商的,大了后再自己搞,这样会少掉很多运维的事情,但是这里要多了解一下云服务商的组件特性以及一些坑,比如他们内网会经常断开,他们升级也会闪断,所以在业务侧要做好容错和规避。

关于开源组件,尽可能选择成熟的,成熟的组件经历了时间的考验,基本不会出大的问题,并且有成套的配套工具,出了问题在网上也可以很快的找到答案,你所遇到的坑基本上都有人踩过了。

3、制定流程和规范

  • 制定开发的规范,代码及代码分支管理规范,关键性代码仅少数人有权限;
  • 制定发布流程规范,从发布系统落地;
  • 制定运维规范;
  • 制定数据库操作规范,收拢数据库操作权限;
  • 制定告警处理流程,做到告警有人看有人处理;
  • 制定汇报机制,晨会/周报;

4、自研和选型合适的辅助系统

所有的流程和规范都需要用系统来固化,否则就是空中楼阁,如何选择这些系统呢?参照上个章节咱们那些开源的,对比一下选择的语言,组件之类的,选择一个最合适的即可。

比如项目管理的,看下自己是什么类型的公司,开发的节奏是怎样的,瀑布,敏捷的 按项目划分,还是按客户划分等等,平时是按项目组织还是按任务组织等等

比如日志系统,之前是打的文本,那么上一个elk,规范化一些日志组件,基本上很长一段时间内不用考虑日志系统的问题,最多拆分一下或者扩容一下。等到组织大了,自己搞一个日志系统。

比如代码管理,项目管理系统这些都放内网,安全,在互联网公司来说,属于命脉了,命脉的东西还是放在别人拿不到或很难拿到的地方会比较靠谱一些。

5、选择过程中需要思考的问题

技术栈的选择有点像做出了某种承诺,在一定的时间内这种承诺没法改变,于是我们需要在选择的时候有一些思考。

看前面内容,有一个词出现了三次,合适,选择是合适的,不是最好,也不是最新,是最合适,适合是针对当下,这种选择是最合适的吗?比如用 Go 这条线的东西,技术比较新,业界组件储备够吗?组织内的人员储备够吗?学习成本多少?写出来的东西能满足业务性能要求吗?能满足时间要求吗?

向未来看一眼,在一年到三年内,我们需要做出改变吗?技术栈要做根本性的改变吗?如果组织发展很快,在 200 人,500 人时,现有的技术栈是否需要大动?

创业过程中需要考虑成本,这里的成本不仅仅是花费多少钱,付出多少工资,有时更重要的是时间成本,很多业务在创业时大家拼的就是时间,就是一个时间窗,过了就没你什么事儿了。

三、基于云的创业公司后台技术架构

结合上面内容的考量,在对一个个系统和组件的做选型之后,以云服务为基础,一个创业公司的后台技术架构如图10所示:

[图10 后台技术架构]

参考资料

http://database.51cto.com/art/201109/291781.htm

https://zh.wikipedia.org/wiki/Kafka

https://prometheus.io/docs/introduction/overview/

http://deadline.top/2016/11/23/配置中心那点事/

http://blog.fit2cloud.com/2016/01/26/deployment-system.html


除了眼前的苟且,还有架构与远方。

介绍创业路上的技术选型和架构、大型网站架构、高性能高可用可扩展架构实现,技术管理等相关话题,紧跟业界主流步伐。

qrcode_for_gh_5d3f534e15fe_344 (1)