阿里资深技术专家总结:要怎样努力才能够成为公司主力架构师

前言:前端

最近有好多人问我说:“George,怎样才能成为公司里的前线主力架构师,我如今在公式已经干了快五年了,如今仍是一个默默无闻的程序员,我也经过不少种渠道来突破我如今瓶疾,但就是走不出来,技术也一直没有突破上去,我真的是没有办法了,经过朋友推荐介绍,说您这里能够解决个人技术瓶疾,因此我想请你帮我突破一下技术方面上的瓶疾。”程序员

大家是否有也有相似这样的问题——“每天写业务代码的程序员,怎么成为技术大牛,开始写技术代码?”算法

今天,我和我以前一块儿共事的朋友,一块儿探讨出了这么一个结论:要怎样努力才能够成为公司主力架构师。shell

无论是开发、测试、运维,每一个技术人员内心多多少少都有一个成为技术大牛的梦,毕竟“梦想老是要有的,万一实现了呢”!正是对技术梦的追求,促使咱们不断地努力和提高本身。数据库

然而“梦想是美好的,现实倒是残酷的”,不少同窗在实际工做后就会发现,梦想是成为大牛,但作的事情看起来跟大牛都不沾边,例如,程序员说“每天写业务代码还加班,如何才能成为技术大牛”,测试说“天天都有执行不完的测试用例”,运维说“扛机器接网线敲shell命令,这不是我想要的运维人生”。编程

我也是一位程序员,因此我但愿经过如下基于程序开发的一些例子,帮助你们解决这些困惑。大道理是相通的,测试、运维均可以借鉴。后端

成为架构师的几个误区设计模式

第一:拜大牛为师浏览器

有人认为想成为技术大牛最简单直接、快速有效的方式是“拜团队技术大牛为师”,让他们平时给你开小灶,给你分配一些有难度的任务。缓存

我我的是反对这种方法的,主要的缘由有几个:

大牛很忙,不太可能单独给你开小灶,更不可能天天都给你开1个小时的小灶;并且一个团队里面,若是大牛平时常常给你开小灶,不免会引发其余团队成员的疑惑,我我的认为若是团队里的大牛若是真正有心的话,多给团队培训是最好的。然而作过培训的都知道,准备一场培训是很耗费时间的,课件和材料至少2个小时(还不能是碎片时间),讲解1个小时,大牛们一个月作一次培训已是很高频了。

由于第一个缘由,因此通常要找大牛,都是带着问题去请教或者探讨。由于回答或者探讨问题无需太多的时间,更多的是靠经验和积累,这种状况下大牛们都是很乐意的,毕竟影响力是大牛的一个重要指标嘛。然而也要特别注意:若是常常问那些书本或者google可以很容易查到的知识,大牛们也会很不耐烦的,毕竟时间宝贵。常常有网友问我诸如“jvm的-Xmn参数如何配置”这类问题,我都是直接回答“请直接去google”,由于这样的问题实在是太多了,若是本身不去系统学习,每一个都要问是很是浪费本身和别人的时间的。

大牛很少,不太可能每一个团队都有技术大牛,只能说团队里面会有比你水平高的人,即便他天天给你开小灶,最终你也只能提高到他的水平;而若是是跨团队的技术大牛,因为工做安排和分配的缘由,直接请教和辅导的机会是比较少的,单凭参加几回大牛的培训,是不太可能就成为技术大牛的。

综合上述的几个缘由,我认为对于大部分人来讲,要想成为技术大牛,首先仍是要明白“主要靠本身”这个道理,不要指望有个像武功师傅同样的大牛手把手一步一步地教你。适当的时候能够经过请教大牛或者和大牛探讨来提高本身,但大部分时间仍是本身系统性、有针对性的提高。

第二:业务代码同样很牛逼

有人认为写业务代码同样能够很牛逼,理由是业务代码同样能够有各类技巧,例如可使用封装和抽象使得业务代码更具可扩展性,能够经过和产品多交流以便更好的理解和实现业务,日志记录好了问题定位效率能够提高10倍等等。

业务代码同样有技术含量,这点是确定的,业务代码中的技术是每一个程序员的基础,但只是掌握了这些技巧,并不能成为技术大牛,就像游戏中升级打怪同样,开始打小怪,经验值很高,越到后面经验值越少,打小怪已经不能提高经验值了,这个时候就须要打一些更高级的怪,刷一些有挑战的副本了,没看到哪一个游戏只要一直打小怪就能升到顶级的。成为技术大牛的路也是相似的,你要不断的提高本身的水平,而后面临更大的挑战,经过应对这些挑战从而使本身水平更上一级,而后如此往复,最终达到技术大牛甚至业界大牛的境界,写业务代码只是这个打怪升级路上的一个挑战而已,并且我认为是比较初级的一个挑战。

因此我认为:业务代码都写很差的程序员确定没法成为技术大牛,但只把业务代码写好的程序员也还不能成为技术大牛。

第三:上班太忙没时间本身学习

不少人认为本身没有成为技术大牛并非本身不聪明,也不是本身不努力,而是中国的这个环境下,技术人员加班都太多了,致使本身没有额外的时间进行学习。

这个理由有必定的客观性,毕竟和欧美相比,咱们的加班确实要多一些,但这个因素只是一个须要克服的问题,并非不可逾越的鸿沟,毕竟咱们身边仍是有那么多的大牛也是在中国这个环境成长起来的。

我认为有几个误区致使了这种见解的造成:

(1)上班作的都是重复工做,要想提高必须本身额外去学习

造成这个误区的主要缘由仍是在于认为“写业务代码是没有技术含量的”,而我如今上班就是写业务代码,因此我在工做中不能提高。

(2)学习须要大段的连续时间

不少人觉得要学习就要像学校上课同样,给你一成天时间来上课才算学习,而咱们平时加班又比较多,周末累的只想睡懒觉,或者只想去看看电影打打游戏来放松,因此就没有时间学习了。

实际上的作法正好相反:首先咱们应该在工做中学习和提高,由于学以至用或者有实例参考,学习的效果是最好的;其次工做后学习不须要大段时间,而是要挤出时间,利用时间碎片来学习。

在此我向你们推荐一个交流学习群:685--1676--72 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

如何突破和避免以上几大误区

如何突破以上的误区,那就看你怎么学习,有没有一套系统化的学习体系给你学习,有没有一个学习氛围的群,有没有一群是遇到瓶疾一块儿突破的兄弟姐妹。有么??????我这里有。

我向你们推荐一下我认为比较全面且最系统化的学习体系(分解后的,完整的加群能够获取)

1、源码分析

2、分布式架构

3、微服务

4、性能优化

5、Java工程化

以上就是我推荐给你们的最具备系统化的学习体系,若果你想学习以上的知识内容,你能够加这个群获取:交流学习群:68-51-67-67-2 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

那么问题又来了,学完以上的课程体系后,就能成为公司主力架构师么?答案是:NO

要想成为主力架构师,还需知道如下知识

要想成为软件开发的专家,须要咱们完整了解软件开发的流程,并在关键部分掌握丰富经验。

须要咱们了解设计模式和算法的细微差异,同时遵循软件开发的最佳实践,包括创造性和思考力,为编程问题提供合适的解决方案。

实现这一目标须要掌握服务器端开发、客户端开发、DevOps运维、云计算、网页设计、分布式系统、数据库、编程规约、代码管理、基础设施管理、可扩展性、安全性待方面的能力。

你可能未必所有掌握以上内容。可是能够尝试从表层了解绝大部份内容,而后再深刻掌握其中几个技术。

如下给各位列出开发者缺少的几个主要技术能力,而技术管理者或架构师在招聘这些职位时应该熟悉检查这些要素。

编码规范

编码规范有助于确保良好的开发实践和产品开发。要了解一些最重要的编码规约:

DRY(不要重复本身),SOLID , TDD , 防护性编程

设计模式

设计模式在软件开发中是一种常见的,可重复使用的解决方案,可解决软件中的常见问题。软件开发者要了解一些常见的Design Partern是很是重要的,还有更重要的是要可以识别给定问题的正确设计模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流开发者使用的设计模式。

服务器端开发

在较复杂的软件系统中,后端会有各类各样的逻辑。做为后端开发人员,处理应该程序的业务逻辑就要面临不少挑战。任何开发人员都可以编写代码,可是只有有经验的开发人员才能够写出具备高性能、可伸缩性和可靠性都好的高质量代码。开发优秀软件的过程涉及的领域包括大量科学、数学、计算机等专业知识,有处理的思惟和经验很是重要。

高速缓存

数据缓存的各类机制(文件、数据库、内存、反向代理、HTTP....)

内存管理

Java有一个很是好的垃圾收集器,可以自动管理内存,清理未使用的对象并释放一些内存。可是一个资深的Java开发者须要对内存的工做缘由有一个很是透的理解,这样才能写出高性能和优化的应用程序。

了解如下概念相当重要:

堆栈,堆,强引用,弱引用,转义引用,如何引用字符串,垃圾收集过程,meta空间,垃圾收集器类型。

异常处理

这是一个至关重要,也是一个比较大的话题,咱们后续会再写关于它的专门文章。如今,列出一些处理异常的一些良好实践:

一、遵循“错误优先”原则使软件更可靠

二、不要捕捉没法恢复的异常

三、不要记录完异常后,又将异常抛出来

四、选择正确的层来处理异常(例如:DAO不知道是数据库的故障如何处理,可是服务层能够知道)

五、若是没法从异常中恢复,则优先选择未经检查的异常

IO操做

了解I/O操做的成本以及可能出现的不可预知的结果。

异步编程

使用线程实现Java中的异步编程,它也是Java平台的基础部分,有效使用并发对于构建高性能应用程序很是重要。

好比线程池、死锁、生产者-消费者、原子性、不可变对象、信号量等等词汇对资深开发人员来讲不该该是新东西。

批处理

在实际场景中,编写批量做业很是广泛。一般执行重要的任务,有一些基本规则:

一、每一个任务应该按输入、处理过程与输出进行划分;

二、始终轮询批量输入数据;

三、处理器应该是线程安全;

四、产出物应该为原子属性;

五、存储工做结果;

六、要考虑EIP模式。

分布式计算

在现代世界中,分布式计算是指使用分布式系统来解决计算问题。然而,分布式系统与传统系统不一样,具备很是高的复杂性。当用户开始高速增加资源消耗较大时,有分布式系统工做经验的工程师会在此时发挥做用。微服务软件体系结构是分布式计算以及分布式体系结构全部的优势与折衷的一个很好的例子。

而今,微服务是当今软件工程师之必备技能,就须要咱们对分布式系统有丰富的经验。

好比容错性,可用性与一致性,分布式事务/事件、同步与异步通讯,分布式认证,分布式应用,共识应用程序等很是重要。

数据库

精确掌握与数据库从通讯到获取数据中要涉及的全部成本,如链接握手、数据传输等状况。清楚了解原子事务以及如何确保数据一致性。所以,数据库管理是软件开发人员的必备技能。

数据库用于管理数据,这是一项艰巨的任务,即便不考虑将业务逻辑添加到数据库中。 在大型IT系统中,数据库在安全性,可伸缩性,容量和可用性方面面临着诸多挑战。咱们要考虑加密,复制,分片,大数据等问题。 了解数据库的工做方式以及如何优化它以及每项处理消耗的成本(例如,占用内存、CPU数)将有助于有效设计系统的数据库管理。

DevOps

主力开发工程师要有能推进DevOps的文化理念和实践的能力,在全部运维步骤中作到自动化,提升高质量和高速度交付应用程序与服务能力。代码部署或配置基础设施必须为自动化,且要灵活以及受到监控。

一个强大的开发者应该很好地了解从测试,发布到部署和基础架构管理的全开发生命周期。须要咱们了解云计算,Linux,网络,容器,工程管理等。

代码管理

鉴于代码的重要性,只有主力开发人员才可以掌握代码生命周期,并力促软件工程最佳实践。 为此,须要你熟谙源代码管理系统,好比Git,对分支策略,版本控制,分布式修订控制,另外还有代码质量保证工具,代码间的通讯和依赖管理,配置管理等有清晰的思惟。

安全

Web安全是件很难处理的事情,一部分取决于许多外部参数; 软件工程师须要遵循构建安全Web应用程序的最佳实践与准则。

主力工程师须要对信息安全有较深的理解,不只要如何避免构建不安全与容易受攻击的系统,还须要知道保护用户的隐私。

一个伟大的开发人员须要可以建立一个指南来处理前10个Web应用程序安全风险。 在Web应用程序中,咱们有更多须要工程师关注安全威胁,其中包括以下:

一、上传文件检查;

二、密码暴力破解;

三、会话到期处理;

四、会话来源验证;

五、经过网络安全通讯;

六、安全的Cookie访问;

七、用户凭证处理。

前端开发

前端开发是软件开发重要的一部分,若是您不知道程序设计与良好用户体验的关系,则不能成为主力软件工程师。

在前端世界中,Javas和CSS是软件工程师必备的。 在这两方面掌握掌握并不容易,但了解它们的工做方式以及二者如何与HTML链接一块儿,使咱们可以提供出色的用户体验很是重要。

若要领导一个前端团队,你须要知道的不只仅是如何创建一个漂亮布局,要想前端开发作得更好,你须要了解以下:

一、浏览器做为引擎能够构建什么?

二、如何开发响应式网站;

三、如何提升网站的性能;

四、如何开发单页面应用程序;

五、如何建设现代高效的发展环境;

六、熟悉HTML5 API。

七、熟悉React.js或Vue.js框架

为了掌握这些技能,开发人员需可以自我激励,主动学习新技术,并在职业生涯中给本身扣上不少帽子。 继而不断挑战自我,而后更好地解决问题,这就是编程的本质。 知识很重要,在某些复杂问题的状况下更是如此。在变化如此之快的IT技术领域中,知识的获取在任什么时候候比咱们已会的技能更为重要。

相关文章
相关标签/搜索