别让自己“墙”了自己(转载)

这一两周与几个朋友聊天,有年轻的90后,也有大叔级的70后,这些人在我看来都是很有能力的人,但是一些喜好过于强烈,让我不经意地回顾了我工作20年来身边的人,有发展得好的,也有发展的不好的,有些人是很可惜的,因为限制他们的不是其它人,也不是环境,而是自己,所以,很想写下这篇文章。(注:这篇文章可能会是一篇说教的文章,所以,可能会让你看着犯困,所以,我会尽量地短一些,而且尽可能多讲故事,少道理,这里的故事,全是真实发生的)

几个故事

2019年年初,我面试了一个很年轻的小伙子(93/94年出生),这个小伙子特别有灵性,也很聪明,计算机专业出身,也很喜欢技术,基础和学习能力也很好。在我这20年来认识的人中,如果他能呆在北京、上海、深圳这样的城市,我保证不出三年,他会成为他们同龄人中非常出色的技术人员,如果有个好的舞台有一个好的团队带他,他的未来会非常成功。然而,这个小伙子有两大喜好:1)只愿(或是说被迫)呆在一个毫无IT的环境的三/四线城市,2)对技术有非常大的偏好,只喜欢Go语言,非常不喜欢其它的语言,比如:Java(离开Java的世界,基本上离开了做架构的世界(相关解释见文末))。

他的这两个喜好,足以让一个未来会很优秀的人毁掉,因为,这个时代没有限制他,他的能力也没有限制他,但是他的意识完完全全地限制了他。

  • 他把自己最宝贵的青春放在了很烂的项目上,就算能用一些新的技术,他也只能算是自娱自乐,在实验室中玩玩具罢了。
  • 他把自己的技术栈封闭起来,而直接放弃了这个时代最具工业化的技术Java,对于一个好的程序员来说,同时掌握几门语言和技术完全是没什么问题,但是自己封闭了自己的视野。

实在是非常可惜,我本来是可以为他介绍到一些很不错的公司的,但是他这样的习性,等于自己把自己未来的门给关上了,虽然我跟他长谈过,但是我也没有办法叫醒不想醒的人……

  • 视野、环境和舞台,对一个人的限制是非常大的。井蛙不知道大海,被空间维度所限制;夏虫不知道冬天,是被时间维度所限制;圈养的动物没有斗志,是被自己意识所限制。
  • 偏见和不开放,对一个人的限制是真正有毁灭性的。主动让自己成为一个瞎子和聋子,主动把自己的能力阉割掉,这是一件令人痛心的事。想想大清的闭关锁国是如何让亚洲第一的北洋水师给毁掉的……

我还有个同学,他的技术并不差,就算呆在昆明这种很落后的地方,他也非常地好学,学习英文,学习各种新技术,对技术没有任何的偏好,喜欢C/C++/Java/Python/Shell,同样喜欢前端Javascript,对基础知识非常地踏实,他在技术上没有限制自己的潜力,有什么就学什么。后来,我带他玩Docker/Go/K8S……分布式架构,他也上手的很快……像他这样的人,技术能力完全没得说,比我还大一岁,44岁了,还是一样的天天追代码细节,看Youtube的各种大会,翻github里的各种issue和pull request……

我同学这人,拥有了成为一个技术牛人几乎所有的条件:基础知识过硬,细节扎得深,面很广,学习能力强,有英文能力,逻辑思维能力不错,非常的自律,执行力也很强,抓得住重点……然而,只有一个小问题,就是没有到大公司历练过,我三番五次叫他从昆明出来,但是最终他都呆在昆明这个城市没有出来,因为有所谓的家庭约束。然而,我身边还有好些人,把自己家从北京搬到上海,从上海搬到深圳,从厦门搬到深圳……这样的人大有人在……像他这样的能力,在哪个公司都会是主力和骨干,对于一个公司的主力和骨干来说,家庭上的这些问题都是小问题都是有很多解的……

另外,我这个同学还是一个比较悲观的人,任何事情都是先想到不好的事,他关注负面的东西会胜于正面的东西,而且他还有一定的社交恐惧,怕与人相处和交流,时间越长越害怕,甚至有时候直接跟我说,“我就是不想改变”这样的话……其实,我以前也是一个很害怕与人交流的人,面试的时候,我根本不敢正眼看面试官一眼,也不知道与人怎么交流。但是,我与他不一样,我努力克服,不断地面试,与人面对面的交流,到一线技术客服接用户的电话,在公司里做分享,慢慢地到外面分享……3-5年就完全克服掉了。

其实,很多事情,完全是有解的,也没有必要担心,自己的心理障碍也是可以克服的,重点就是自己愿不愿意,只要愿意完成了一半,接下来就是不断的摸爬滚打坚持了。

  • 不限制自己的人,会穷举各种方法来解决问题,限制自己的人,只会找各式各样的问题或借口。
  • 不限制自己的人,会努力改变自己的问题和缺陷,限制自己的人,会放任自己。

另外几个故事

我还有另外几个故事(活到四十多,能看到好多人十几年的发展过程,感觉有点上帝视角了)

我还有一个以前团队里的一个小伙,人是很聪明,但就完全就是野路子,他对技术没有什么偏好,一个PHP程序员,做那个Discuz!论坛,公司被并购了,转成Java,开始研究Java的各种细节,对技术从来没有什么偏见,有什么就玩什么,每做一个项目,就算是一样的他都要用新的技术做一遍,然后跟着我做云计算,我教他TCP,教他C/C++,后来一起玩Docker/Go,等等,反正是一点就通,他是我见过学习能力最强的人。但是,有一个事他一直与我的想法不一样,就是我希望他先把软件设计好,再写代码,他非常不能理解,他习惯于直接动手开干,然后有什么问题就整什么问题,我也很难教育他。

有一天,他电话面了一下Facebook,电话面了15分钟后对方就放弃了,他受到了严重的打击。然后,他就开始找菲利宾人练英文口语了,我也让他做算法题,然后,他才发现,一道连算法都不是的纯编程题都提交几次都过不了,等他做完了Leetcode最初的那151道题后,整个人都改变了,写代码前认认真真地在纸上把程序的状态,处理时序以及可能遇到的一些条件先罗列出来,然后,进行逻辑设计后,再写,从此,他就开启他更大的天地了。我后来把他推荐给了微软,先在中国的Bing,在中国升好2-3级,然后去了美国的Azure,现在听说他准备要跟 k8s 的 co-founder Brendan Burns 混了(虽然,他现在还在印度人手下,但是,我真的不知道他未来能玩多大,因为今年他才33岁,而且非常聪明)

他以前是把自己封闭起来的,我叫他出来,他也不出来,后来因为一些办公室政治的原因不得不来找我,于是我就带着他玩了两年,跟他讲了很多外面的世界是怎么玩的,他这个人也是一个相当不善于社交的人,但是心是开放的,愿意接受新的东西,虽然对技术也有一定偏见,比如不喜欢Windows,但是也不会不喜欢到完全封闭。后来我跟他说,微软的技术相当的强的,你看到的技术只是表面,深层次的东西都是相通的,直到他到了微软后发现各种牛逼的东西,对微软系统的技术的态度也有了改变,而且我让他跟我说很多微软那边的事,我发现,他对技术了解的维度已经是越来越高级的了……

还是我以前团队的一个小伙,他是一个前端,他说前端的东西没什么意思,想来找我做后端,我也一点点带他……后来,我说,你如果想要玩得好,你必需来北京,无论现在你觉得过得有多好,你都要放弃掉,然后,尽最大可能出去经历一下世界最顶尖的公司,我甚至跟他说,如果他女朋友不跟来的话,就先分开一段时间,先自己立业,他来北京的时候,他之前的同事都等着看他的笑话,我说,那些人连想都不敢想,不必管他们。于是,他去了Amazon,再过了一年去了西雅图,我跟他说,接下来就是去AWS,然后,如果有足够的野心,用自己的年轻这个资本去硅谷创业公司赌一把……未来他怎么样我不知道,但至少他没有限制自己,他的未来不会有封顶……

也是我的同学,我跟他在大学是上下铺,后来他去了人民大学读计算机博士,大学的时候做国产数据库kingbase,然后去了一家外企,天天被派到用户那边做数据分析,后来,他想回科研单位做国产数据库,我说,别啊,你的技术比我好太多,还有博士理论加持,你不去国外顶尖公司玩玩,你不知道自己有多强的,于是他跟公司申请去了国外做核心,后来因为Hadoop的原因,公司的产品最终成为了历史,于是我说,你来了美国么,你一定要去AWS,于是他就去了AWS的Aurora团队,成为了AWS明星级产品的中坚力量,天天在改MySQL的核心源码,干了两年,正在晋升 Principal Software Engineer ……

这里我到不是说出国有多牛,也许你只关注能挣多少钱,但是我想说,他们之所以能有这样的际遇,除了他们本来就有实力,还更因为他们从来不给自己设制什么限制,就是那种“艺多不压身”,有什么就学什么,有更高的就去向更高的迈进,其它的像家庭什么的问题其实都是会有解的,真的不必担心太多……

 别限制了自己

上面的这些故事,也许你能看得懂,也许你看得不一定能懂,这里,让我来做个总结吧

  • 做有价值的事。这个世界对计算机人才的要求是供不应求的,所以,不要让自己为自己找各式各样的借口,让自己活在“玩玩具”、“搬砖”和“使蛮力加班”的境地。其实,我发现这世界上有能力的人并不少,但是有品味的人的确很少。所谓的有价值,就是,别人愿付高价的,高技术门槛的,有创造力的,有颠覆性的……
  • 扩大自己的眼界,开放自己的内心。人要变得开放,千万不要做一个狭隘的民族主义者,做一个开放的人,把目光放在全人类这个维度,不断地把自己融入到世界上,而不是把自己封闭起来,这里,你的英文语言能力对你能不能融入世界是起决定性的作用。开放自己的心态,正视自己的缺点,你才可能往前迈进。你的视野决定了你的知不知道要去哪,你的开放决定了你想不想去
  • 站在更高的维度。面的维度会超过点的维点,空间的维度会超过面的维度,在更高维度上思考和学习,你会获得更多。整天在焦虑那些低维度的事(比如自己的薪水、工作的地点、稳不稳定、有没有户口……),只会让你变得越来越平庸,只要你站在更高的维度(比如: 眼界有没有扩大、可能性是不是更多、竞争力是不是更强、能不能解决更大更难的问题、能创造多大的价值……),时间会让你明白那些低维度的东西全都不是事儿。技术学习上也一样,站在学习编程语法特性的维度和站在学习编程范式、设计模式的维度是两种完全不一样的学习方式。
  • 精于计算得失。很多人其实不是很懂计算。绝大多数人都是在算计自己会失去多少,而不会算会得到多少。而一般的人也总是在算短期内会失去什么,优秀则总是会算我投入后未来会有什么样的回报,前者在算计今天,目光短浅,而后者则是舍在今天,得在明天,计算的是未来。精于计算得失的,就懂得什么是投资,不懂的只会投机。对于赚钱,你可以投机,但是对于自己最好还是投资。
  • 勇于跳出传统的束缚。有时候,跳出传统并不是一件很容易的事,因为大多数人都会对未知有恐惧的心理。比如:我看到很多人才都被大公司垄断了,其实,有能力的人都不需要加入大公司,有能力的人是少数,这些少数的人应该是所有的公司share着用的,这样一来,对于所有的人都是利益最大化的。这样的事现在也有,比如:律师、设计师……。但是,绝大多数有能力的技术人员是不敢走出这步。我在2015年到2016年实践过一年半,有过这些实践,做“鸡”的比“二奶”好多了,收入也好很多很多(不好意思开车了)……

庄子说过几句话——

井蛙不可以语于海者,拘于虚也;//空间局限

夏虫不可以语于冰者,笃于时也;//时间局限

曲士不可以语于道者,束于教也。//认识局限

别自己墙了自己,人最可悲的就是自己限制自己,想都不敢想,共勉!

————————————————————

注:这篇文章就是要劝大家更为开放,让自己有更多的可能性,能到更高的层次,做更有价值的事,成为更强更好的人……当然,如果你觉得你只想做一个平凡人,也和本文并不冲突……另外你也不要觉得这篇文章是让你要成为一个精英,但你一定要去摸高……这篇文章是告诉你一种面对人生的思考方式,在这种思考方式下,你会有更多的可能性,更大的场景……而不是直接把自己归到“平常人”,把自己“墙”了!

注:我以为用Java适合做架构这事应该是常识了,但是评论中有很多人非常反对这个事。那我解释一下吧:首先,小型的项目用什么语言都行,爱用什么用什么。但是,真正的企业级架构就不一样了,其中并不仅仅只是RESTful API或RPC,还有各种配套设施和控制系统,比如:应用网关,服务发现、配置中心、健康检查、服务监控、服务治理(熔断、限流、幂等、重试、隔离、事务补偿)、Tracing监控、SOA/ESB、CQRS、EDA……这些东西在非Java的技术栈体系内,很难看到全貌,Java强大的生态环境,就是让你把注意力放到更高层次的架构和业务上来的。(千万不要觉得,整几个服务RPC一下,加个缓存,加个队列,就能叫架构,那只是系统集成罢了)

(全文完)

转载自:https://coolshell.cn/articles/20276.html

架构师设计大纲

哪些项目必须写设计文档

DEV工作量大于等于2PD的项目必须写设计文档,建议所有项目都根据设计大纲确认一下有没有问题。

设计的坏味道

线上频繁执行SQL来修复问题

有大量的JSP后门

机制和策略不分离,任何修改都牵一发而动全身

设计大纲

按照项目研发流程设计

需求解析

分析相关方、计算收益,定义评估方法

描述背景、要解决的问题

名词及术语定义

总体设计

技术选型:涉及技术选型,需要对比候选方案的优缺点,特别要关注一个技术方案的缺点自己是否可以接受。

确定边界:系统边界、代码边界、接口边界等

确定交互流程:

  • 交互流程划分:业务交互流程、系统交互流程、模块交互流程
  • 交互流程检查点:一致性、性能
  • 策略算法相关功能:需要画出流程图

结构设计:

  • 逻辑结构:数据模型、时序模型、状态机模型;
  • 物理结构:DB;
  • 部署结构:分析依赖关系,后续要根据以来关系来撰写上线步骤

详细设计

存储设计:

  • 抽象出业务实体
  • 画出实体之间的ER关系图
  • 定义表结构,写出MySQL scheme变化
  • 考虑数据如何初始化

接口设计:

  • 接口组成:存储层接口、模块间接口、系统间接口
  • 接口应该抽象一组能力,良好的设计应该做到“机制和策略分离”,而接口应该承担分离的职责
  • 接口变化需要检查是否有兼容性问题

类图:类描述业务实体,需要描述清楚类之间的关系;类图的设计可以参考各种设计模式,

测试设计

可测性:尽量减少对环境的依赖,确定自测方法;策略算法相关的功能,需要提前想好如何获取数据、如何度量好坏;

测试范围:写明项目的影响面、确定测试范围。测试范围评估不准,会影响自测质量,进而导致联调时间偏长、QA测试时间偏长、QA测试评估不充分导致质量偏低。

测试用例:包括单元测试用例、接口测试用例、系统测试用例、面向C端的用例等

发布流程

写上线步骤:包括上线步骤、回滚步骤(必须和上线步骤相反,每一步都需要有回滚方案)、线上检查方法、应急方案(回滚或者降级);要重点检查兼容性。

上线前评估:上线时间(上线要评估对业务的影响,进而决定可行的上线时间)

阿里技术三板斧:可灰度,可监控,可回滚。

按照系统层次结构设计

存储设计

  • 抽象出业务实体
  • 画出实体之间的ER关系图
  • 定义表结构,写出MySQL scheme变化
  • 考虑数据如何初始化

API设计

构成:API可以划分为存储API、模块间API、对外API

方法:建议使用OOA、DDD等设计方法;一个良好的接口应该描述一组能力,可以尝试使用一句话来描述接口的能力。

模块设计

根据API粒度,按照服务原则,规划模块及模块关系

流程设计

  • 交互流程划分:业务交互流程、系统交互流程、模块交互流程
  • 交互流程检查点:一致性、性能
  • 策略算法相关功能:需要画出流程图

系统结构设计

  • 逻辑结构:数据模型、时序模型、状态机模型;
  • 物理结构:DB;
  • 部署结构:分析依赖关系

关键检查点和设计组成

工作量拆分

性能:

  • 存储性能:选择DB、设计表结构、设计Cache机制
  • 接口性能
  • 吞吐量
  • 数据规模

一致性:

  • 数据一致性:事务处理是否正确,是否涉及分布式数据一致性,是否需要分布式事务
  • 并发处理:锁、幂等机制等

监控

附录:设计流水账

  1. 明确交互流程:系统之间、业务、模块
  2. 交互流程关键节点:一致性、性能
  3. 底层API(对外、存储)、DB数据库设计(实体关系、scheme-SQL)
  4. 对现有系统影响范围,评估、应对方案
  5. 详细设计:接口、前端接口、类图
  6. 发布流程:兼容性、上线步骤、历史刷数
  7. 数据:增加字段如何处理,如何刷数据
  8. 用例Case(C端)
  9. 上线前前评估:吞吐量、性能、时间、数据规模
  10. 涉及状态:状态机
  11. 测试要点:TestCase、单元测试Case、自测方法、测试范围(事后用联调、QA测试状况来评估)、可测性(免环境)
  12. 业务模型、模块、层次图
  13. 工作量拆分
  14. 背景,要解决的问题
  15. 采用的代码设计模式
  16. 监控
  17. 性能(核心API)
  18. 边界:系统、代码、接口
  19. 拆出来提测文档
  20. 需求解析
  21. 逻辑结构:数据模型、时序模型、状态机模型;物理结构:DB;部署结构:依赖=>上线步骤
  22. 线上检查方法
  23. 事务:特例考虑分布式事务
  24. 数据处理方式:DB、Cache;一致性处理
  25. 并发处理:锁、幂等操作
  26. 发布考虑:监控、灰度、应急方案(回滚、降级)
  27. 技术选型:对比优缺点
  28. 数据模型
  29. 策略算法:需要画流程图
  30. 名词定义、术语
  31. 相关方、利益(收益)
  32. 问题:代码与设计不符
  33. 线上问题度量:线上执行SQL刷数据次数、JSP后门执行次数、蜂利器任务提报问题数量
  34. API类别:存储、对外、模块间
  35. API设计之前:先一句话描述

关于寻找目标市场的思考

最初是什么想法呢。。。。。。。。
多级市场划分。
划分的维度是多方面的,比如城市等级,大小,经济,人口等。任何一项事务,扩散总是有一个过程的。多数情况下,都是由大城市发起或者由国外流入国内一线大城市,然后逐渐再扩散到二线三线直至到四五线城市。
由于身处大城市,虽然不是说随时随地都是在关注最前沿的流行的东西,但是毕竟耳濡目染,身边环境所致,还是能够意识到一些东西。尤其是逢年过节什么的,从一线城市回到家里的时候,你会觉得家里的这份“土”,其实就是潮流扩展的过程所体现出来的现象之一。
所以节假日什么的,也是二三四线城市与大城市交流沟通和打通的手段了。通过这时候从大城市到小城市的人员流动,从而促进了二三四线城市的潮流推进。
反过来说,经常在一二线城市与三四五线城市之间走动,也应该会更容易发现不同级别城市之间的差异,发现二三四五线城市的发展趋向,预见其发展潮流,从而发现其中的商机。
想要利用这个过程,就是主动去发现,然后主动去学习,效仿大城市的内容、潮流,然后带到二三线城市里去。从中应该能赚到一些潮流红利。
降维打击
对,这就是降维打击。用一种几乎已知未来的方式来操控更低维度城市的发展过程。就跟使用互联网打击传统行业一样。
三四五线城市居民的特点
根据一些已经在这个市场上火起来的应用来分析一下吧。目前已经火到大城市也能看到、知道的产品和市场,有这么几个:

  • 抖音,快手
  • 拼多多
  • 趣头条
  • 今日头条

这几个是已经十分火爆的,并且在一线城市都已经有了相当知名度的产品。他们瞄准的基本都是二三四五线的用户。甚至比较火的一些小程序,公众号等,做的也是这方面的内容,但是因为整体平台并不是这个定位,所以先不放这部分。对于今日头条是否列入这里也稍微存在争议,不过因为头条使用的推荐算法,是你越看什么,就越给你推荐什么的。所以针对二三四线城市,就会针对他们推荐他们这个市场自己关注的内容,也算是一种吧。
其他几款就不一样了,基本就是专门针对这个市场做的。
大致总结一下面对人群的特点:

  • 空闲时间多
  • 看中小利益,容易被低额小利吸引
  • 传播成本低,喜欢噱头
  • 乐于扩散

目前还有哪些东西可以在这样的市场上搬运和投放呢?思考一下,回头写。