Java架构师笔记丨深入谈谈架构师,以及架构师该掌握的技术-巴分巴秒

架构师是一个充满挑战的职业,知识面的宽窄往往决定着一个架构师的架构能力,所以在这一点上我比较赞成你的学习方式,就是要阅读大量的技术书籍,但我希望你不要仅限于软件相关的书籍,经常泡技术论坛,一方面可以结交朋友,一方面可以增加自己的知识面。

公司的大小往往决定了所做的项目规模,一般的大项目不太可能直接总包给小公司去做,但这并不妨碍小公司可以分包到大项目的一部分。在做小项目的同时也可以积累丰富的经验,我自己就是一个这样的例子。

我在小公司混迹了5年多,其中也偶尔有1两个大公司,比如三一重工,但是基本上都是小公司,从基层的程序要到公司的开发总监都做过,甚至自己还设计过包括LED显示屏,密码键盘在内的收费系统,自己联系厂家OEM,当然这些今天已经广泛应用了,当时我们的客户用上之后还是非常震撼的。

知识面的宽广对于一名出色的架构师来说是必不可少的技能,也许很多人对架构的理解还停留在设计模式,重构,SOA等等的软件层面,然而这仅仅是非常基本的东西,架构师的脑子里不光需要知道让软件如何高效的运行,还需要知道如何去结合网络,存储,甚至一些文件系统的特性,比如GFS,NFS,XFS,NTFS等等,而且架构师还需要知道一些编程语言的特性,C,C++,Java,PHP,Python,Lisp,JS等等,现在是一个混合编程的时代,只了解一种语言,即使再精通也会使你在架构系统的时候受到很大的局限性。

再有一点,架构师需要对数据库技术有深刻的认识,因为现今是一个信息时代,大量的信息都是需要存储并检索的,数据库设计的不好,将会严重影响系统的性能,而这一点往往会被我们的设计人员忽略,他们只知道遵守那些范式而不会结合数据的特性去设计数据库。

看你的编程情况,你好像做PHP开发比较多,PHP比较适合B/S结构的应用开发,这会限制一个架构师的思路,我建议你再学习一门适合做C/S开发的语言,拓宽自己的视野。

从一个程序员到架构师是一个很大的变化,架构师需要从大的方面考虑,而不只是考虑这个模块该用哪种设计模式去开发。不能急于求成,也许是我自己变化的比较慢,我用了10年的时间,这10年里,我使用超过一年的编程语言包括了delphi,C++,Java,python,使用的数据库包括了oracle,infomix,sybase,sqlserver,mysql,javadb,sqlite等等,使用过大型机,小型机,服务器。unix,linux,windows都至少做过两年以上的开发,这些使用和开发的经历会大大增强一个人在做架构师这个职业时的技术素养。

Java程序员应该掌握的技术

1.通信协议

各个子系统之间要进行通信,必须要选择一种或多种通信协议,现代比较常见的都是基于HTTP的协议。更早期,为了追求性能,有过一些基于TCP协议的实现。建议还了解下CORBA等RPC方式。了解更多协议对于学习安全也有很大帮助,比如MySQL和PostgreSQL的协议都有安全的设计。

  1. 序列化

系统之间通过网络传输,或者存储到文件时,肯定只有一种格式,就是字符串。要将复杂的数据结构与字符串之间进行转换,就需要用到序列化。简单的序列化如JSON和XML,稍微复杂些的有protobuf、thrift等。需要了解所有这些序列化方式之间的优势和劣势。比如JSON和XML只能用于传递数据,而protobuf与thrift还可以用来做RPC协议。至少要确保每种序列化方式都自己尝试过hello world。

  1. 数据库

要形成自己的数据库选取风格,就需要先对自己常用的数据库有足够深入的了解。对于关系式数据库,除了一般的Create、Query、Delete、Update操作外。还需要能自行建立索引,数据库的平行扩展,了解如何进行性能调试。以及了解常见查询操作的性能级别,常见的查询性能瓶颈点。一个较好的例子是 ‘SELECT COUNT(*) FROM table WHERE dt_create-86400>NOW();’ 。
4. 存储

存储分为几种类型。NAS等各家产品有所不同,大多是通过NFS来访问的,这个不必多讲。问题是NAS的价格很高,而且在去IOE的趋势中很多人也不愿意再用。所以经常会有基于文件系统建立小规模存储的需求。要关注的点主要就是每个目录下的文件数不应该太多,当一个目录下文件数(实际是inode数量,包括文件和目录)超过1000时,性能就很差了。所以建议的做法是将一个系统中要存储的对象ID做16进制,随后每2位16进制做成一级目录。这样可以确保每个目录下的文件数不会超过256个。现代云计算,如Amazon S3已经把存储的问题解决的很好了,如果可能,尽量用好。

  1. 应用框架

此事在各个语言之间各有选择,多注意了解自己关注方向的所有框架的优势和劣势。至少当有个毛头孩子问你为什么不选择某个最新的框架时,要有自己的观点来给出明确的答复。对于常见的框架,十分推荐自己重新实现一个来当作锻炼。实现一个WEB框架,他用了不到200行代码就实现了。

  1. 接口

主要是指接口协议,或者RPC协议。系统之间进行RPC调用很常见,注意选择个自己能熟练使用的,并且有所深入研究。并了解其常见的限制。RESTful API就是个比较常见的选择,但是性能并不好。要自己对性能等参数有个量化的了解,而不是简单的一句好或不好。短连接接口在三次握手时是串行操作,要了解其为何耗时。

除了要在如上的各种不可或缺的组成部分中有所了解,还要能清楚的知道一些常用系统模块的原理,并能够很深入的玩起来。几个值得注意的:

  1. HTTP服务器:常见的无非是nginx、apache,自己要能进行基本配置,包括静态文件、fastcgi转发等

  2. 关系式数据库:常见的如mysql、postgresql、sqlite,自己要对每一种都有深入的了解。自己要做一遍常见操作的性能测试,并能牢记于心。比如sqlite虽然并不需要走网络,但是实际查询性能是很差的。我2008年就发现其 '<‘和’>'共同作用的查询的例子比走网络的mysql还慢了几十倍。

  3. NoSQL数据库:memcache、redis、mongodb等,近几年有很多,挨个了解下其实现原理,以及各种常用操作的性能。当有需要时,要随时能拿得出手来用。

  4. 云计算平台:几种常见的云计算平台的应用方式要有了解,如Google的资源方式,和Amazon的VPS方式,每种云计算平台往往还会提供一大堆的附加服务,比如可靠数据库,存储,缓存等,也要分别有所了解。

  5. 加密/签名技术:常见如truecrypt、openssl、gnu pg、sha1、md5、scrypt等,了解各种加密/签名技术的安全性,字长等,并都能自己做过hello world。

一些网上常见的系统服务形式的架构设计也要仔细了解清楚。一般此类系统的开发人员,往往会通过个人博客,或者一些活动的PPT中进行讲解。仔细找找会有不少收获。值得关注的常见系统架构

  1. 博客/论坛:博客和论坛有很多,并且各个网站也都很常用,了解下其原理,最好自己写个练习下。

  2. 微博:Twitter/weibo等,涉及到大量的联表查询,需要用多种办法来优化查询性能。

  3. 云计算:云计算的几个常见平台的服务提供方式,如Google和Amazon的,如果精力够用最好了解下OpenStack等搭建私有云的方式,总的来说,这是未来的大方向。

  4. 视频播放:在网页上播放视频的技术,包括基于Flash和HTML5的,各种浏览器对视频的兼容性等,了解通过ffmpeg将一个视频转换为标准mp4(HTML5可以播放的)的方式和参数

  5. CDN:了解应用CDN的方式,包括拆分静态文件的域名,静态文件版本化,Cookie拆分等相关技术

  6. OAuth:与其他网站联合认证的方式,有多种,分别了解。

常见的架构设计陷阱:

  1. 用户认证:一开始就应该花大精力设计好用户认证系统,包括不要明文存储密码,包括严格限制Cookie和Session的使用,包括用户认证信息的缓存等。如果需要设计一个长期运行的大系统,强烈建议使用签名来保证Cookie的不可伪造,同时常见信息直接存储Cookie,这样可以避免每次Request都访问数据库。

  2. 静态文件存储:如果一开始就将静态文件与主站内容混杂在一起,未来就是个灾难,具体参考CDN的应用方式。

你可能感兴趣的:(编程语言,企业架构,Spring,Cloud,JavaSE,大数据,Spring,Boot,Java架构师笔记)