程序员架构师在天津哪个区好找工作?

对工作多年的程序员而言,日后的职业发展无非是专精技术,转型管理,晋升架构师三种选择。成为一名优秀的架构师,是大多数技术人的追求。想要做架构,空有一身技术是远远不够的,知识的深度和广度,往往会决定一个架构师的架构能力。而这些知识,从你踏入IT行业那一刻起,甚至更早就应该开始储备了。那么到底什么是架构师?如果有一天把你丢到架构师的位置上你会怎么做?做什么呢?以下来具体阐述下一些看法和建议!

先看看IT市场对于架构师的职位要求:

系统性,知其然知其所以然。是某一个领域的专家,在专业领域具备一定的预见性,可独立领导跨部门的项目。

具备较高复杂度的(项目如链路较长/模块复杂度较高/风险较大/发布周期较紧/技术驱动等任意两项及以上)的PM经验和能力。

开发语言技能及架构能力:

1、可以写出比较优秀的代码,能够基于设计原则及模式掌握代码演变的方向和节奏;具备技术攻坚的能力;

2、具备高复杂度的平台/框架/业务系统技术与架构设计能力,掌握常见的架构设计方法和模式,理解大型网站所需要用到的架构和技术;

3、熟悉业务的价值、特点及对系统的要求,掌握领域建模的方法,可以对业务进行必要的抽象,并推进技术实现;

4、能够负责复杂度高,平台级产品或跨团队的产品架构,系统设计和实现。

1、行业开发:开发熟悉自己直接负责的及上下游相关的业务,关注业务发展相关的数据并能有效的分析解读;

2、平台开发:熟悉所在业务域,并且负责核心业务目标的分解&落地;能够把纵向行业需求落地为横向产品化形态;

3、在业务及产品规划方面有自己独立的思考,能够影响业务及产品的发展方向。

1、在所处的业务线具有广泛的影响力,对相应涉及的技术和业务都能有足够的公信力;2、具备辅导他人的能力和技能,有良好的分享习惯,对团队有正向影响和帮助。

架构师是一个既需要掌控整体又要洞悉局部瓶颈,并依据具体的业务场景给出解决方案的团队领导型人物,他需要参与项目开发的全部过程,包括需求分析、架构设计、系统实现、集成、测试和部署各个阶段,负责在整个项目中对技术活动和技术说明进行指导和协调。

架构师主要职责有4条:

在项目开发过程中,架构师是在需求规格说明书完成后介入的,需求规格说明书必须得到架构师的认可。架构师需要和分析人员反复交流,以保证自己完整并准确地理解用户需求。

依据用户需求,架构师将系统整体分解为更小的子系统和组件,从而形成不同的逻辑层或服务。随后,架构师会确定各层的接口,层与层相互之间的关系。架构师不仅要对整个系统分层,进行“纵向”分解,还要对同一逻辑层分块,进行“横向”分解。

架构师的功力基本体现于此,这是一项相对复杂的工作。

架构师通过对系统的一系列的分解,最终形成了软件的整体架构。技术选择主要取决于软件架构。Web Server运行在Windows上还是Linux上?数据库采用MSSql、Oracle还是Mysql?需要不需要采用MVC或者Spring等轻量级的框架?前端采用富客户端还是瘦客户端方式?类似的工作,都需要在这个阶段提出,并进行评估。

架构师对产品和技术的选型仅仅限于评估,没有决定权,最终的决定权归项目经理。架构师提出的技术方案为项目经理提供了重要的参考信息,项目经理会从项目预算、人力资源、时间进度等实际情况进行权衡,最终进行确认。

架构师在项目开发过程中,是技术权威。他需要协调所有的开发人员,与开发人员一直保持沟通,始终保证开发者依照它的架构意图去实现各项功能。

架构师与开发者沟通的最重要的形式是技术规格说明书,它可以是UML视图、Word文档,Visio文件等各种表现形式。通过架构师提供的技术规格说明书,保证开发者可以从不同角度去观察、理解各自承担的子系统或者模块。

架构师不仅要保持与开发者的沟通,也需要与项目经理、需求分析员,甚至与最终用户保持沟通。所以,对于架构师来讲,不仅有技术方面的要求,还有人际交流方面的要求。

作为架构师,必须成为所在开发团队的技术路线引导者,具有很强的系统思维的能力;需要从大量互相冲突的系统方法和工具中区分出哪些是有效的,哪些是无效的。架构师应当是一个成熟的、丰富的、有经验的、学习快捷、善沟通和决策能力强的人。他必须广泛了解各种技术并精通一种特定技术,至少了解计算机通用技术以便确定哪种技术最优,或组织团队开展技术评估。优秀的架构师能考虑并评估所有可用来解决问题的总体技术方案。需要良好的书面和口头沟通技巧,一般通过可视化模型和小组讨论来沟通指导团队确保开发人员按照架构建造系统。

所以作为架构师需要如下的综合能力:

为了提高效率,架构师必须赢得团队成员、项目经理、客户或用户认同,这就需要架构师具有较强的沟通能力。沟通能力是人类最普遍性的素质要求,技术人员好像容易忽略,想成为架构师就不能忽略。千万不要抱着这样的观念:怀才跟怀孕似的,时间久了总会被人发现的。还是天桥上卖大力丸的哥们说得对:光说不练假把式,光练不说傻把式。看看你周围的头头脑脑们,哪一个不是此中高手,我们千万不要鄙视,认为这是阿谀奉承、投机钻营,凡事都要看到积极的一面,“沟通”的确是一种能力。我认为自己是一个略内向的人,因为我是农村出来的孩子,普通话都说不好,以前或多或少带有点自卑感,幻想着是金子总会发光,所以在职业生涯中吃了不少亏。现在,我深深懂得了沟通的重要性,我会很主动地跟同事们,跟老大们不定时地沟通,感觉工作起来顺畅多了。

这一条我认为最为重要,所以排在首位。我甚至认为下面几条都可以忽略,唯一这一条得牢记,而且要常常提醒自己

架构师最好精通1-2个技术,具备这种技术能力可以更加深入的理解有关架构的工作原理,也可以拉近和开发人员的距离,并形成团队中的影响力。

架构师的技术知识广度也很重要,需要了解尽可能多的技术,所谓见多识广,只有这样,才可能综合各种技术,选择更加适合项目的解决方案。有的人说,架构师技术广度的要求高于技术深度的要求,这是很有道理的。总而言之,一句话:架构师是项目团队中的技术权威。

架构是架构师洞察内在结构、原则、规律与逻辑的过程,架构师要做到清晰理解系统、简洁描述,除此之外,一个架构师还必须具备极强的分析能力,要做到根据产品宗旨和目标,分析清楚产品定位、产品业务,再整合利用现有的技术领域,找出最佳方案,实现产品概念。

架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。你如何具备这种能力呢?一是来自于经验,二是来自于学习。架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。

决策能力是一个架构师最重要的职责。

1. 技术方案决策原则

通常一个问题都会有多种可解决的技术方案,怎么来决策就至关重要了,而决策通常又和全面相关,大的来说通常决策的原则就是性价比和可持续发展。性价比简单来说是方案的实现成本,这个成本要包括非常多的方面,例如有些场景可能会是用硬件解决看起来是花钱,但最终折算成本是最划算的,很多系统设计在决策性价比时都过于随意,例如一个另外常见的场景就是建设一套新系统替代旧系统,这个时候可能完全没考虑旧系统的迁移代价甚至超过了改造旧系统的代价;

可持续发展简单来说就是所选择的技术方案在公司是否可持续,例如简单的案例是公司主体的研发人员都是php,却搞一个其他语言,且只有极少人懂的(当然,这还是要看性价比,如果搞一个其他语言带来的效益超过了语言/人才体系的更换成本),又例如引入一个开源产品,有无专业团队维护这都是要考虑的关键因素。

2. 优先级和节奏控制

经常我会问做系统设计的同学一个问题:对于这个业务场景而言,在系统设计上最需要把握的一个点是什么;这是一个关键问题,全面意味着考虑到了很多地方的问题,但通常业务需求实现都是有很强的时间要求的,因此在这个时候必须考虑清楚不同点的优先级,同时也包括技术方案在决策时也要做出取舍,有可能选了一个不是那么好的技术方案,但通过留下一些可改造的空间,为以后的重构做好铺垫,那就是很不错的,尤其技术同学有些时候比较容易陷入解决技术问题的场景去,但那个问题其实有可能不是现阶段最重要的。

优先级和节奏控制是我认为一个优秀的架构师的最佳体现,优先级意味着把握住了重点,可以确保在所设计的架构指导下业务实现不会出现大问题,节奏控制则意味着全面,知道随着业务发展该在什么时间点做什么事,为将来做好铺垫。

架构优化一方面是优化系统交易链上的每个环节进行分析并优化,另一方面是对单一架构进行瓶颈点分析和调优。但是优化的目标大致相同,最终目的是提高系统的响应速度、吞吐量、降低各个模块之间的耦合。

  1. 在应用系统的设计、开发过程用中,应始终把性能放在考虑的范围内。
  2. 确定清晰明确的性能目标是关键。
  3. 性能调优是伴随整个项目周期的,最好进行分阶段设定目标开展,在达到预期性能目标之后即可对本阶段工作进行总结和知识转移进入下一阶段调优工作。
  4. 必须保证调优后的程序运行正确。
  5. 性能更大程度是取决于良好的设计,调优技巧只是一个辅助手段。
  6. 调优过程是叠代渐进的过程,每次调优的结果要反馈到后续的代码开发中去。
  7. 性能调优不能以牺牲代码的可读性和维护性为代价。
  1. 硬件升级 硬件问题对性能的影响不容忽视。 举一个例子:一个DB集群经常有慢SQL报警,业务排查下来发现SQL都很简单,该做的索引优化也都做了。后来DBA同学帮忙定位到问题是硬件过旧导致,将机械硬盘升级成固态硬盘之后报警立马消失了,效果立竿见影!
  2. 缓存化 缓存可以称的上是性能优化的利器,使用缓存时需要考虑缓存命中率、缓存更新、数据一致性、缓存穿透及雪崩、Value过大等问题,可以通过mutiGet将多次请求合并一次、异步访问等方式来提升缓存读取的性能。
  3. 产品逻辑优化 业务逻辑优化经常会容易被忽略,但效果却往往比数据库调优、JVM调优之类的来的更明显。 举一个例子,12306春运抢火车票的场景,由于访问的人多,用户点击“查票”之后系统会非常卡,进度条非常慢,作为用户,我们会习惯性的再去点“查票”,可能会连续点个好几次。假设平均一个用户点5次,则后端系统负载就增加了5倍!而其中80%的请求是重复请求。这个时候我们可以通过产品逻辑的方式来优化,比如,在用户点击查询之后将“按钮置灰”,或者通过JS控制xx秒只能只能提交一次请求等,有效的拦截了80%的无效流量。
  4. 服务化 做服务化最基础的是按业务做服务拆分,避免跨业务间的互相影响,数据和服务同时拆分。同一个业务内部我们还按计算密集型/IO密集型的服务拆分、C端/B端服务拆分、核心/非核心服务拆分、高频服务单独部署等原则做拆分。
  5. 异步化 异步化可以利用线程池、消息队列等方式实现。 使用线程池的时候一定要注意核心参数的设置,可以通过监控工具去观测实际创建、活跃、空闲的线程数,结合CPU、内存的使用率情况来做线程池调优。 另一种是通过NIO实现异步化,一切网络IO皆可异步:RPC框架、Servlet 3.0提供的异步技术、Apache HttpAsyncClient、缓存异步接口等等。
  6. 搜索引擎 复杂查询以及一些聚合计算不适合在数据库中做,可以利用搜索引擎来实现,另外搜索引擎还可以帮我们很好的解决跨库、跨数据源检索的场景。
  • 优先考虑缓存降低对数据库的读操作。
  • 再考虑读写分离,降低数据库写操作。
  • 最后开始数据拆分,切分模式:首先垂直(纵向)拆分、再次水平拆分。
  • 首先考虑按照业务垂直拆分。
  • 再考虑水平拆分:先分库(设置数据路由规则,把数据分配到不同的库中)
  • 最后再考虑分表,单表拆分到数据1000万以内。

数据拆分前其实是要首先做准备工作的,然后才是开始数据拆分,我先讲拆分前需要做的事情:

第一步:采用分布式缓存redis、memcached等降低对数据库的读操作。

第二步:如果缓存使用过后,数据库访问量还是非常大,可以考虑数据库读、写分离原则。

第三步:当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了。

数据库拆分原则:就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。

一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面 。

比如淘宝中期开始的数据库端按照业务垂直拆分:按照业务交易数据库、用户数据库、商品数据库、店铺数据库等进行拆分。

1. 拆分后业务清晰,拆分规则明确。

2. 系统之间整合或扩展容易。

1. 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。

2. 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。

垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。

相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。

分库分表需要涉及到对应的SQL路由规则主库备库等,例如:淘宝设计了一套TDDL来解决这些问题,应用端只需配置对应的规则即可,对应用端的没有任何侵入的设计。

水平拆分,总之,一般先分库,如果分库后查询仍然慢,于是按照分库的思想开始做分表的工作数据库采用分布式数据库(所有节点的数据加起来才算是整体数据),文件系统采用分布式文件系统任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。

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

总之,想要成为架构师,需要有耐心,不断学习,拓宽自己的视野,不仅仅局限于自己眼前的项目,关注开源技术,关注热门技术社区的新动向。

以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。

收集整理的这篇文章主要介绍了,大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

本人最近和不少小公司的程序员打交道。经过和他们的深入交流,我感受到了不少小公司程序员的现状,由此深深地感叹,可能真有不少小公司的程序员未必能干到30岁,甚至,一些技术一般态度又不好的程序员,可能还未必能干到28岁。

1 能踏实做好增删改查的程序员,就算能力达标

我去我朋友开的一家软件坐了坐,顺带近距离观察了他们java程序员的开发日常,首先说明,我接触到的程序员不是才入职,而是普遍有2到3年工作经验。他们的开发团队是一个项目组长外带10多号人做个java方面的维护项目,用到了spring boot。

其中所谓技术好的程序员,是能根据现有的业务照抄代码,编写新业务功能。编写过程中,如果遇到不熟悉的api,还能上网根据功能查,比如要输出指定的格式,那就会查下然后用Calander等类实现。如果写代码时遇到一些数据库问题或基本的问题,还能把问题关键字放到网上查,并找到对应的解决方法。

在此基础上,如果遇到有bug,还能主动解决,遇到活还不退缩,也就是说所谓的技术好外加态度好,这种人已经算是不可多得了,至于熟悉maven或git等基本管理工具,那更是能算技术顶梁柱了。在这个团队里,不少做java后端的,而且有2年开发经验,是属于无法解决实际问题的。比如无法通过debug排查问题,遇到一些JPA方面的问题,或数据源配置问题,根本不知道如何查。

而他们的项目组长,更多的职责是管进度,同时用最简单的方法把系统发布到网上,并做简单的数据库等方面的配置管理。比如就直接用mvn命令打包,用复制粘贴的方式把jar包放到linux上,遇到数据库性能问题,还能连到linux上用命令建mysql的索引。不过,就技术,用来管理他们公司的项目,也绰绰有余了。

2 除了业务知识外,这些程序员还会什么?

我朋友所在公司里的程序员天天都在创造价值,所开发和维护的项目还真值不少钱,他们每天也不能算闲。但除却哪些摸鱼的程序员,那些态度积极的程序员技术上掌握了哪些技能?

1 业务知识点,比如某个业务流程该怎么做,中间该从哪里获取数据,该返回什么。这些业务可能是这批程序员平时接触最多的所谓技能,而公司也是凭借“能正确开发业务”来核程序员,但这些只能算业务知识,不算技术。

2 用Spring boot开发业务的技能,这倒算,不过用Spring boot外带相关组件开发业务的技能太廉价,哪怕是零基础的用月就能会,而且这种零基础的程序员进入公司3个月后就能熟悉各种业务,也能用Spring boot开发各种功能,所以只掌握这些技能的程序员太多了。

3 能分析和排查问题,比如出现了空指针,能通过debug找到问题,或者出了jpa的错误提示,能把这句提示放网上找,然后再根据提示修改若干代码和配置,从而解决问题,不过这种技能太杂,以后通过面试跳槽时,无法通过这类技能来展示自己的能力。

4 所谓的项目管理能力,比如会用Maven和Git等,但这些技能可能也就停留在“会用”的层面。

更值得感叹的是,我观察下来,这家公司的程序员,有不少是摸鱼的,干活仅限于完成功能不出错,未必还会再去关心其他还谈不上值钱的技术和项目开发的技能。

3 高级程序员和架构师还需要哪些方面的能力?

程序员如果干到28或30岁,不能仅停留在只会做增删改查业务的初级阶段,因为如果单凭这些能力,会很轻易地被应届生,甚至是培训班学员替换。

如果站在老板的角度,年轻人肯加班,而且被所谓的情怀等洗脑,工资还给得低,相比之下,28岁或30岁的程序员谈不上是老油子,但如果干的还是和年轻人一样的活,那老板很有可能要年轻人。

这里姑且不说大厂java架构师的技术要求,也不说大厂高级开发所需要的能力,就仅仅说下一般公司对高级程序员的需求。

1 能熟悉Spring Boot的相关技能,比如jpa,aop,ioc,restful,junit等,哪怕不熟悉,也应当能在短时间(3天内)内熟悉。

2 熟悉基本的数据库方面的性能调优,能解决单机版数据库方面的问题,比如复杂sql,索引等方面的问题。

3 能在linux上看日志,并能通过日志,解决大多数的单机版(非分布式组件方面)问题。

4 能熟悉,Dubbo等分布式组件的用法,至少会api,如果可以,还应当能用这些api开发基本的高并发应用。

5 其他单机版的问题,比如api的调用或问题的排查,哪怕之前没做过,也应当能通过查网上的资料很快解决。

顺带再说下大厂对高级开发乃至架构师的要求。

1 熟悉各种分布式组件的配置方法和用法,能熟练使用分布式组件开发各种高并发需求,并能熟悉限流熔断等技术。

2 熟悉软件发布部署上线的流程,比如搭建mysql环境,搭建组件,甚至会docker和k8s。

3 能通过日志,排查并解决OOM,数据库性能等高级问题,凡是高级开发无法解决的问题,架构师都应该能解决。

4 可以想象初级程序员0岁时的处境

如果只会初级的增删改查技能,在27,8岁之前找工作应该没问题,毕竟当下有太多的软件公司,初级开发的岗位也应该有不少。

但有3到5年开发经验的java程序员应当需要升级到高级,也就是说,如果在27或28岁,依然只会初级开发技能的话,高级开发的面试应该过不了,甚至面试中提到的一些技术连听都没听过。如下给出些问高级开发问题。

1 你们项目用哪些组件应对高并发?怎么解决限流熔断等问题?

2 集群,或Dubbo集群你用过没?如果没用过,你是怎么解决穿透,或dubbo优雅停机等方面的问题?

3 你是怎么排查的OOM和数据库性能问题的?在怎么监控性能的?

要知道,对于初级开发来说,面试前背java八股文还有些用,但对于Java高级开发来说,只会背八股文,面试一定过不了。

所以对这些在28岁甚至30岁还在做java初级开发的程序员来说,有可能还能通过跳槽涨工资,但由于无法升级到高级开发,在公司里的处境可能就很尴尬了,因为能干的活年轻人都能干,而且人家还能加班。这样的话,遇到公司运营有问题,还真可能被优化。而且被优化后,甚至有可能连面试机会都没。

5 大龄尚在初级阶段的程序员多吗?

我只凭推测,但这部分的程序员数量应该不少。

1 不少公司可能更多注重业务,在项目开发环境中无法提供分布式等值钱技术的实践机会,这就导致不少程序员就认为,开发项目只到一些比较初级的技术。没有机会实践高级技术,提升也就无从谈起了。

2 不少程序员跳槽时可能更多关心薪资,未必会关心公司所用的技术,所以很有可能进入新公司后,薪资有涨,管的人也变多,但用的还是老一套技术。

3 更重要的是,为了能找到能提供值钱技术实践机会的公司,先得在面试中证明相关技术的项目经验,要做到这点不容易。

4 况且,不少程序员然身处小公司,但加班程度未必比大厂少,往往是忙了一天后,看似很充实,也确实挣到了钱,但哪怕是日积月累,每天干的活都是重复劳动,提升也就无从谈起了。 

所以,我在我朋友公司看到的一些程序员的状况,可能就未必是孤例了。不能说大多数小公司的程序员都这样,但像这样的程序员还真未必在少数。

6 人往高处走,程序员尤其应警惕

比起其他行当,程序员确实能有用加班换取高薪的机会,但可以这样说,程序员确实是一个吃青春饭的行当。

不说其他,就看看每年毕业的应届计算机专业的毕业生,再看一些大厂的培训班输出程序员的数量,就足以让大多数程序员警惕。

不过天无绝人之路,我本身最近,也帮了不少零基础程序员入行,也帮了java不少初级开发成功升级,再看看一些大厂也在天天招人,这足以说明,哪怕当前身处小公司,哪怕当前技术能力一般,程序员应当也有机会不断升级,或者能通过努力进大厂。

想再写些程序员如何升级的文字,不过在我的博客里,这些文章不少了,而且大多数文章反复被人转载或抄袭,所以这篇文章就写到这里。

最后祝广大程序员朋友,当然也包括我,不仅身体健康,而且能早日实现财富自由。

以上是为你收集整理的全部内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得网站内容还不错,欢迎将推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:,请注明来意。

我要回帖

更多关于 什么是架构师 的文章

 

随机推荐