精华内容
下载资源
问答
  • 2020-04-16 20:00:13

    阅读时间:2020年4月

    概览:管理的本质是对人的管理,管理好人,让被信任的人去解决问题。对人的管理的核心是利他,也就是成就别人。

    评分:*****

           坎贝尔作为一个橄榄球教练,之所以能够称之为传奇,是因为一个橄榄球教练知道的公司规模达到了1万亿美金的恐怖规模。更令人佩服的是有那么多的行业大佬把他作为自己最为亲密的人。尽管书中将如何维系一个有战斗力的团队作为了重点的内容,也就是为什么他作为教练指导的团队所负责公司的总规模达到了1万亿美金。而我觉得更感兴趣的确实为什么那么多优秀的人原因将他作为亲密的战友和可以信任的朋友。

           生活中会遇到很多人,他们最大的特点就是人缘特别好,很多人都将其作为自己的挚友。经验告诉我们维持友情是需要经历和时间的,而且能够成为真正好朋友的人一般是志同道合,有相同的兴趣爱好。感情需要长时间的培养才能得到。那么这些人缘如此好的人是如何做到的呢。

           首先要思考这种亲密关系的本质是什么。当大家说到谁是自己的好朋友的时候,对于好朋友是由一个明确的定义的。这个定义对于不同的人可能会有所不同,但是其中肯定会包含能愉快的交流、可信任、遇到问题时可以给予帮助。后两个其实也就是我们常说的义气。从坎贝尔的经历中也可以看到类似的情景。他对他训练的人都是发自内心的提供帮助,人们喜欢和他进行交流,他提供的建议是别人可以信任的,他在指导是很少寻求回报。在遇到困难时人们会想起找他,而且知道如果这样做大概率问题可以得到解决。扪心自问,如果有这样的朋友,我也愿意把他作为好友。

           做到这样几个问题。第一个是要让自己有为别人解决问题的能力。第二个是要合理的决定应该帮助谁,应该怎么帮。第三个是如果付出没有回报怎么办。第四个是如何把自己的这种素质坚持下去。

           第一个问题,如何让自己有帮助别人的能力。如果总结一下别人需要的东西,个人可以提供的帮助有提供人脉关系、提供时间和提供金钱。除了金钱是需要积累的,人脉关系是每个人都有的,不论是家人还是同学、朋友。时间也是每个人都有的。因此我们或多或少都会有一些可以对外提供的资源。其中人脉是可以慢慢培养的,你为别人提供帮助,这个人就是你下次可以寻求帮助的对象,这就是关系,有来有往才是本质。

           第二个问题的合理的决定应该帮助谁。如上所属,关系是有来有往,本质上是互利。但是难免会有人只喜欢索取不喜欢付出。我们既要做到一个慷概的付出者,但是也要避免成为别人眼中的冤大头。帮助对象可以分为三类,第一类是愿意回馈也有能力回馈的,这种人要给予最多的关注,能提供帮助时给与最大的帮助。第二类是愿意回馈但是暂时能力不大的。这种人也要给予帮助,但是不要过多的付出。第三种人是不愿意回馈只希望索取的。这种就要敬而远之了。对人进行分类是简单的,制定策略也是简单的,难点在于如何能认清一个人呢。对于熟悉的人我们可以做出判断。但是对于一个不熟悉的人,我想这里要遵循优先原则,那就是先做付出者,然后在需要的时候可以看帮助对象的反馈,从其行为上就可以知道他属于哪类人。

           第三个问题是如果付出没有回报怎么办。大部分人肯定都是愿意帮助人的,后来慢慢不愿意这么做了,很大的原因可能是因为心受伤了。自己付出了,但是需要的时候却没有得到反馈,于是觉得付出了也没有什么用。于是慢慢的失去了热情。

           最后一个问题就是如何能够持续下去。最开始把持续看作是坚持,然而当我们说到坚持,我们认为这件事做起来是有难度的。但是从坎贝尔的做法上来看,他并不认为这件事是很困难的,因为一切都融入到了骨子里,成为自己的一部分。当你行为处事时,你所表现的最真实的东西就是能够全新全意的对别人,因此无需刻意的表现,也没有坚持一说。所以要把这种对别人的关注、利他的思想做到自己骨子里,对人真诚,真心的希望其他人好,在别人取得成就是为他人高兴,当别人坠入低谷时伸出援手。做到如此,才能成为坎贝尔一样的人。

    更多相关内容
  • 为了了解组织内部员工互动的状况,倾听职员心声,一个管理者需要具备良好的沟通能力,其中又以“善于倾听”最为重要。惟有如此,才不至于让下属离心离德,或者不敢提出建设性的提议与需求,而管理者也可借由下属的...

    管理者应具备的六大能力 :

    1、沟通能力为了了解组织内部员工互动的状况,倾听职员心声,一个管理者需要具备良好的沟通能力,其中又以“善于倾听”最为重要。惟有如此,才不至于让下属离心离德,或者不敢提出建设性的提议与需求,而管理者也可借由下属的认同感、理解程度及共鸣,得知自己的沟通技巧是否成功。

    2、协调能力。管理者应该要能敏锐地觉察部属的情绪,并且建立疏通、宣泄的管道,切勿等到对立加深、矛盾扩大后,才急于着手处理与排解。

    3、规划与统整能力。管理者的规划能力,并非着眼于短期的策略规划,而是长期计划的制定。

    4、决策与执行能力。在民主时代,虽然有许多事情以集体决策为宜,但是管理者仍经常须独立决策,包括分派工作、人力协调、化解员工纷争等等,这都往往考验着管理者的决断能力。

    5、培训能力。管理者必然渴望拥有一个实力坚强的工作团队,因此,培养优秀人才,也就成为管理者的重要任务。

    6、统驭能力。有句话是这样说的:“一个领袖不会去建立一个企业,但是他会建立一个组织来建立企业。”根据这种说法,当一个管理者的先决条件,就是要有能力建立团队,才能进一步建构企业。但无论管理者的角色再怎么复杂多变,赢得员工的信任都是首要的条件。

    扩展资料:

    管理者角色是指管理者应该具备的行动或行为所组成的各种的特定类型。

    信息

    在信息角色中,管理者负责确保和其一起工作的人员具有足够的信息,从而能够顺利完成工作。由管理责任的性质决定,管理者既是所在单位的信息传递中心,也是组织内其他工作小组的信息传递渠道。整个组织的人依赖于管理结构和管理者以获取或传递必要的信息,以便完成工作。管理者必须扮演的信息角色,具体又包括传播者、发言人两种角色。

    传播者角色。管理者把他们作为信息监督者所获取的大量信息分配出去。

    发言人角色。管理者必须把信息传递给单位或组织以外的个人。

    决策

    在决策角色中,管理者处理信息并得出结论。如果信息不用于组织的决策,这种信息就失去其应有的价值。决策角色具体又包括企业家、干扰对付者、资源分配者、谈判者四种角色。

    企业家角色。管理者密切关注组织内外环境的变化和事态的发展,以便发现机会,并对所发现的机会进行投资以利用这种机会。

    干扰对付者角色。它是指管理者必须善于处理冲突或解决问题,如平息客户的怒气,同不合作的供应商进行谈判,或者对员工之间的争端进行调解等。

    资源分配者角色。管理者决定组织资源用于哪些项目。

    谈判者角色。管理者把大量时间花费在谈判上,管理者的谈判对象包括员工、供应商、客户和其他工作小组。

    任何组织或团体的管理者,都具有一定的职位,都要运用和行使相应的权力,同时也要承担一定的责任。权力和责任是一个矛盾的统一体,一定的权力又总是和一定的责任相联系的。当组织赋予管理者—定的职务和地位,从而形成了一定的权力时,相应地,管理者同时也就担负了对组织—定的责任。

    在组织中的各级管理人员中,责和权必须对称和明确,没有责任的权力,必然会导致管理者的用权不当,没有权力的责任是空泛的、难于承担的责任。有权无责或有责无权的人,都难以在工作中发挥应有的作用,都不能成为真正的管理者。

    责任是对管理者的基本要求,管理者被授予权力的同时,应该对组织或团体的命运负有相应的责任,对组织或团体的成员负有相应的义务。权力和责任应该同步消长,权力越大,责任越重。比较而言,责任比权力更本质,权力只是尽到责任的手段,责任才是管理者真正的象征。

    如果一个管理者仅有职权,而没有相应的责任,那么他是做不好管理工作的。管理者的与众不同,正因为他是一位责任者。如果管理者没有尽到自己的责任,就意味着失职,等于放弃了管理。

    参考资料:百度百科——管理者

    展开全文
  • 怎样成为一个优秀的架构师?

    万次阅读 多人点赞 2019-10-08 17:15:37
    架构师是一个既能掌控整体又能洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。看似完美的“人格模型”背后,是艰辛的探索。 架构师不是一个人,他需要建立高效卓越的体系,带领团队去攻城略地,在...

    怎样才算是架构师?

    架构师是一个既能掌控整体又能洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。看似完美的“人格模型”背后,是艰辛的探索。

    架构师不是一个人,他需要建立高效卓越的体系,带领团队去攻城略地,在规定的时间内完成项目。

    架构师的分类

    从业界来看对于架构师的理解可以大概区分为:

    • 企业架构师:专注于企业总体 IT 架构的设计。

    • IT 架构师-软件产品架构师:专注于软件产品的研发。

    • IT 架构师-应用架构师:专注于结合企业需求,定制化 IT 解决方案;大部分需要交付的工作包括总体架构、应用架构、数据架构,甚至部署架构。

    • IT 架构师-技术架构师:专注于基础设施,某种软硬件体系,甚至云平台,提交:产品建议、产品选型、部署架构、网络方案,甚至数据中心建设方案等。

    架构师的职责

    架构师需要能够识别定义并确认需求,能够进行系统分解形成整体架构,能够正确地技术选型,能够制定技术规格说明并有效推动实施落地。

    按 TOGAF 的定义,架构师的职责是了解并关注实际上关系重大但未变得过载的一些关键细节和界面,架构师的角色有:理解并解析需求,创建有用的模型,确认、细化并扩展模型,管理架构。

    从项目视图看:

    对接管理部门:汇报技术方案,进度;技术沟通;
    对接客户 PM,项目 PM:协助项目计划,人员管理等。负责所有技术交付物的指导;
    对接业务部门和需求人员:了解和挖掘痛点,帮忙梳理高级业务需求,指导需求工艺;
    对接开发:产品支持、技术指导、架构指导;
    对接测试:配合测试计划和工艺制定。配合性能测试或者非功能性测试;
    对接运维:产品支持,运维支持;
    对接配置&环境:产品支持;
    .......

    架构原则

    设计原则就是架构设计的指导思想,它指导我们如何将数据和函数组织成类,如何将类链接起来成为组件和程序。反向来说,架构的主要工作就是将软件拆解为组件,设计原则指导我们如何拆解、拆解的粒度、组件间依赖的方向、组件解耦的方式等。

    设计原则有很多,我们进行架构设计的主导原则是 OCP(开闭原则),在类和代码的层级上有:SRP(单一职责原则)、LSP(里氏替换原则)、ISP(接口隔离原则)、DIP(依赖反转原则);在组件的层级上有:REP(复用、发布等同原则)、CCP(共同闭包原则)、CRP(共同复用原则),处理组件依赖问题的三原则:无依赖环原则、稳定依赖原则、稳定抽象原则。

    设计原则

    1、OCP(开闭原则):设计良好的软件应该易于扩展,同时抗拒修改。这是我们进行架构设计的主导原则,其他的原则都为这条原则服务。

    2、SRP(单一职责原则):任何一个软件模块,都应该有且只有一个被修改的原因,“被修改的原因“指系统的用户或所有者,翻译一下就是,任何模块只对一个用户的价值负责,该原则指导我们如何拆分组件。

    举个例子,CTO 和 COO 都要统计员工的工时,当前他们要求的统计方式可能是相同的,我们复用一套代码,这时 COO 说周末的工时统计要乘以二,按照这个需求修改完代码,CTO 可能就要过来骂街了。当然这是个非常浅显的例子,实际项目中也有很多代码服务于多个价值主体,这带来很大的探秘成本和修改风险,另外,当一份代码有多个所有者时,就会产生代码合并冲突的问题。

    3、LSP(里氏替换原则):当用同一接口的不同实现互相替换时,系统的行为应该保持不变。该原则指导的是接口与其实现方式。

    你一定很疑惑,实现了同一个接口,他们的行为也肯定是一致的呀,还真不一定。假设认为矩形的系统行为是:面积=宽*高,让正方形实现矩形的接口,在调用 setW 和 setH 时,正方形做的其实是同一个事情,设置它的边长。这时下边的单元测试用矩形能通过,用正方形就不行,实现同样的接口,但是系统行为变了,这是违反 LSP 的经典案例。

    Rectangle r = ... 
    r.setW(5); 
    r.setH(2); 
    assert(r.area() == 10);
    

    4、ISP(接口隔离原则):不依赖任何不需要的方法、类或组件。该原则指导我们的接口设计。当我们依赖一个接口但只用到了其中的部分方法时,其实我们已经依赖了不需要的方法或类,当这些方法或类有变更时,会引起我们类的重新编译,或者引起我们组件的重新部署,这些都是不必要的。所以我们最好定义个小接口,把用到的方法拆出来。

    5、DIP(依赖反转原则):指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

    跨越组建边界的依赖方向永远与控制流的方向相反。该原则指导我们设计组件间依赖的方向。

    依赖反转原则是个可操作性非常强的原则,当你要修改组件间的依赖方向时,将需要进行组件间通信的类抽象为接口,接口放在边界的哪边,依赖就指向哪边。

    6、REP(复用、发布等同原则):软件复用的最小粒度应等同于其发布的最小粒度。直白地说,就是要复用一段代码就把它抽成组件,该原则指导我们组件拆分的粒度。

    7、CCP(共同闭包原则):为了相同目的而同时修改的类,应该放在同一个组件中。CCP 原则是 SRP 原则在组件层面的描述。该原则指导我们组件拆分的粒度。

    对大部分应用程序而言,可维护性的重要性远远大于可复用性,由同一个原因引起的代码修改,最好在同一个组件中,如果分散在多个组件中,那么开发、提交、部署的成本都会上升。

    8、CRP(共同复用原则):不要强迫一个组件依赖它不需要的东西。CRP 原则是 ISP原则在组件层面的描述。该原则指导我们组件拆分的粒度。

    相信你一定有这种经历,集成了组件 A,但组件 A 依赖了组件 B、C。即使组件 B、C 你完全用不到,也不得不集成进来。这是因为你只用到了组件 A 的部分能力,组件 A 中额外的能力带来了额外的依赖。如果遵循共同复用原则,你需要把 A 拆分,只保留你要用的部分。

    REP、CCP、CRP 三个原则之间存在彼此竞争的关系,REP 和 CCP 是黏合性原则,它们会让组件变得更大,而 CRP 原则是排除性原则,它会让组件变小。遵守REP、CCP 而忽略 CRP,就会依赖了太多没有用到的组件和类,而这些组件或类的变动会导致你自己的组件进行太多不必要的发布;遵守 REP、CRP 而忽略 CCP,因为组件拆分的太细了,一个需求变更可能要改 n 个组件,带来的成本也是巨大的。

    指导原则

    除了上述设计原则,还有一些重要的指导原则如下:

    1、N+1设计:系统中的每个组件都应做到没有单点故障;

    2、回滚设计:确保系统可以向前兼容,在系统升级时应能有办法回滚版本;

    3、禁用设计:应该提供控制具体功能是否可用的配置,在系统出现故障时能够快速下线功能;

    4、监控设计:在设计阶段就要考虑监控的手段,便于有效的排查问题,比如引入traceId、业务身份 Id 便于排查监控问题;

    5、多活数据中心设计:若系统需要极高的高可用,应考虑在多地实施数据中心进行多活,至少在一个机房断电的情况下系统依然可用;

    6、采用成熟的技术:刚开发的或开源的技术往往存在很多隐藏的 bug,出了问题没有很好的商业支持可能会是一个灾难;

    7、资源隔离设计:应避免单一业务占用全部资源;

    8、架构水平扩展设计:系统只有做到能水平扩展,才能有效避免瓶颈问题;

    9、非核心则购买的原则:非核心功能若需要占用大量的研发资源才能解决,则考虑购买成熟的产品;

    10、使用商用硬件:商用硬件能有效降低硬件故障的机率;

    11、快速迭代:系统应该快速开发小功能模块,尽快上线进行验证,早日发现问题大大降低系统交付的风险;

    12、无状态设计:服务接口应该做成无状态的,当前接口的访问不依赖于接口上次访问的状态。

    架构师知道了职责,具备很好的架构思维,掌握了通用的架构框架和方法论,使用架构原则进行架构设计,不同的业务和系统要求不一样,那么有没有针对不同场景的系统架构设计?下文就针对分布式架构演进、单元化架构、面向服务 SOA 架构、微服务架构、Serverless 架构进行介绍,以便于我们在实际运用中进行参考使用。

    具备架构师的思维

    架构师职责明确了,那么有什么架构思维可以指导架构设计呢?请看下述的架构思维。

    1、自顶向下构建架构

    要点主要如下:

    1)首先定义问题,而定义问题中最重要的是定义客户的问题。定义问题,特别是识别出关键问题,关键问题是对客户有体感,能够解决客户痛点,通过一定的数据化来衡量识别出来,关键问题要优先给出解决方案。

    2)问题定义务必加入时间维度,把手段/方案和问题定义区分开来。

    3)问题定义中,需要对问题进行升层思考后再进行升维思考,从而真正抓到问题的本质,理清和挖掘清楚需求;要善用第一性原理思维进行分析思考问题。

    4)问题解决原则:先解决客户的问题(使命),然后才能解决自己的问题(愿景);务必记住不是强调我们怎么样,而是我们能为客户具体解决什么问题,然后才是我们变成什么,从而怎么样去更好得服务客户。

    5)善用多种方法对客户问题进行分析,转换成我们产品或者平台需要提供的能力,比如仓储系统 WMS 可以提供哪些商业能力。

    6)对我们的现有的流程和能力模型进行梳理,找到需要提升的地方,升层思考和升维思考真正明确提升部分。

    7)定义指标,并能够对指标进行拆解,然后进行数学建模。

    8)将抽象出来的能力诉求转换成技术挑战,此步对于技术人员来说相当于找到了靶子,可以进行方案的设计了,需要结合自底向上的架构推导方式。

    9)创新可以是业务创新,也可以是产品创新,也可以是技术创新,也可以是运营创新,升层思考、升维思考,使用第一性原理思维、生物学(进化论--进化=变异+选择+隔离、熵增定律、分形和涌现)思维等哲科思维可以帮助我们在业务,产品,技术上发现不同的创新可能。可以说哲科思维是架构师的灵魂思维。

    2、自底向上推导应用架构

    先根据业务流程,分解出系统时序图,根据时序图开始对模块进行归纳,从而得到粒度更大的模块,模块的组合/聚合构建整个系统架构。

    基本上应用逻辑架构的推导有4个子路径,他们分别是:

    • 业务概念架构:业务概念架构来自于业务概念模型和业务流程;

    • 系统模型:来自于业务概念模型;

    • 系统流程:来自业务流程;

    • 非功能性的系统支撑:来自对性能、稳定性、成本的需要。

    效率、稳定性、性能是最影响逻辑架构落地成物理架构的三大主要因素,所以从逻辑架构到物理架构,一定需要先对效率、稳定性和性能做出明确的量化要求。

    自底向上重度依赖于演绎和归纳。

    如果是产品方案已经明确,程序员需要理解这个业务需求,并根据产品方案推导出架构,此时一般使用自底向上的方法,而领域建模就是这种自底向上的分析方法。

    对于自底向上的分析方法,如果提炼一下关键词,会得到如下两个关键词:

    1)演绎:演绎就是逻辑推导,越是底层的,越需要演绎:

    • 从用例到业务模型就属于演绎;

    • 从业务模型到系统模型也属于演绎;

    • 根据目前的问题,推导出要实施某种稳定性措施,这是也是演绎。

    2)归纳:这里的归纳是根据事物的某个维度来进行归类,越是高层的,越需要归纳:

    • 问题空间模块划分属于归纳;

    • 逻辑架构中有部分也属于归纳;

    • 根据一堆稳定性问题,归纳出,事前,事中,事后都需要做对应的操作,是就是根据时间维度来进行归纳。

    3、领域驱动设计架构

    大部分传统架构都是基于领域模型分析架构,典型的领域实现模型设计可以参考DDD(领域驱动设计),详细可以参考《实现领域驱动设计》这本书,另外《UML和模式应用》在领域建模实操方面比较好,前者偏理论了解,后者便于落地实践。

    领域划分设计步骤:

    (1) 对用户需求场景分析,识别出业务全维度 Use Case。

    (2) 分析模型鲁棒图,识别出业务场景中所有的实体对象。鲁棒图 —— 是需求设计过程中使用的一种方法(鲁棒性分析),通过鲁棒分析法可以让设计人员更清晰,更全面地了解需求。它通常使用在需求分析后及需求设计前做软件架构分析之用,它主要注重于功能需求的设计分析工作。需求规格说明书为其输入信息,设计模型为其输出信息。它是从功能需求向设计方案过渡的第一步,重点是识别组成软件系统的高级职责模块、规划模块之间的关系。鲁棒图包含三种图形:边界、控制、实体,三个图形如下:

    (3) 领域划分,将所有识别出的实体对象进行分类。

    (4) 评估域划分合理性,并进行优化。

    4、基于数据驱动设计架构

    随着 IoT、大数据和人工智能的发展,以领域驱动的方式进行架构往往满足不了需求或者达不到预期的效果,在大数据时代,在大数据应用场景,我们需要转变思维,从领域分析升维到基于大数据统计分析结果来进行业务架构、应用架构、数据架构和技术架构。这里需要架构师具备数理统计分析的基础和 BI 的能力,以数据思维来架构系统,典型的系统像阿里的数据分析平台采云间和菜鸟的数据分析平台 FBI。

    上述四种思维,往往在架构设计中是融合使用的,需要根据业务或者系统的需求来选择侧重思维方式。

    单元化架构,微服务架构以及 Serveless 架构

    单元化架构

    1. 单元化是什么

    单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。

    单元化架构,为什么要用以及我们如何做到

    图 1 :洋葱细胞的显微镜截图,单元化要达到的目的就是让每个单元像细胞一样独立工作

    在传统的服务化架构下(如下图),服务是分层的,每一层使用不同的分区算法,每一层都有不同数量的节点,上层节点随机选择下层节点。当然这个随机是比较而言的。

    单元化架构,为什么要用以及我们如何做到

    图 2 :传统的服务化架构,为伸缩性设计,上层节点随机选择下层节点

    与其不同的是,在单元化架构下,服务虽然分层划分,但每个单元自成一体。按照层次来讲的话,所有层使用相同的分区算法,每一层都有相同数量的节点,上层节点也会访问指定的下层节点。因为他们已经在一起。

    单元化架构,为什么要用以及我们如何做到

    图 3 :单元化架构,为性能和隔离性而设计,上层节点访问指定下层节点

    2. 为什么要用单元化

    在性能追求和成本限制的情况下,我们需要找到一种合适的方法来满足服务需求。在传统的分布式服务设计,我们考虑的更多是每个服务的可伸缩性,当各个服务独立设计时你就要在每一层进行伸缩性的考虑。这是服务化设计(SOA)流行的原因,我们需要每个服务能够单独水平扩展。

    但是在摩尔定律下,随着硬件的不断升级,计算机硬件能力已经越来越强,CPU 越来越快,内存越来越大,网络越来越宽。这让我们看到了在单台机器上垂直扩展的机会。尤其是当你遇到一个性能要求和容量增长可以预期的业务,单元化给我们提供另外的机会,让我们可以有效降低资源的使用,提供更高性能的服务。

    总体而言,更高性能更低成本是我们的主要目标,而经过单元化改造,我们得以用更少(约二分之一)的机器,获得了比原来更高(接近百倍)的性能。性能的提升很大部分原因在于服务的本地化,而服务的集成部署又进一步降低了资源的使用。

    当然除了性能收益,如果你做到了,你会发现还有很多收益,比如更好的隔离性,包括请求隔离和资源隔离,比如更友好的升级,产品可以灰度发布等。单元化改造后对高峰的应对以及扩容方式等问题,各位可以参考#微博春节技术保障系列#中的单元化架构文章,也不在此一一赘述。

    3. 我们如何做到

    此次单元化改造基于微博现有的业务,因此这里也先行介绍一下。粉丝服务平台是微博的内容推送系统(代号 Castalia),可为 V 用户提供向其粉丝推送高质量内容的高速通道(单元化之后已到达百万条每秒)。整个服务涉及用户筛选、发送计费、屏蔽检查、限流控制和消息群发等多个子服务。由于改造思想相通,这里以用户筛选和消息群发两个服务为例,下面两图分别为商业群发在服务化思想和单元化思想下不同的架构。

    单元化架构,为什么要用以及我们如何做到

    图 4: 服务化思想下的商业群发架构设计(旧版)

    单元化架构,为什么要用以及我们如何做到

    图 5 :商业群发在单元化思想下的架构设计(新版)

    对于筛选服务,在服务化架构里,需要去粉丝服务获取粉丝关系,然后去特征服务进行用户特征筛选,最后将筛选结果传输到群发服务器上;而在单元化架构里,粉丝关系直接就在本地文件中,用户特征服务也在本地,最后的筛选结果再不需要传输。服务本地化(粉丝关系和用户特征存储)减去了网络开销,降低了服务延时,还同时提高了访问速度和稳定性,而筛选结果本地存储又进一步节省了带宽并降低了延迟。以百万粉丝为例,每次网络操作的减少节省带宽 8M 左右,延时也从 400ms 降为 0。

    群发服务同样如此。由于在服务化架构里,我们使用 MySQL 和 Memcache 的方案,由于关系数据库的写入性能问题,中间还有队列以及相应的队列处理机,所有四个模块都有单独的机器提供服务,而在单元化架构里,四合一之后,只需要一套机器。当然机器的配置可能会有所提升,但真正计算之后你就会发现其实影响微乎其微。原因除了前面介绍的硬件增长空间外,上架机器的基本配置变高也是一个原因。而且,在单元化方案里,当我们把缓存部署在本地之后,其性能还有了额外的 20% 提升。

    一些业务特有问题

    不过群发这个场景,我们也遇到了一些特定的问题,一是分区问题,一是作业管理。这里也与各位分享下我们的解决方法。

    1. 分区问题

      分区问题其实是每个服务都会遇到的,但单元化后的挑战在于让所有服务都适配同一分区算法,在我们的场景下,我们按照接收者进行了分区,即从底层往上,每一层都来适配此分区算法。

      这里有特例的是用户特征和屏蔽服务,由于总体容量都很小,我们就没有对数据进行分区,所有单元内都是同一套全量数据,都是一个外部全量库的从库。不过由于本单元内的上层服务的关系,只有属于本分区的用户数据被访问到。所以,适配同一分区算法在某种程度上讲,可以兼容即可。

    2. 作业管理

      按照前面的分区方式,将群发服务的整体架构变成了一个类似 Scatter-Gather+CQRS 的方案,因为 Gather 不是一个请求处理的必须要素。也就是说,一个群发请求会被扩散到所有单元中,每个单元都要针对自己分区内的用户处理这个群发请求。

      广播方式的引入,使得我们首先需要在前端机进行分单元作业的处理监控,我们在此增加了持久化队列来解决。同时,由于单元内每个服务也都是单独维护的,作业可能在任何时间中断,因此每个作业在单元内的状态也都是有记录的,以此来达到作业的可重入和幂等性,也就可以保证每个作业都可以在任何时间重做,但不会重复执行。

    除此之外,我们还对服务器进行了更为精细的控制,使用 CPU 绑定提高多服务集成部署时的整体效率,使用多硬盘设计保证每个服务的 IO 性能,通过主从单元的读写分离来提高整体服务等等。

    参考文章:https://www.infoq.cn/article/how-weibo-do-unit-architecture/

    SOA架构

    SOA(Service-Oriented Architecture,面向服务的架构)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是 SOA 的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。

    SOA的实施具有几个鲜明的基本特征。实施 SOA 的关键目标是实现企业 IT 资产的最大化作用。要实现这一目标,就要在实施 SOA 的过程中牢记以下特征:

    • 可从企业外部访问;

    • 随时可用;

    • 粗粒度的服务接口分级;

    • 松散耦合;

    • 可重用的服务;

    • 服务接口设计管理;

    • 标准化的服务接口;

    • 支持各种消息模式;

    • 精确定义的服务契约。

    为了实现 SOA,企业需要一个服务架构,下图显示了一个例子:

    在上图中, 服务消费者(service consumer)可以通过发送消息来调用服务。这些消息由一个服务总线(service bus)转换后发送给适当的服务实现。这种服务架构可以提供一个业务规则引(business rules engine),该引擎容许业务规则被合并在一个服务里或多个服务里。这种架构也提供了一个服务管理基础(service management infrastructure),用来管理服务,类似审核,列表(billing),日志等功能。

    此外,该架构给企业提供了灵活的业务流程,更好地处理控制请求(regulatory requirement),例如Sarbanes Oxley(SOX),并且可以在不影响其他服务的情况下更改某项服务。

    微服务架构

    先来看看传统的 web 开发方式,通过对比比较容易理解什么是 Microservice Architecture。和 Microservice 相对应的,这种方式一般被称为 Monolithic(单体式开发)。

    所有的功能打包在一个 WAR包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI 等所有逻辑。

    1、优点:

    • 开发简单,集中式管理;

    • 基本不会重复开发;

    • 功能都在本地,没有分布式的管理和调用消耗。

    2、缺点:

    • 效率低:开发都在同一个项目改代码,相互等待,冲突不断;

    • 维护难:代码功功能耦合在一起,新人不知道何从下手;

    • 不灵活:构建时间长,任何小修改都要重构整个项目,耗时;

    • 稳定性差:一个微小的问题,都可能导致整个应用挂掉;

    • 扩展性不够:无法满足高并发下的业务需求。

    3、常见的系统架构遵循的三个标准和业务驱动力:

    • 提高敏捷性:及时响应业务需求,促进企业发展;

    • 提升用户体验:提升用户体验,减少用户流失;

    • 降低成本:降低增加产品、客户或业务方案的成本。

    4、基于微服务架构的设计:

    目的:有效的拆分应用,实现敏捷开发和部署。

    关于微服务的一个形象表达:

    • X轴:运行多个负载均衡器之后的运行实例;

    • Y轴:将应用进一步分解为微服务(分库);

    • Z轴:大数据量时,将服务分区(分表)。

    5、SOA和微服务的区别:

    • SOA喜欢重用,微服务喜欢重写;

    • SOA喜欢水平服务,微服务喜欢垂直服务;

    • SOA喜欢自上而下,微服务喜欢自下而上。

    Serverless架构

    1、思想:无服务器是一种架构理念,其核心思想是将提供服务资源的基础设施抽象成各种服务,以 API 接口的方式供给用户按需调用,真正做到按需伸缩、按使用收费。

    2、优势:消除了对传统的海量持续在线服务器组件的需求,降低了开发和运维的复杂性,降低运营成本并缩短了业务系统的交付周期,使得用户能够专注在价值密度更高的业务逻辑的开发上。

    3、内容:目前业界较为公认的无服务器架构主要包括两个方面,即提供计算资源的函数服务平台 FaaS,以及提供托管云服务的后端服务 BaaS。

    函数即服务(Function as a Service):是一项基于事件驱动的函数托管计算服务。通过函数服务,开发者只需要编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数代码运行在无状态的容器中,由事件触发且短暂易失,并完全由第三方管理,基础设施对应用开发者完全透明。函数以弹性、高可靠的方式运行,并且按实际执行资源计费,不执行不产生费用。

    后端即服务(Backend as a Service):BaaS 覆盖了应用可能依赖的所有第三方服务,如云数据库、身份验证、对象存储等服务,开发人员通过 API 和由 BaaS 服务商提供的 SDK,能够集成所需的所有后端功能,而无需构建后端应用,更不必管理虚拟机或容器等基础设施,就能保证应用的正常运行。

    三个less感觉很好:

    • Codeless 对应的是服务开发,实现了源代码托管,你只需要关注你的代码实现,而不需要关心你的代码在哪,因为在整个开发过程中你都不会感受到代码库和代码分支的存在。

    • Applicationless 对应的是服务发布,在服务化框架下,你的服务发布不再需要申请应用,也不需要关注你的应用在哪。

    • Serverless 对应的则是服务运维,有了 Serverless 化能力,你不再需要关注你的机器资源,Servlerless 会帮你搞定机器资源的弹性扩缩容。

    架构师在完成上述架构设计后,最终是需要协同利益相关方一起按项目化运作落地拿结果,那么应该如何保证利益相关方在项目落地的满意度,如何保证按照架构很好的拿到项目成功的结果呢?架构管理能力是架构师非常重要的能力。

    架构师管理架构双赢模型

    架构结果管理

    优秀架构师必须掌握的几种架构思维

    架构的本质是管理复杂性,抽象、分层、分治和演化思维是我们工程师/架构师应对和管理复杂性的四种最基本武器。

    最近团队来了一些新人,有些有一定工作经验,是以高级工程师/架构师身份进来的,但我发现他们大部分人思维偏应用和细节,抽象能力弱。所以作为团队技术培训的一部分,我整理了这篇文章,希望对他们树立正确的架构设计思维有帮助。我认为,对思维习惯和思考能力的培养,其重要性远远大于对实际技术工具的掌握。

    由于文章内容较长,所以我把它分成两篇小文章,在第一篇《优秀架构师必须掌握的架构思维》中,我会先介绍抽象、分层、分治和演化这四种应对复杂性的基本思维。在第二篇《四个架构设计案例及其思维方式》中,我会通过四个案例,讲解如何综合运用这些思维,分别对小型系统,中型系统,基础架构,甚至是组织技术体系进行架构和设计。

    一、抽象思维

    如果要问软件研发/系统架构中最重要的能力是什么,我会毫不犹豫回答是抽象能力。抽象(abstraction)这个词大家经常听到,但是真正理解和能讲清楚什么是抽象的人少之又少。抽象其实是这样定义的:

    对某种事物进行简化表示或描述的过程,抽象让我们关注要素,隐藏额外细节。

    举一个例子,见下图:

    你看到什么?你看到的是一扇门,对不对?你看到的不是木头,也不是碳原子,这个门就是抽象,而木头或者碳原子是细节。另外你可以看到门上有个门把手,你看到的不是铁,也不是铁原子,门把手就是抽象,铁和铁原子是细节。

    在系统架构和设计中,抽象帮助我们从大处着眼(get our mind about big picture),隐藏细节(temporarily hide details)。抽象能力的强弱,直接决定我们所能解决问题的复杂性和规模大小。

    下图是我们小时候玩的积木,我发现小时候喜欢玩搭积木的,并且搭得快和好的小朋友,一般抽象能力都比较强。

    上图右边的积木城堡就是抽象,这个城堡如果你细看的话,它其实还是由若干个子模块组成,这些模块是子抽象单元,左边的各种形状的积木是细节。搭积木的时候,小朋友脑袋里头先有一个城堡的大图(抽象),然后他/她大脑里头会有一个初步的子模块分解(潜意识中完成),然用利用积木搭建每一个子模块,最终拼装出最后的城堡。这里头有一个自顶向下的分治设计,然后自底向上的组合过程,这个分治思维非常重要,我们后面会讲。

    我认为软件系统架构设计和小朋友搭积木无本质差异,只是解决的问题域和规模不同罢了。架构师先要在大脑中形成抽象概念,然后是子模块分解,然后是依次实现子模块,最后将子模块拼装组合起来,形成最后系统。所以我常说编程和架构设计就是搭积木,优秀的架构师受职业习惯影响,眼睛里看到的世界都是模块化拼装组合式的。

    抽象能力不仅对软件系统架构设计重要,对建筑、商业、管理等人类其它领域活动同样非常重要。其实可以这样认为,我们生存的世界都是在抽象的基础上构建起来的,离开抽象人类将寸步难行。

    这里顺便提一下抽象层次跳跃问题,这个在开发中是蛮普遍的。有经验的程序员写代码会保持抽象层次的一致性,代码读起来像讲故事,比较清晰易于理解;而没有经验的程序员会有明显的抽象层次跳跃问题,代码读起来就比较累,这个是抽象能力不足造成。举个例子:

    一个电商网站在处理订单时,一般会走这样一个流程:

    1. 更新库存(InventoryUpdate)
    2. 打折计算(Discounting)
    3. 支付卡校验(PaycardVerification)
    4. 支付(Pay)
    5. 送货(Shipping)

    上述流程中的抽象是在同一个层次上的,比较清晰易于理解,但是没有经验的程序员在实现这个流程的时候,代码层次会跳,比方说主流程到支付卡校验一块,他的代码会突然跳出一行某银行API远程调用,这个就是抽象跳跃,银行API调用是细节,应该封装在PaycardVerification这个抽象里头。

    二、分层思维

    除了抽象,分层也是我们应对和管理复杂性的基本思维武器,如下图,为了构建一套复杂系统,我们把整个系统划分成若干个层次,每一层专注解决某个领域的问题,并向上提供服务。有些层次是纵向的,它贯穿所有其它层次,称为共享层。分层也可以认为是抽象的一种方式,将系统抽象分解成若干层次化的模块。

    分层架构的案例很多,一个中小型的Spring Web应用程序,我们一般会设计成三层架构:

    操作系统是经典的分层架构,如下图:

    TCP/IP协议栈也是经典的分层架构,如下图:

    如果你关注人类文明演化史,你会发现今天的人类世界也是以分层方式一层层搭建和演化出来的。今天的互联网系统可以认为是现代文明的一个层次,其上是基于互联网的现代商业,其下是现代电子工业基础设施,诸如此类。

    三、分治思维

    分而治之(divide and combine或者split and merge)也是应对和管理复杂性的一般性方法,下图展示一个分治的思维流程:

    对于一个无法一次解决的大问题,我们会先把大问题分解成若干个子问题,如果子问题还无法直接解决,则继续分解成子子问题,直到可以直接解决的程度,这个是分解(divide)的过程;然后将子子问题的解组合拼装成子问题的解,再将子问题的解组合拼装成原问题的解,这个是组合(combine)的过程。

    面试时为了考察候选人的分治思维,我经常会面一个分治题:给你一台8G内存/500G磁盘空间的普通电脑,如何对一个100G的大文件进行排序?假定文件中都是字符串记录,一行约100个字符。

    这是一个典型的分治问题,100G的大文件肯定无法一次加载到内存直接排序,所以需要先切分成若干小问题来解决。那么8G内存的计算机一次大概能排多大的数据量,可以在有限的时间内排完呢?也就是100G的大文件要怎么切法,切成多少份比较合适?这个是考察候选人的时间空间复杂度估算能力,需要一定的计算机组织和算法功底,也需要一定实战经验和sense。实际上8G内存的话,操作系统要用掉一部分,如果用Java开发排序程序,大致JVM可用2~4G内存,基于一般的经验值,一次排1G左右的数据应该没有问题(我实际在计算机上干过1G数据的排序,是OK的)。所以100G的文件需要先切分成100份,每份1G,这样每个子文件可以直接加载到内存进行排序。对于1G数据量的字符串排序,采用Java里头提供的快速排序算法是比较合适的。

    好,经过有限时间的排序(取决于计算机性能,快的一天内能排完),假定100个1G的文件都已经排好了,相当于现在硬盘上有100个已经排好序的文件,但是我们最终需要的是一个排好序的文件,下面该怎么做?这个时候我们需要把已经解决的子问题组合起来,合并成我们需要的最终结果文件。这个时候该采用什么算法呢?这里考察候选人对外排序和归并排序算法的掌握程度,我们可以将100个排好序的文件进行两两归并排序,这样不断重复,我们就会得到50个排好序的文件,每个大小是2G。然后再两两归并,不断重复,直到最后两个文件归并成目标文件,这个文件就是100G并且是排好序的。因为是外排序+归并排序,每次只需要读取当前索引指向的文件记录到内存,进行比较,小的那个输出到目标文件,内存占用极少。另外,上面的算法是两路归并,也可以采用多路归并,甚至是采用堆排序进行优化,但是总体分治思路没有变化。

    总体上这是一个非常好的面试题,除了考察候选人的分治思维之外,还考察对各种排序算法(快排,外排序,归并排序,堆排序)的理解,计算的时间空间复杂度估算,计算机的内外存特性和组织,文件操作等等。实际上能完全回答清楚这个问题的候选人极少,如果有幸被我面到一个,我会如获至宝,因为这个人有成长为优秀架构师的潜质。

    另外,递归也是一种特殊的分治技术,掌握递归技术的开发人员,相当于掌握了一种强大的编程武器,可以解决一些一般开发人员无法解决的问题。比方说最近我的团队在研发一款新的服务框架,其中包括契约解析器(parser),代码生产器(code generator),序列化器(serializer)等组件,里头大量需要用到递归的思维和技术,没有这个思维的开发人员就干不了这个事情。所以我在面试候选人的时候,一般都会出递归相关的编程题,考察候选人的递归思维。

    大自然中递归结构比比皆是,如下图,大家有兴趣不妨思考,大自然通过递归给我们人类何种启示?

    四、演化思维

    社区里头经常有人在讨论:架构是设计出来的?还是演化出来的?我个人基于十多年的经验认为,架构既是设计出来的,同时也是演化出来的,对于互联网系统,基本上可以说是三分设计,七分演化,而且是在设计中演化,在演化中设计,一个不断迭代的过程。

    在互联网软件系统的整个生命周期过程中,前期的设计和开发大致只占三分,在后面的七分时间里,架构师需要根据用户的反馈对架构进行不断的调整。我认为架构师除了要利用自身的架构设计能力,同时也要学会借助用户反馈和进化的力量,推动架构的持续演进,这个就是演化式架构思维。

    当然一开始的架构设计非常重要,架构定系统基本就成型了,不容马虎。同时,优秀的架构师深知,能够不断应对环境变化的系统,才是有生命力的系统,架构的好坏,很大部分取决于它应对变化的灵活性。所以具有演化式思维的架构师,能够在一开始设计时就考虑到后续架构的演化特性,并且将灵活应对变化的能力作为架构设计的主要考量。

    当前,社区正在兴起一种新的架构方法学~演化式架构,微服务架构就是一种典型的演化式架构,它能够快速响应市场用户需求的变化,而单块架构就缺乏这种灵活性。马丁·福乐曾经在其博客上给出过一张微服务架构的演化路线图[附录8.2],可以用来解释设计式思维和演化式思维的差异,如下图所示:

    上面的路线是一开始就直奔微服务架构,其实背后体现的是设计式架构的思维,认为架构师可以完全设计整个系统和它的演化方向。马丁认为这种做法风险非常高,一个是成本高昂,另外一个是刚开始架构师对业务域理解不深,无法清晰划分领域边界,开发出来的系统很可能无法满足用户需求。

    下面的路线是从单块架构开始,随着架构师对业务域理解的不断深入,也随着业务和团队规模的不断扩大,渐进式地把单块架构拆分成微服务架构的思路,这就是演化式架构的思维。如果你观察现实世界中一些互联网公司(例如eBay,阿里,Netflix等等)的系统架构,大部分走得都是演化式架构的路线。

    下图是建筑的演化史,在每个阶段,你可以看到设计的影子,但如果时间线拉得足够长,演化的特性就出来了。

    五、如何培养架构设计思维

    良好的架构设计思维的培养,离不开工作中大量高质量项目的实战锻炼,然后是平时的学习、思考和提炼总结。

    另外,基本的架构设计思维,其实在我们大学计算机课程(比如数据结构和算法)中可以找到影子,只不过当时以学习为主,问题域比较小和理想化。所以大学教育其实非常重要,基本的架构设计思维在那个时候就已经埋下种子,后面工程实践中进一步消化和应用,随着经验的积累,我们能够解决的问题域复杂性和规模逐渐变大,但基本的武器还是抽象、分层和分治等思维。

    我认为一个架构师的成长高度和他大学期间的思维习惯的养成关系密切。我所知道世界一流的互联网公司,例如谷歌等,招聘工程师新人时,对数据结构和算法的要求可以用苛刻来形容,这个可以理解,谷歌级别公司要解决的问题都是超级复杂的,基本思维功底薄弱根本无法应对。

    对于工作经验<5年的工程师新手,如果你大学时代是属于荒废型的,建议工作之余把相关课程再好好自学一把。个人推荐参考美国Berkeley大学的数据结构课程CS61B[附录8.1]进行学习,对建立抽象编程思维非常有帮助,我本人在研究生阶段自学过这门课程,现在回想起来确实受益匪浅,注意该课程中的所有Lab/Homework/Project都要实际动手做一遍,才有好的效果。

    对于演化设计思维,当前的大学教育其实培养很少,相反,当前大学教育大都采用脱离现实场景的简化理想模型,有些还是固定答案的应试教学,这种方式会造成学生思维确定化,不利于培养演化式设计思维。我个人的体会,演化式设计思维更多在实际工作中通过实战锻炼和培养。

    结论

    1. 架构的本质是管理复杂性,抽象、分层、分治和演化思维是架构师征服复杂性的四种根本性武器。
    2. 掌握了抽象、分层、分治和演化这四种基本的武器,你可以设计小到一个类,一个模块,一个子系统,或者一个中型的系统,也可以大到一个公司的基础平台架构,微服务架构,技术体系架构,甚至是组织架构,业务架构等等。
    3. 架构设计不是静态的,而是动态演化的。只有能够不断应对环境变化的系统,才是有生命力的系统。所以即使你掌握了抽象、分层和分治这三种基本思维,仍然需要演化式思维,在设计的同时,借助反馈和进化的力量推动架构的持续演进。
    4. 架构师在关注技术,开发应用的同时,需要定期梳理自己的架构设计思维,积累时间长了,你看待世界事物的方式会发生根本性变化,你会发现我们生活其中的世界,其实也是在抽象、分层、分治和演化的基础上构建起来的。另外架构设计思维的形成,会对你的系统架构设计能力产生重大影响。可以说对抽象、分层、分治和演化掌握的深度和灵活应用的水平,直接决定架构师所能解决问题域的复杂性和规模大小,是区分普通应用型架构师和平台型/系统型架构师的一个分水岭。

    参考:

    1. Berkeley CS61B http://datastructur.es/sp17/
    2. 单块优先 https://www.martinfowler.com/bliki/MonolithFirst.html

    Kotlin 开发者社区

    国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。

    越是喧嚣的世界,越需要宁静的思考。

    合抱之木,生于毫末;
    九层之台,起于垒土;
    千里之行,始于足下。
    积土成山,风雨兴焉;
    积水成渊,蛟龙生焉;
    积善成德,而神明自得,圣心备焉。
    故不积跬步,无以至千里;
    不积小流,无以成江海。
    骐骥一跃,不能十步;
    驽马十驾,功在不舍。
    锲而舍之,朽木不折;
    锲而不舍,金石可镂。
    蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。
    蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。

    展开全文
  • 如何成为一个优秀的程序员

    千次阅读 2016-07-31 10:04:27
    在看这份FAQ之前,你必须先...该文用很大的篇幅讲什么是黑客文化,虽然态度和信仰的确是成功的最关键因素,但是你肯定会想,做不做黑客跟我没关系,我只是想学一技之长,找好工作而已,对吧?那么肯定更希望获得

    原文地址:http://www.blogjava.net/jalor/articles/299143.html

    在看这份FAQ之前,你必须先读完ESR的《如何成为一名黑客》(本文末尾附有中译版),该文所讲过的道理我不再重复。该文用很大的篇幅讲什么是黑客文化,虽然态度和信仰的确是成功的最关键因素,但是你肯定会想,做不做黑客跟我没关系,我只是想学个一技之长,找个好工作而已,对吧?那么肯定更希望获得一些具体的可操作的指导。

      1、各种软件技术之间是怎样的关系? 
        我把软件技术分为三个层次:
        问题域:计算机图形学、音视频编码、信息安全、模式识别、信息检索、自然语言分析、人工智能、科学计算等;
        
    系统集成:C++和Java等面向对象语言、Python等解释型语言、LISP等函数式编程语言、GUI、中间件、编译器与解释器、虚拟机、数据库、网络服务、并行计算、集群、Peer2Peer、系统管理等;
        系统功能:硬件描述语言、计算机体系结构与编程模型、指令集与汇编语言、C语言、内核、文件系统、设备驱动、网络协议、POSIX等。

        
    计算机最终是做什么用的呢?最终是通过问题域的各种技术为用户解决问题的,这些技术都包含很高深的算法,然而它们必须在一个平台上运行,它们需要利用平台提供的各种基础设施,比如计算能力、I/O能力和网络互联能力。系统功能和系统集成层就是用来实现这个平台的。系统功能层实现计算、I/O和网络的基本功能,系统集成层对这些基本功能做一些抽象和包装,提供更方便灵活的接口。

        2、为什么要学习嵌入式技术? 
        
    在亚嵌的学习期间,你将详细了解系统功能层的各部分是如何工作的,也会在面向对象编程、GUI、数据库、网络服务等系统集成层的技术方向进行探索。嵌入式系统可说是麻雀虽小五脏俱全,虽然没有PC和服务器那么复杂,但计算机系统的各种组成一样也不缺。因此,以嵌入式系统作为切入点开始学习软件技术是非常好的选择,避开不必要的复杂性,把握计算机系统最根本的概念和技术要点。打下扎实的基础之后,你的职业发展则完全不必局限于嵌入式领域,即使你日后做PC或服务器开发,在亚嵌所学的知识和技能同样使你终生受益。正如庖丁解牛,心中有全牛,自然就能游刃有余。

        
    另一方面,你一定见到各大网站都有大量的宣传,说现在嵌入式行业前景空前的好,嵌入式人才紧缺,有几百万职位空缺等等。这些说法也是对的,但我们需要更深入地理解这说明了什么问题。刚才我们说,嵌入式系统也是一个完整的计算机系统,和PC或服务器没有本质的区别,事实上,嵌入式、PC和服务器的界限已经越来越模糊了。以前的嵌入式就是单片机,只能做简单的运算处理,现在的ARM处理器性能比从前的奔腾还强,打游戏、看电影都没问题,谁能说它不是PC呢?另外有些专用的嵌入式系统已经在充当服务器的功能了,而集群技术更是可以使许多廉价的处理器组合在一起发挥大型服务器的作用。由于嵌入式越来越多地应用到电器、汽车和各种设施上,无处不在,并且与PC、服务器呈融合的趋势,所以嵌入式行业前景空前的好。

        
    那么,为什么说嵌入式人才紧缺呢?其实,学嵌入式系统就是学计算机系统,本质上并没有什么特殊的只有嵌入式系统才有的技术。说嵌入式人才紧缺,其实质上是说真正懂计算机的人才紧缺。现在很多学校的所谓“软件学院”培养的软件人才都是一叶障目不见泰山的:只懂J2EE和.NET,没学过C和汇编;只会调库函数sort(),而对各种排序算法一无所知;设计模式、软件工程讲得头头是道,却不知道好的软件还是要靠牛人靠智商来做的。培养人像蒸包子一样一屉一屉地出,靠软件工程搭一条生产线,然后让熟练工人站在生产线上拧螺丝,幻想着这样就能生产出好的软件,那是把软件工程和程序员的作用本末倒置了。现在嵌入式开发对程序员的素质要求更高了,以上这类“软件人才”不能胜任了,因此说嵌入式人才紧缺。亚嵌的就业班虽然只有几个月,但培养目标是有完整的计算机系统概念的软件人才,而不是只会拧螺丝的软件工人,这正得益于我们始终坚持做嵌入式培训而不是Java或.NET培训。

        3、有人说软件技术变化太快,现在学的东西过两年就要完全淘汰,是吗? 
        
    你知道这话是什么人说的吗?必然是已经被淘汰的人说的。比如Delphi、BCB、PB这些开发工具和语言,都曾经很是风光了一阵,但现在已经完全被Java和.NET取代了。那么Java和.NET会不会被取代呢,也许在相当长的时间内还不会,但是我看好Python。

        
    这些被淘汰的程序员有一些共同的特点:只会用鼠标拖拽控件,离开IDE就不知道如何工作,学点儿花拳绣腿的功夫就想吃一辈子,对学习新技术不感兴趣,做一天和尚撞一天钟。现在请回头看看FAQ1,在整个软件技术领域,这些变化快的技术其实只占了很小的一块,却成了这些人的全部看家本领,这样的人能不被淘汰吗?

        
    与这些流行的开发工具和语言相反,很多技术和思想是很少变化的。比如,POSIX和SUS标准规定了一套系统函数接口和基本命令的语义,只有实现了这些才可以称作UNIX,因此今天的Linux、Solaris跟20多年前的UNIX在系统功能层上是基本一致的。而指导计算机科学发展的数学理论,甚至是老祖宗们在计算机还没诞生的年代就替我们想好的:布尔代数发表于19世纪,直到一个世纪后发明了计算机和数字电路才有了用武之地;数论在17世纪就出现了,一直都被数学家们当成一套好玩的理论,但只是好玩而已,直到计算机密码学诞生后才发现它的实际用处。

        
    各种流行的开发工具和高级语言虽然变化很快,但是底层的编程语言却非常稳定,各种操作系统的内核都是用C语言写的,以前是这样,以后也不会改变。另一方面,各种编程语言的设计思想也是非常稳定的。其实世界上只有两种编程语言,一种是C,一种是LISP,前者是imperative的,是对计算机模型的抽象,后者是functional的,是对数学函数模型的抽象。面向对象是一种重要的软件工程思想,却算不上一种新的语言模型,应该归在C的一类。属于同一类的各种语言其实都大同小异,一个精通C++的人学习Java需要多长时间?熟悉语法一个星期,熟悉类库三个星期,一个月足矣,以往的经验都可以套到新的编程语言上。然而要想习得深厚的算法功底、逻辑思维和抽象思维修养,能够真正说清楚“系统”是什么,如何分析和设计“系统”,需要多长时间?恐怕要数十年。

        4、C和Java哪种语言更好? 
        
    计算机科学与编程语言无关,甚至与计算机本身也没太大关系,它研究的对象并不是计算机,而是人分析问题解决问题的方法论。程序写出来最主要不是为了给计算机执行的,而是为了给人看的,使用编程语言和使用自然语言一样是为了表达和交流,只不过程序还可以顺便给计算机执行而已。

        
    以上这些话并不是我说的,而是一位著名的计算机科学家说的。所以,在编程语言的层面上争论是没有意义的。很多初学者错误地认为掌握了编程语言就等于学会了计算机,一种编程语言都还没有掌握好,更没有上升到方法论的层面,只有这种无知的人才会去争论哪种语言好的问题。掌握了编程语言远远不等于学会了计算机,而只是最开始的一步,最简单的一步,到了工作中,用到什么语言就去学什么语言,什么语言过时了就丢掉,编程语言不需要积累因为它太简单了,真正需要积累的是方法论。

        
    很多人喜欢参与到这类争论之中,毫无例外,每个人都在为自己熟练掌握的编程语言辩护,就是“我会的语言最好,我不会的语言都不好”,其实这些人真正想说的是“我会的语言最好是千秋万代,我就不必学新的语言,不必适应新的变化了”,概括起来说就是一个字,懒。真正的高手都是会很多编程语言的,国外有些做技术咨询的,每年都要学好几门新的编程语言,这样才能应对市场的变化。不断丢掉旧的编程语言学习新的,看起来好像完全是白费力气,没有积累,其实,每种编程语言的设计都有独到之处,体现了每种语言的精髓,在融汇百家之后积累下来的正是方法论。

        
    争论哪种语言能做的事情更多、功能更强是没有意义的。从理论上说,任何一种符合图灵机模型的编程语言,加上适当的I/O扩展都可以做任何事情,用shell脚本也可以写出很像样的游戏来。只不过各种语言的设计目标不同,表达能力不同,做不同的事情所需的代码量不同而已。

        
    另外一种错误认识是:哪种语言的市场最大,开发人员最多,哪种语言就最好。单从这种意义上说,Java的确比C更好,所以往届有学员问我们为什么只教C语言。请你注意,操作系统内核是用C写的,各种底层的应用程序包括Java虚拟机也是用C写的。如果你想学Java,在亚嵌的学习完成后你将有能力分析Java虚拟机的实现,站在计算机系统的高度来学Java才会使你成为真正的Java高手。如果你只想速成,想早点学成一门技术去做拧螺丝的工作,那么亚嵌不适合你。

        
    在FAQ3里说过,世界上有C和LISP两种编程语言,你现在学了C,以后学了C++、Java、.NET等等,也仍然只认识了半个世界。LISP和Haskell构成了另外半个世界,现在很常见的Python和JavaScript等解释型语言也借用了functional 
    programming的思想。如果你只管闷着头写代码,而不去广泛涉猎,那么你将错过很多精彩。

        5、我听说编程编到三十五岁就没人要了一定要转行找出路是吗? 
        
    这个观点虽然很流行,但根本不值一驳。现在三十五岁转行的那些人,都具有前面所说的那些特征,对学习新技术不感兴趣,对探索计算机的本质不感兴趣,得过且过,下了班就是打游戏、看电视,总之就是懒。如果是开出租、摆摊,勤快人懒人都有饭吃,而IT这一行对懒人是非常无情的,懒人就不该入IT这一行,不从自身找原因,却到处散布这种言论,怪社会不好,打击新人的信心,着实可恨。

        
    另外一种情况,编程编到三十五岁,进入公司的管理层,或者自己创业,这都是很勤快的人,如果他们把这种勤快用在技术上肯定也可以做得更好,所以也无法证明编程编到三十五岁会因为没有出路而转行。

        
    编程不是个体力活,需要高强度的思考和智力投入,分析能力、思考能力都需要时间积累起来,所以并不是越年轻干得越好。相反,我认为三十岁以前写的代码都是垃圾,三十岁以后才能写出像样的程序来。如果希望一辈子走技术的道路而不会被迫转行,就要不断地把自己的工作性质从“体力活”变成“脑力活”。什么叫“不断地”变呢?这里的“体力活”并不是指种地、盖房子这种劳动,而是指简单重复地编写代码,这时你会感觉,派给你的工作都能凭以往的经验轻松应付了,但是千万不要满足于现状,就像温水煮青蛙一样,这是危险的处境!要摆脱这种处境就需要学习、思考、提高,让公司派给你更有挑战性的工作,在工作中应用新学到的知识和技术就是“脑力活”了,但是用得久了又会变成简单重复的“体力活”,这时就需要再学习、再提高,所以叫做“不断地”把自己的工作性质从“体力活”变成“脑力活”。如果有一天你发现,自己长期陷于简单重复的劳动之中,并且业余时间非常少,无法学习提高,这说明公司不会用人,你就该考虑跳糟了。

        
    从另外一个角度来说,如果希望一辈子走技术的道路,就要有自己的核心竞争力,这个核心竞争力决不是凭以往的经验能够做某些工作的能力,而是学习能力、思考能力和解决有挑战性的新问题的潜力。在IT这一行,凭借以往的经验干重复的活是干不长久的,原因很简单,一个问题不会被解决两次,当你发现你的经验能够解决一类问题时,别人早把解决这一类问题的套路编写成framework,新上手的人即使不具备你的这些经验也可以调用framework中的类和函数来解决问题,然后在这个framework的基础上积累新的经验解决新的问题。正因为如此,全世界开发人员的经验才会积累起来,促使软件技术发展得如此迅速。这并不是说经验完全没有用,最关键的,学习和思考也是建立在以往经验的基础之上的。另一方面,现有的framework并不一定是某方面开发经验的完美整合,也需要不断发展,用新的办法重新解决老问题,以Web开发为例,从早期的ASP、PHP到后来的.NET、J2EE,到现在的Ruby 
    on 
    Rails、Django等等,这些framework解决的是同一问题,就是如何快速有效地开发Web应用,这方面的经验被不断重新整合,推陈出新。总结一下,什么才是核心竞争力呢?应该是在经验的基础上学习新技术、解决新问题的能力。

       6、做驱动开发还是做应用开发更有前途? 
        
    意思就是说,“你告诉我哪个更有前途,我就好好学哪个,另外一个就不用学了”。问这种问题的学员往往会同时问另外一些问题:我以后就想做驱动开发,你教我这些应用开发的技术有什么用?C++用得多吗?学了有什么用?我以后不想做GUI,你教我Qt有什么用?

        
    学习最忌讳的就是“有用的就学,没有用的就不学”这种功利的态度。两个问题:第一,在你还没学进去、还不了解这种技术时,要如何判断这种技术学了有没有用?只能是根据道听途说,看各种论坛上都怎么说的,岂不知论坛上参与这种讨论的100%都是菜鸟,有的水平还不如你。第二,就算你学的技术没有用上,有什么损失吗?从亚嵌毕业的学员从事各种各样的开发工作,有做驱动的,有做系统编程的,有做GUI的,有做Web开发的,只要确定了做一类工作,就不可能把在亚嵌四个月学的知识都用上,但至少也用得上3/4的知识,假设剩下的1/4你一辈子也没机会用上了,那也就损失你一个月的学习时间而已,相比于你的收获,这算是很大的损失吗?请注意,上面的假设是不成立的,没用上的那1/4也只是暂时没用上而已,程序员要换工作或者换项目是很常见的,任何人都不可能只涉及一类开发工作,只要有扎实的基础、完备的知识体系,任何工作都能轻松上手。

        
    扎实的基础,完备的知识体系,我们在安排就业班课程体系的时候,正是以这两点为依据的。有的课程内容很少有学员在以后工作中会用到,但是缺了这一环就不成为一个完备的知识体系,例如MMU和Cache,那这种课该不该上呢?毫无疑问该上。有的课程培养一种基本的编程思想,例如通过C++来讲面向对象编程,通过Qt来讲面向对象、事件驱动和状态机编程,这些编程思想是程序员必备的基本素质,而C++和Qt可能有些学员以后工作用不到,那这种课该不该上呢?毫无疑问该上。至于还有些人争论说C++不如Java用得多,Qt不如GTK用得多,请翻回去看FAQ4,这种争论是无意义的,有工夫争论谁优谁劣,不如把两种都学了,会更有收获。

        
    回到做驱动开发还是做应用开发更有前途的问题。我只能说,做好了都有前途,做不好都没有前途,只会做一样而完全不懂另一样是最没前途的。不要以为内核开发者就不写应用程序,Linus写了一个源代码管理系统git来维护内核,因为觉得现有的源代码管理系统都不好用。牛人都是这样,需要什么就写什么,才不管是kernel 
    space还是user 
    space。同样,做应用开发如果不懂内核,也没有办法很好地利用内核提供的服务写出性能最优的程序。做内核难,因为调试难,要跟踪大量的并发线程,因为入门难,要写一个hello 
    world都需要学很多知识。做应用也难,回头去看FAQ1,计算机科学从理论到实践大部分都在上面两层做文章。所以不存在哪个更难哪个更有前途的问题,任何关于哪个更难的讨论都是too 
    naive的。

       7、我一开始看什么书都看不懂,怎么才能理出一个学习顺序? 
        
    以前有个学员在学C语言时说,“C语言很多地方都很奇怪,都得用内核的知识去解释,可是你又不先教我内核,我没法学C语言。我只好自己看操作系统的书,看内核代码,可是看不懂。”当然看不懂了,内核代码都是用C写的,如果不学内核就没法学C语言,那不学C语言又怎么可能看懂内核?看来这是一个鸡生蛋还是蛋生鸡的问题。

        
    懒真的是人的本性,就连学习的过程都希望是一条路顺利地走下去,不用动脑就能学会的:身后走过的路都是“已知”,每走一步就把眼前新的“未知”变成“已知”,如此一路走来,把所有的“未知”都变成“已知”就算学成了。可惜,知识不是一条路,而是一个圈,你从任何一个地方跳进这个圈开始走,身后都是“未知”,眼前也都是“未知”。有的人就是不能容忍自己的身后是“未知”:看一本书,一个新的概念A是用我不了解的概念B、C来解释的,我连B、C都不懂怎么学A?没法学了!

        
    不是人家书写得不好,而是没有任何办法能把一个圈扯成一条直线的。学习的过程本质上就是一个循环往复的过程,唯一的办法就是“存疑”:在本子上记着,有B、C这样两个概念是我暂时不理解的,然后就不再去想这回事,而是相信自己已经理解了B、C,基于自己的理解和假设去学习A,由A再去理解X、Y,这样学下去,走完一圈之后再回来,自然就明白当初对B、C的假设正确不正确了,理解了这两个概念,就从本子上划掉,这时需要再走一圈,把原来的一些错误认识纠正过来。所以,任何书都要至少看两遍,第二遍看的时候你会对很多概念有新的认识,因为你看过这个概念后面的章节,在此基础上产生了新的认识。古人早就明白这个道理,所以提出了“温故而知新”。

        
    亚嵌的课程体系经过多年教学实践的锤炼,已经很好地理顺了知识之间的关系,使你从最佳的位置跳进这个圈开始学习,所谓“最佳位置”是指,在你初学的时候需要容忍的“未知”尽可能少,需要做的假设尽可能少,但要想消除所有的“未知”是不可能的,例如没有学内核就要学C语言。根据你以往的经验和一些运气因素,你对内核的一些假设可能正确也可能错误,但这并不影响你学C语言,对内核的一些错误假设可能会导致在学C语言的过程中有些误解,但没关系,只要跟着我们的课程体系一步一步走下来,这些误解和错误的假设最终都会纠正过来。

        8、有哪些好书可以推荐一下吗? 
        
    能问出这个问题的都是聪明的学员。看书学习是入门过程中非常重要的一环,如果用一本烂书入门,浪费时间还是小事,如果被误导了就麻烦了,如果形成的错误认识不能及时纠正,变得根深蒂固了就更麻烦了。所以,看书一定要有“品牌意识”,在决定看书学习一门技术时先问问这一领域最权威的书是哪本,这里列举一些Bible级别的书:
        The C Programming Language, 2nd Edition;
        C++ Primer, 4th Edition;
        Structure and Interpretation of Computer Programs, 2nd Edition;
        Introduction to Algorithms, 2nd Edition;
        Compilers: Principles, Techniques, and Tools;
        Advanced Programming in the UNIX Environment, 2nd Edition;
        TCP/IP Illustrated, Volume 1: The Protocols;
        UNIX Network Programming Volume 1, 3rd Edition: The Sockets Networking API;
        Understanding the Linux Kernel, 3rd Edition;
        Linux Device Drivers, 3rd Edition。

        
    在学习过程中,眼界一定要开阔,不要学到一点东西就沾沾自喜,坐井观天,以为这就是技术的全部。要多和别人交流,多了解别人在看什么书、别人对技术的认识是怎样的。书是看不完的,活到老学到老,对于程序员来说尤其如此。

       9、如何处理打游戏和学习的关系? 
        
    ESR的文章中也说过,黑客们都有一些特别的业余爱好,并且往往是非理性思维的爱好,大概是需要换换脑子吧。典型的例子是因滑翔机事故去世的Stevens,他写了FAQ8所推荐的Bible当中的三本。爱打游戏的优秀程序员肯定大有人在,有一些还成了优秀的游戏开发人员。但是我认为,要想成为优秀的程序员,必须有两点基本素质,一是对编程非常感兴趣,二是对所有别的事情都不感兴趣,或者都不如对编程感兴趣。有人说,人的一天有24小时,8小时休息,8小时上班,另外的8小时在干什么就决定了你以后有多大发展。一有时间就看书学习,这就是一个程序员应该做的。今天打游戏,明天看电影,后天炒股,那么你就等着三十五岁下岗。如果你不能够认同编程和思考是比其它事情更有吸引力的,那么你不必学编程,集中精力去做最喜欢的事情或许会有更大的成就。

    展开全文
  • 团队培养和团队管理

    千次阅读 2020-03-15 03:30:43
    文章目录团队建设核心观点团队管理核心观点团队培养 团队建设核心观点 关注人的成长,它的价值从长远看会大于当前的项目目标; 创建优质的环境,让团队成员可以最大限度发挥出自己的潜力;(软:实现专业价值,给予...
  • 一个优秀的团队应该具有的价值观

    千次阅读 2021-01-17 17:02:25
    第一:树立全局观念每个员工都应该树立全局观念,一个人要想在工作中快速成长,就必须把自己的工作纳入全局,依靠集体的力量来提升自己;每个员工都应该理解并支持企业的整体目标,当每位员工都拥有全局观念并为企业...
  • 基层管理者必备的能力和素质

    千次阅读 2020-02-07 10:56:29
    8 指导与培养下属的能力 三 素质 1 强烈的使命感和工作热情 2 宽广的胸怀与气度 3 善于学习、勤于思考、勇于实践 4 良好的管理能力与技巧 5 强兵先强将,练兵先练官 四 总结 引言 基层...
  • 作者:座头鲸右边的蕊妮 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。...有了上述三点,你离成为管理者就不太远了。而这三点,分别对应我下面讲的:闭环、Think B..
  • 如何成为优秀CTO

    千次阅读 2018-11-09 07:54:15
    在我看来, CTO 是一个能够与其他技术人交流技术并引导他们更好的完成项目执行的人。 另一方面, CTO 是一个保护技术团队免受外部干扰的人,并勇于在需要时承担错误责任的人。 在很多缺乏技术人员的创业公司...
  • 一个员工的离职成本,很恐怖!

    千次阅读 2020-08-21 23:13:29
    一个员工离职后留下的坑,并不是再找一个人填上就万事大吉了。一般来说,核心人才的流失,至少有1-2个月的招聘期、3个月的适应期,6个月的融入期;此外,还有相当于4个月工资的招聘费用,超过40%的失败率。 《财富...
  • 如何成为优秀的软件工程师

    千次阅读 2018-09-07 08:57:18
    写在前面:作为名十五年的前端码农,最近一直在想着把自己工作中积累的经验分享给大家,一起进步,所以于1月前开通了这公众号,这公众号以后会不定期分享一些我工作中涉及的软件前端专业知识、遇到问题的...
  •  第一,要管理好自己,要成为一个优秀团队的管理者,自己在各方面一定要做得最好,是团队的榜样,要让大家对你信服.要把优良的工作作风带到团队中去,影响到每一位团队中的成员,作为一个管理者,要有海阔天空的胸襟...
  • 本课程以帮助管理者“突破管理瓶颈”为核心,以“全面、易懂、实用”为原则,讲授管理者应掌握的基本管理理念和方法,为学员提供关于如何处理实际工作的操作性建议,就管理者的角色定位、基本职责进行探讨和分析,...
  • 然而,对于团队建设所关心的沟通、学习、激励、文化培养等问题,管理者应该如何去做?面对团队绩效,绩效考核的思想是否正确?面对人才流失,如何尽力去避免?带着这些问题,笔者与支付宝成都研发中心资深经理张林...
  • 2019-10-07阅读(239)如果是150分的试卷,成绩等级分为优秀(A)、良好(B)、及格(C)、不及格(D)四等级。各个等级的成绩计算如下:优秀(A):数学、英语127.5分及以上,语文120分及以上。良好(B):数学、英语112.5~127...
  • 技术到管理岗位的角色转换:从优秀骨干到优秀管理者 作者:王珺之 前言 目前,我国企业95%的中层管理者都是从技术骨干提拔上来的,有相当部分从技术骨干提拔上来的新任管理者都存在着诸多的困惑和问题。...
  • 对企业而言,拥有优秀的中层团队,上可培育优秀的高层管理人才,下可替企业培养更多的后继管理者;中层团队的品质如何,直接决定着企业人才发展管道是否通畅。 因此,管理界把企业中层形象的比喻为“腰”。如果...
  • 读书笔记—《销售铁军》随记8

    千次阅读 2019-09-23 09:23:35
    人到30岁,会面临一个比较大的转型,常言道“三十而立”,不仅仅是生活、精神上,还包括人生的目标和方向。30岁之前从实习到现在,从事了技术研发、系统运维、项目管理、部门管理、技术负责人、产品管理、海外业务线...
  • 很多人都觉得成为管理者风光无限,但是却没有看到他们背后的艰辛,要管理项目,带领好一个团队,但是这不是一件简单的事,管理者要对团队成员进行合理化的分工,使成员们能够发挥所长,又要让成员间的互相配合,因为...
  • 如何让自己成为一个优秀的Java架构师,而不是码农 和大家介绍下我目前所从事的工作。 我目前从事分布式服务架构的设计与开发工作,在阿里的大数据平台上进行应用程序开发。我们整个系统架构采用了“前后端...
  • 感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式...曾经数据分析师是一个被严重低估的岗位。在陈老师12年前...
  • 软件研发类的人才属于高层次的、需要有创造性的知识型人才,因此从各类院校选拔优秀的应届毕业生加入软件研发队伍并加强培养,是软件研发人才队伍梯队建设健康稳定的持续保障。 应届毕业生入职后,应进行统一的规范...
  • 优秀辅导工作案例

    千次阅读 2019-09-26 07:26:10
    案例中渗透了导们的学生工作理念,展现出辅导在学生工作理论、方法指导下解决问题的方法与策略。 案例概述 陈某,女,会计电算化专业2015级学生,来自安徽阜阳。该生性格较为内向,朋友较少,刚入学时成绩处于中...
  • 教材建设是高校教学基本建设...从教材建设的基本原则、学校规划教材建设、优秀教材的选用以及学校现行的教材管理体制四方面探讨了教材建设的管理思路,希望能够为学校或其他高校教材管理者提供一些有益的借鉴和参考。
  • 这几年,互联网行业开始慢下来了。前阵子,华为被曝出裁掉了1100 余中层管理者。即使后来任正非发表了封公开信,表示了不知情和不满。但是,当企业裁员的大刀挥向中层管理时,似乎在透露着某些...
  • 本书是由作者于上世纪的1966年撰写和发表的,至今天仍对提高我们...1. 管理最根本的问题,或者说管理的要害,就是管理者和每知识工作者怎么看待与处理人和权力的关系。在德鲁克看来,人是不应该有权力的,人性是软
  • 上次被公司派去听关于中高层人员培养外训,听到位老师推荐了关于VUCA时代的本书《高绩效团队-VUCA时代的五个管理策略》,然后就买来看了一下,发现可以解决我的部分疑虑。今天这篇文章主要还是先回顾一下这本书...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,038
精华内容 16,815
关键字:

如何培养一个优秀的管理者