前言:
最近有好多人问我说:“George,怎样才能成为公司里的前线主力架构师,我现在在公式已经干了快五年了,现在还是一个默默无闻的程序员,我也通过很多种渠道来突破我现在瓶疾,但就是走不出来,技术也一直没有突破上去,我真的是没有办法了,通过朋友推荐介绍,说您这里可以解决我的技术瓶疾,所以我想请你帮我突破一下技术方面上的瓶疾。”
你们是否有也有类似这样的问题——“天天写业务代码的程序员,怎么成为技术大牛,开始写技术代码?”
今天,我和我之前一起共事的朋友,一起探讨出了这么一个结论:要怎样努力才可以成为公司主力架构师。
不管是开发、测试、运维,每个技术人员心里多多少少都有一个成为技术大牛的梦,毕竟“梦想总是要有的,万一实现了呢”!正是对技术梦的追求,促使我们不断地努力和提升自己。
然而“梦想是美好的,现实却是残酷的”,很多同学在实际工作后就会发现,梦想是成为大牛,但做的事情看起来跟大牛都不沾边,例如,程序员说“天天写业务代码还加班,如何才能成为技术大牛”,测试说“每天都有执行不完的测试用例”,运维说“扛机器接网线敲shell命令,这不是我想要的运维人生”。
我也是一位程序员,所以我希望通过以下基于程序开发的一些例子,帮助大家解决这些困惑。大道理是相通的,测试、运维都可以借鉴。
成为架构师的几个误区
第一:拜大牛为师
有人认为想成为技术大牛最简单直接、快速有效的方式是“拜团队技术大牛为师”,让他们平时给你开小灶,给你分配一些有难度的任务。
我个人是反对这种方法的,主要的原因有几个:
大牛很忙,不太可能单独给你开小灶,更不可能每天都给你开1个小时的小灶;而且一个团队里面,如果大牛平时经常给你开小灶,难免会引起其他团队成员的疑惑,我个人认为如果团队里的大牛如果真正有心的话,多给团队培训是最好的。然而做过培训的都知道,准备一场培训是很耗费时间的,课件和材料至少2个小时(还不能是碎片时间),讲解1个小时,大牛们一个月做一次培训已经是很高频了。
因为第一个原因,所以一般要找大牛,都是带着问题去请教或者探讨。因为回答或者探讨问题无需太多的时间,更多的是靠经验和积累,这种情况下大牛们都是很乐意的,毕竟影响力是大牛的一个重要指标嘛。然而也要特别注意:如果经常问那些书本或者google能够很容易查到的知识,大牛们也会很不耐烦的,毕竟时间宝贵。经常有网友问我诸如“jvm的-Xmn参数如何配置”这类问题,我都是直接回答“请直接去google”,因为这样的问题实在是太多了,如果自己不去系统学习,每个都要问是非常浪费自己和别人的时间的。
大牛不多,不太可能每个团队都有技术大牛,只能说团队里面会有比你水平高的人,即使他每天给你开小灶,最终你也只能提升到他的水平;而如果是跨团队的技术大牛,由于工作安排和分配的原因,直接请教和辅导的机会是比较少的,单凭参加几次大牛的培训,是不太可能就成为技术大牛的。
综合上述的几个原因,我认为对于大部分人来说,要想成为技术大牛,首先还是要明白“主要靠自己”这个道理,不要期望有个像武功师傅一样的大牛手把手一步一步地教你。适当的时候可以通过请教大牛或者和大牛探讨来提升自己,但大部分时间还是自己系统性、有针对性的提升。
第二:业务代码一样很牛逼
有人认为写业务代码一样可以很牛逼,理由是业务代码一样可以有各种技巧,例如可以使用封装和抽象使得业务代码更具可扩展性,可以通过和产品多交流以便更好的理解和实现业务,日志记录好了问题定位效率可以提升10倍等等。
业务代码一样有技术含量,这点是肯定的,业务代码中的技术是每个程序员的基础,但只是掌握了这些技巧,并不能成为技术大牛,就像游戏中升级打怪一样,开始打小怪,经验值很高,越到后面经验值越少,打小怪已经不能提升经验值了,这个时候就需要打一些更高级的怪,刷一些有挑战的副本了,没看到哪个游戏只要一直打小怪就能升到顶级的。成为技术大牛的路也是类似的,你要不断的提升自己的水平,然后面临更大的挑战,通过应对这些挑战从而使自己水平更上一级,然后如此往复,最终达到技术大牛甚至业界大牛的境界,写业务代码只是这个打怪升级路上的一个挑战而已,而且我认为是比较初级的一个挑战。
所以我认为:业务代码都写不好的程序员肯定无法成为技术大牛,但只把业务代码写好的程序员也还不能成为技术大牛。
第三:上班太忙没时间自己学习
很多人认为自己没有成为技术大牛并不是自己不聪明,也不是自己不努力,而是中国的这个环境下,技术人员加班都太多了,导致自己没有额外的时间进行学习。
这个理由有一定的客观性,毕竟和欧美相比,我们的加班确实要多一些,但这个因素只是一个需要克服的问题,并不是不可逾越的鸿沟,毕竟我们身边还是有那么多的大牛也是在中国这个环境成长起来的。
我认为有几个误区导致了这种看法的形成:
(1)上班做的都是重复工作,要想提升必须自己额外去学习
形成这个误区的主要原因还是在于认为“写业务代码是没有技术含量的”,而我现在上班就是写业务代码,所以我在工作中不能提升。
(2)学习需要大段的连续时间
很多人以为要学习就要像学校上课一样,给你一整天时间来上课才算学习,而我们平时加班又比较多,周末累的只想睡懒觉,或者只想去看看电影打打游戏来放松,所以就没有时间学习了。
实际上的做法正好相反:首先我们应该在工作中学习和提升,因为学以致用或者有实例参考,学习的效果是最好的;其次工作后学习不需要大段时间,而是要挤出时间,利用时间碎片来学习。
如何突破和避免以上几大误区
如何突破以上的误区,那就看你怎么学习,有没有一套系统化的学习体系给你学习,有没有一个学习氛围的群,有没有一群是遇到瓶疾一起突破的兄弟姐妹。有么??????我这里有。
我向大家推荐一下我认为比较全面且最系统化的学习体系(分解后的,完整的加群可以获取)
一、源码分析
二、分布式架构
三、微服务
四、性能优化
五、Java工程化
以上就是我推荐给大家的最具有系统化的学习体系,若果你想学习以上的知识内容,你可以加这个群获取:交流学习群:433-540-541里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
那么问题又来了,学完以上的课程体系后,就能成为公司主力架构师么?答案是:NO
要想成为主力架构师,还需知道以下知识
要想成为软件开发的专家,需要我们完整了解软件开发的流程,并在关键部分掌握丰富经验。
需要我们了解设计模式和算法的细微差别,同时遵循软件开发的最佳实践,包括创造性和思考力,为编程问题提供合适的解决方案。
实现这一目标需要掌握服务器端开发、客户端开发、DevOps运维、云计算、网页设计、分布式系统、数据库、编程规约、代码管理、基础设施管理、可扩展性、安全性待方面的能力。
你可能未必全部掌握以上内容。但是可以尝试从表层了解绝大部分内容,然后再深入掌握其中几个技术。
以下给各位列出开发者缺乏的几个主要技术能力,而技术管理者或架构师在招聘这些职位时应该熟悉检查这些要素。
编码规范
编码规范有助于确保良好的开发实践和产品开发。要了解一些最重要的编码规约:
DRY(不要重复自己),SOLID , TDD , 防御性编程
设计模式
设计模式在软件开发中是一种常见的,可重复使用的解决方案,可解决软件中的常见问题。软件开发者要了解一些常见的Design Partern是非常重要的,还有更重要的是要能够识别给定问题的正确设计模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流开发者使用的设计模式。
服务器端开发
在较复杂的软件系统中,后端会有各种各样的逻辑。作为后端开发人员,处理应该程序的业务逻辑就要面临很多挑战。任何开发人员都能够编写代码,但是只有有经验的开发人员才可以写出具有高性能、可伸缩性和可靠性都好的高质量代码。开发优秀软件的过程涉及的领域包括大量科学、数学、计算机等专业知识,有处理的思维和经验非常重要。
高速缓存
数据缓存的各种机制(文件、数据库、内存、反向代理、HTTP....)
内存管理
Java有一个非常好的垃圾收集器,能够自动管理内存,清理未使用的对象并释放一些内存。但是一个资深的Java开发者需要对内存的工作原因有一个非常透的理解,这样才能写出高性能和优化的应用程序。
了解以下概念至关重要:
堆栈,堆,强引用,弱引用,转义引用,如何引用字符串,垃圾收集过程,meta空间,垃圾收集器类型。
异常处理
这是一个相当重要,也是一个比较大的话题,我们后续会再写关于它的专门文章。现在,列出一些处理异常的一些良好实践:
1、遵循“错误优先”原则使软件更可靠
2、不要捕捉无法恢复的异常
3、不要记录完异常后,又将异常抛出来
4、选择正确的层来处理异常(例如:DAO不知道是数据库的故障如何处理,但是服务层可以知道)
5、如果无法从异常中恢复,则优先选择未经检查的异常
IO操作
了解I/O操作的成本以及可能出现的不可预知的结果。
异步编程
使用线程实现Java中的异步编程,它也是Java平台的基础部分,有效使用并发对于构建高性能应用程序非常重要。
比如线程池、死锁、生产者-消费者、原子性、不可变对象、信号量等等词汇对资深开发人员来说不应该是新东西。
批处理
在实际场景中,编写批量作业非常普遍。通常执行重要的任务,有一些基本规则:
1、每个任务应该按输入、处理过程与输出进行划分;
2、始终轮询批量输入数据;
3、处理器应该是线程安全;
4、产出物应该为原子属性;
5、存储工作结果;
6、要考虑EIP模式。
分布式计算
在现代世界中,分布式计算是指使用分布式系统来解决计算问题。然而,分布式系统与传统系统不同,具有非常高的复杂性。当用户开始高速增长资源消耗较大时,有分布式系统工作经验的工程师会在此时发挥作用。微服务软件体系结构是分布式计算以及分布式体系结构所有的优点与折衷的一个很好的例子。
而今,微服务是当今软件工程师之必备技能,就需要我们对分布式系统有丰富的经验。
比如容错性,可用性与一致性,分布式事务/事件、同步与异步通信,分布式认证,分布式应用,共识应用程序等非常重要。
数据库
精确掌握与数据库从通信到获取数据中要涉及的所有成本,如连接握手、数据传输等情况。清楚了解原子事务以及如何确保数据一致性。因此,数据库管理是软件开发人员的必备技能。
数据库用于管理数据,这是一项艰巨的任务,即使不考虑将业务逻辑添加到数据库中。 在大型IT系统中,数据库在安全性,可伸缩性,容量和可用性方面面临着诸多挑战。我们要考虑加密,复制,分片,大数据等问题。 了解数据库的工作方式以及如何优化它以及每项处理消耗的成本(例如,占用内存、CPU数)将有助于有效设计系统的数据库管理。
DevOps
主力开发工程师要有能推动DevOps的文化理念和实践的能力,在所有运维步骤中做到自动化,提高高质量和高速度交付应用程序与服务能力。代码部署或配置基础设施必须为自动化,且要灵活以及受到监控。
一个强大的开发者应该很好地了解从测试,发布到部署和基础架构管理的全开发生命周期。需要我们了解云计算,Linux,网络,容器,工程管理等。
代码管理
鉴于代码的重要性,只有主力开发人员才能够掌握代码生命周期,并力促软件工程最佳实践。 为此,需要你熟谙源代码管理系统,比如Git,对分支策略,版本控制,分布式修订控制,另外还有代码质量保证工具,代码间的通信和依赖管理,配置管理等有清晰的思维。
安全
Web安全是件很难处理的事情,一部分取决于许多外部参数; 软件工程师需要遵循构建安全Web应用程序的最佳实践与准则。
主力工程师需要对信息安全有较深的理解,不仅要如何避免构建不安全与容易受攻击的系统,还需要知道保护用户的隐私。
一个伟大的开发人员需要能够创建一个指南来处理前10个Web应用程序安全风险。 在Web应用程序中,我们有更多需要工程师关注安全威胁,其中包括如下:
1、上传文件检查;
2、密码暴力破解;
3、会话到期处理;
4、会话来源验证;
5、通过网络安全通信;
6、安全的Cookie访问;
7、用户凭证处理。
前端开发
前端开发是软件开发重要的一部分,如果您不知道程序设计与良好用户体验的关系,则不能成为主力软件工程师。
在前端世界中,Javas和CSS是软件工程师必备的。 在这两方面掌握掌握并不容易,但了解它们的工作方式以及两者如何与HTML连接一起,使我们能够提供出色的用户体验非常重要。
若要领导一个前端团队,你需要知道的不仅仅是如何建立一个漂亮布局,要想前端开发做得更好,你需要了解如下:
1、浏览器作为引擎可以构建什么?
2、如何开发响应式网站;
3、如何提高网站的性能;
4、如何开发单页面应用程序;
5、如何建设现代高效的发展环境;
6、熟悉HTML5 API。
7、熟悉React.js或Vue.js框架
为了掌握这些技能,开发人员需能够自我激励,主动学习新技术,并在职业生涯中给自己扣上很多帽子。 继而不断挑战自我,然后更好地解决问题,这就是编程的本质。 知识很重要,在某些复杂问题的情况下更是如此。在变化如此之快的IT技术领域中,知识的获取在任何时候比我们已会的技能更为重要。
需要学习,获取资料的也可以加下上面推荐的那个群,希望可以帮助在这个行业发展的朋友和童鞋们,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上。在这里顺便给大家推荐一个架构交流群:617434785,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。