精华内容
下载资源
问答
  • 做的每一个决定
    千次阅读
    2018-09-13 09:19:48

    这里写图片描述

    这个图大概可以描述mapreduce计算模型的执行过程,下面我们就围绕这个图聊几个问题,其中有工作中非常有用的问题:

    1. mapper的个数 
    结论:mapper的个数是由输入数据的大小决定的,一般不需要我们去设置,如果你想控制mapper的个数,那么需要先了解hadoop是怎么控制mapper的个数。 
    如图所示,每个Mapper Tasker对应一个split(切片),要处理的file被FileInputFormat分成了几个切片就会有几个mapper;FileInputFormat怎么获取的切面呢,直接上源码:

    public List<InputSplit> getSplits(JobContext job)  {
        long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
        long maxSize = getMaxSplitSize(job);
        long splitSize = computeSplitSize(blockSize, minSize, maxSize);
        long blockSize = file.getBlockSize();
        long splitSize=computeSplitSize(blockSize,minSize, maxSize);
    
        }
      protected long getFormatMinSplitSize() {
        return 1;
      }
      public static long getMinSplitSize(JobContext job) {
        return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);
      }
      public static final String SPLIT_MINSIZE = 
        "mapreduce.input.fileinputformat.split.minsize";
     public static long getMaxSplitSize(JobContext context) {
        return context.getConfiguration().getLong(SPLIT_MAXSIZE, Long.MAX_VALUE);
      }
     public static final String SPLIT_MAXSIZE = 
        "mapreduce.input.fileinputformat.split.maxsize";
    
     protected long computeSplitSize(long blockSize, long minSize,long maxSize) {
        return Math.max(minSize, Math.min(maxSize, blockSize));
      }
    

    通过源码得出切片数splitSize由三个元素决定:

    1. blockSize block大小,hadoop1默认64M,hadoop2默认128M
    2. minSize 最小值,默认是 1,我可以通过FileInputFormat.setMinInputSplitSize(job, size)方法来修改最小值;
    3. maxSize 最大值,默认是MAX_VALUE = 0x7fffffffffffffffL,可以通过FileInputFormat.setMaxInputSplitSize(job, size)修改最大值 
      最后做计算:Math.max(minSize, Math.min(maxSize, blockSize)) 
      默认情况下:Math.max(1, Math.min(0x7fffffffffffffffL, 128))显然结果为128,也就是说默认情况下有几个block就有几个切片,这也是为了提高mapreduce的运行效率。

    2.reducer个数 
    结论:reducer个数是由partition个数决定。 
    mapper产生的中间数据经过shuffer过程,根据我们的业务把数据分成若干partition,每个partition的数据由对应的一个reducer来处理。mapreduce决定partition的是:Partitioner类中的intgetPartition(KEY key, VALUE value, int numPartitions)方法,我们来看下默认的分区方法:

    public class HashPartitioner<K, V> extends Partitioner<K, V> {
    
      /** Use {@link Object#hashCode()} to partition. */
      public int getPartition(K key, V value,
                              int numReduceTasks) {
        return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
      }
    
    }

    由代码看出默认的分区有两个元素决定:

    • key的hash值
    • numReduceTasks,需要我们通过job.setNumReduceTasks(reduceNum) 方法来设置的reducer个数 
      最终得出partition个数就是我们设置的个数,比如我们设置job.setNumReduceTasks(3) hashcode除以10的余数就是0、1、2三个值,默认之所以用key的hash值是为了把数据均匀的分布到reducer防止数据倾斜。 
      当然了我们可以根据我们自己的业务来继承Partition类重写getPartition方法来决定partition数。
    更多相关内容
  • 业余时间决定了你的人生

    万次阅读 多人点赞 2017-08-10 12:31:01
    不积跬步,无以至千里;...高效利用时间的第要诀就是:充分利用好你的业余时间。因为它决定了你的人生。把“重要不紧急的事情”摆在前面,因为它决定了你的未来。不要陷入“既不重要也不紧急之事”的陷阱

    一百多年前,有道数学题难住了全世界的数学家:“2的67次方减去1,究竟是质数,还是合数?”

    这是一个数论的题目,虽然它的知名度远不如“哥德巴赫猜想”,但是,破解它的难度,一点儿也不逊于后者。数学家们做过种种尝试,都无功而退。


    出人意料的是,1903年10月,在美国纽约举行的世界数学年会上,一个叫科尔的数学家,面对满场等待他学术报告的听众,一言不发,径直走向黑板,写下了一个等式:

    2^67 - 1 = 193707721×767838257287 = 147,573,952,589,676,412,927

    在一阵寂静之后,台下突然爆发出热烈的掌声。更令人惊奇的是,科尔并不是专门研究数论的数学家,这只是他的业余爱好。


    后来有人问他:“您论证这道题目花了多长时间?” 

    他回答说:“3年来的全部星期天。”


    Frank Nelson Cole (1861 – 1926) 

    这个故事听起来,的确有点鸡汤。但今天之所以用这个故事作为开头,也是因为有人问起我:在繁忙的工作同时,为什么还能有时间出版那么多本专业著作?我几乎是不假思索地回答:业余时间决定了你的人生!


    爱因斯坦说过:“人的差异在于业余时间。业余时间生产着人才,也生产着懒汉、酒鬼、牌迷、赌徒,由此不仅使工作业绩有别,也区分出高低优劣的人生境界。”


    对每一个成功的人来说,时间管理都是很重要的一环。时间是我们最重要的资产,每一分每一秒逝去之后再也不会回头。而且时间对每个人来说又都是相同的——每个人的一天都只有24个小时!


    然而,每个人管理时间的方法和运用时间的效率却都是不同的。时间会根据人们爱惜它的程度,相应的给每个人不同的反馈。这就好比两台机器,一台功率(单位时间内所做的功)更大,那么同等时间内,它的输出也就更大。如果一个人可以更加高效地利用时间,那么久而久之,他与普通人(也就是利用时间效率一般的人)的差距也就会越来越大。

    不积跬步,无以至千里;不积小流,无以成江海。所以,高效利用时间的第一要诀就是:充分利用好你的业余时间。法国大数学家费马就是利用业余时间做出一番大成就的典型——因为费马在生命中的更多专业时间里都是一名律师。他只是偶尔以研究数学为乐趣来充实自己的业余生活,结果便赢得了“业余数学之王”的名号

    当然,要想利用好你的时间,特别是业余时间,只有美好的愿望仍然是不够的。你还要有一个正确的理论指导。而在众多时间管理的方法论中,你最需要知道的就是下面这个“时间的四个象限”理论。

    时间“四象限”法是美国的管理学家科维提出的一个时间管理的理论,他把工作按照重要和紧急两个不同的程度进行了划分,如下图所示,基本上可以分为四个“象限”:既紧急又重要、重要但不紧急、紧急但不重要、既不紧急也不重要。


    毫无疑问,既紧急又重要的事情具有第一优先级。几乎很少有人会在这类事情上出现问题,例如:住院开刀,重大考试将至等等。


    再然后就会出现很多人在行动上的第一个“误区”。做完既紧急又重要的事情之后,正确的选择应该是去做那些重要但不紧急的事情。然而,现实中很多人在处理完第一优先级的事情后,(往往是被裹挟着)就会不由自主地开始干起紧急但不重要的事情来。


    人往高处走,水往低处流。更何况在逆水行舟时,不进则退。对于本来在同一起跑线上的两个人来说,如果在外部环境也相差无几的情况下,假以时日,二人之间出现了明显的差距。那么“往高处走”的那个人所做的事情中“重要但不紧急的”往往占据更大比例。相对应地,另外一个“往低处流”的人所做的事情中“紧急但不重要的”往往占据更大比例。


    紧急但不重要的事情中,除了一些突发的带来干扰的事情,例如突然接到一个推销电话,有不速之客来访等等,其实更多的是“符合别人期望的事情”,所以总是有被人推着的感觉。也因此在陷入这类事情后,你会变得特别忙但同时又是非常盲目地在忙。


    比如说现在中国的程序员应该算是比较忙的一个行业了。你们公司刚好有个项目被客户催得很紧,着急上线。你作为公司里的一颗小螺丝钉当然也是整天忙得晕头转向了。然而你的内心其实并不满足于一直当一颗小螺丝钉,年轻人总是会有这样或那样的抱负或者憧憬。但是你一路做的几个项目下来,除了最开始的几个,后面的项目中你或许更多的只是在做重复性的劳动,也就是说对自己的提升有限。你总是会想着是不是要再学点什么东西给自己充充电,将来再跳上一个更高的平台。但是眼下紧急但不太重要的事情总是缠着你,你就可能会因为上班太累,所以回到家恨不得倒头就睡面对那些抱负和憧憬,你只能告诉自己“等我忙完这阵子再说吧”。殊不知那些未来的抱负和憧憬其实就潜藏在“重要但不紧急的”事情里!


    区分“紧急但不重要的事情”和“重要的不紧急的事情”最关键的地方就在于,后者能带来价值,实现某种重要目标,而前者不能。因为“紧急但不重要的事情”更多地是在迎合别人的期望。“重要的不紧急的事情”因为收不到立竿见影的效果往往会被人貌似不由自主的就给推到第三位阶了。这类事情往往都是一些自我提升方面的事情(例如学一门新的技能,自我充电)或者计划性的准备性的工作(例如为准备投身人工智能行业而学习一些必备的数学基础)。


    “重要的不紧急的事情”虽然不能收到立竿见影的效果,但是它们却恰恰从相当长远的角度影响了你的未来。这个时候你面对的一个窘境可能是:工作太忙了,虽然都是在实现别人的预期,但总不能连工作都不好好干了吧。面对现实的压力和未来的憧憬,你是不是就束手无策了?当然不是,别忘了本文的标题——业余时间决定了你的人生!


    即使你工作再忙,每天总是会有一些零散的闲暇。你要做到仅仅是整合它们并高效的利用。一些准备性的计划性的工作本来就不能一蹴而就。很多事情靠得其实是日积月累。别忘了,费马也只是在闲暇的时候研究数学而已,但重要的是,这个习惯他持续了几十年。




    最后一个象限“既不重要也不紧急”,这个看似应该不会出现问题的地方,有时恰恰是很多人的时间粉碎机。尽管大家都想摆脱既不重要又不紧急的事情,但是这部分内容往往是最难摆脱的,因为它们都相当有诱惑力。例如上网、闲谈、打游戏、睡懒觉等等。好逸恶劳似乎是人的天性,何况生活中又总会很多遇到这样或那样的困难。所以,有些时候那些“既不重要也不紧急”的事情可能空无意义的浪费时间,但也可能是因为不想面对困难本身而选择的逃避性行为。例如,很多人都有为了准备英语考试而去背单词的经历。面对一本厚厚的单词书,确实让人看了会产生“畏难”情绪,让人望而却步。如果你因此而虚度光阴,无疑就是陷入了第四象限的陷阱。我隐约记得某本单词书上写过这么一句话:

    “21天不长,如果不背单词的话,一如既往,21天会很快过去,无所事事的日子总是轻松而愉快。

      21天不短,如果去背单词的话,然而最终,21天还是会很快过去,不同的是你已经脱胎换骨!”。


    最后,我们来总结一下本文的要点:

    • 充分利用好你的业余时间,因为它决定了你的人生。
    • 把“重要不紧急的事情”摆在前面,因为它决定了你的未来。
    • 不要落入“既不重要也不紧急之事”的陷阱。


    (本文完)

    展开全文
  • 一个指针占几个字节?原理是什么呢?

    万次阅读 多人点赞 2019-04-01 14:44:08
    一个指针占几个字节的问题,感觉会C语言的同学都知道。但是在面试过程中,面了几个同学,不是答忘记了,就是两个、四个的瞎蒙。。。 那么,一个指针到底占几个字节呢? 其实,这个问题很简单,稍微上网一搜,你就...

    一个指针占几个字节的问题,感觉会C语言的同学都知道。但是在面试过程中,面了几个同学,不是答忘记了,就是两个、四个的瞎蒙。。。

    那么,一个指针到底占几个字节呢?

    其实,这个问题很简单,稍微上网一搜,你就知道:
    一个指针在32位的计算机上,占4个字节;
    一个指针在64位的计算机上,占8个字节。

    这么简单的问题,为什么面试官愿意问呢?其实这个问题不是在考你的记忆能力,是在考察你的计算机基础能力。就比如,在你答出来4个字节的情况下,面试官会问一句:

    为什么呢?

    首先,我们要明白,指针就是地址,地址就是指针。 而地址是内存单元的编号。所以,一个指针占几个字节,等于是一个地址的内存单元编号有多长。
    我们都知道,在计算机中,CPU不能直接与硬盘进行数据交换,CPU只能直接跟内存进行数据交换。而CPU是通过地址总线、数据总线、控制总线三条线与内存进行数据传输与操作。
    在这里插入图片描述

    问:假如,我们想通过CPU在内存中读取一个数字3,那么是怎样一个操作呢?

    首先,CPU通过地址总线,在内存中找到数字3的地址;
    然后,通过控制总线知道该操作是读还是写;
    最后,通过数据总线,把数字3传输到CPU中。

    我们可知道:
    地址总线的宽度决定了CPU的寻址能力;
    控制总线决定了CPU对其他控件的控制能力以及控制方式。
    数据总线的宽度决定了CPU单次数据传输的传送量,也就是数据传输速度;

    这是几种总线的类型以及简单功能。

    我们平时所说的计算机是64位、32位、16位,指的是计算机CPU中通用寄存器一次性处理、传输、暂时存储的信息的最大长度。即CPU在单位时间内(同一时间)能一次处理的二进制数的位数。
    假如,某计算机的地址总线是32位,那么其一次可以处理的信息是32条,每一条地址总线有0或1两种可能,那么32根地址总线一共有232种可能,也就是其描述的地址空间为0x0000 0000 0000 0000 ~ 232-1。
    我们一般需要32个0或1的组合就可以找到内存中所有的地址,而32个0或1的组合,就是32个位,也就是4个字节的大小,因此,我们只需要4个字节就可以找到所有的数据。所以,在32位的计算机中,指针占4个字节。同理,在64位的计算机中,指针占8个字节。

    同时也可以看出,由于地址总线为32,那么每次寻址的空间为0x0000 0000 0000 0000 ~ 232-1,那么CPU的最大内存为232Byte=222KB=212MB=22GB=4GB。
    而64位,最大内存是264Byte。

    更多学习关于指针变量占几个字节,请参考郝斌老师的C语言第P139集

    看完视频的同学,可以看到老师讲的是:一个指针变量占几个字节
    指针变量里面存放的是:某一类型的数据的第一个地址值。
    也就是地址值占几个字节,指针变量就占几个字节
    因此,
    一个指针占几个字节
    一个地址占几个字节
    一个指针变量占几个字节
    三种问法等同
    不过,严谨些说,该题目改为 一个指针变量占几个字节 更为贴切些

    举个例子

    内存地址就像一条路上的门牌号,用几位表示需要看门牌数量。
    门牌号从0号开始编排,到232-1号结束,一共就有232个门牌号。分别为二进制的
    000000000000000000000000000号
    000000000000000000000000001号
    000000000000000000000000010号
    最后
    111111111111111111111111110号
    111111111111111111111111111号
    每个门牌的号码是32位(二进制),一个字节为8位,32位就是4字节。


    其他知识点:

    1位=1bit=1比特,表示一个二进制0或1

    1字节(Byte) = 8位=8bit=8比特

    数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。

    1个英文字母(不分大小写)占一个字节的空间

    计算机能够处理的最小单元是 字节 而不是 位
    位,是由软件通过位运算符操作的

    指针和指针变量的区别

    内存地址是内存单元的编号
    指针就是地址,地址就是指针;
    指针变量就是存放地址的变量,也可以说,指针变量就是存放指针的变量
    例如:
    int *p中p就是指针变量。
    需要注意:通常我们叙述时,会把指针变量简称为指针,实际上它们的含义并不一样

    在这里插入图片描述

    发现有些同学对地址、指针、指针变量还是分不太清,建议把郝斌老师的C语言有关指针的内容看一下,强烈安利
    没时间看的,可以把P123P126这四节课看一下

    展开全文
  • 一个对话让你明白架构师是什么的?

    万次阅读 多人点赞 2019-03-11 10:56:31
    阅读本文大概需要 6 分钟。 很多人都想知道架构师是什么?我们看看下面的一段对话。 菜鸟—— 刚入门的程序员 ...菜鸟:我要领导一个团队,还要所有关于数据库、框架和Web服务器的重要决定。 老鸟...

    阅读本文大概需要 6 分钟。

    很多人都想知道架构师是做什么?我们看看下面的一段对话。

     

    菜鸟 —— 刚入门的程序员

    老鸟 —— 资深架构师

     

    老鸟:菜鸟,你的目标是什么?

    菜鸟:我要成为一个软件架构师。

     

    老鸟:对一个年轻的工程师来说,这是一个很好的目标。那你为什么要成为架构师呢?

    菜鸟:我要领导一个团队,还要做所有关于数据库、框架和Web服务器的重要决定。

     

    老鸟:好吧,如果是这样,你就没必要成为一个软件架构师了。

    菜鸟:当然有必要了!我要成为一个能够做所有重要决定的人。

     

    老鸟:这样很好,只是你没有列出哪些才是重要的决定。你刚才说的那些跟重要的决定没有什么关系。

    菜鸟:你说什么?难道数据库不重要?你知道我们在数据库上面花了多少钱吗?

     

    老鸟:可能很多。不过数据库仍然不是最重要的。

    菜鸟:你怎么能这么说呢?数据库可是整个系统的心脏啊!所有的数据都保存在这里,它们在这里被排序,被索引,被访问。如果没有数据库,整个系统就无法运作!

     

    老鸟:数据库只不过是一个IO设备,它提供了一些有用的工具对数据进行排序、查询,并生成报表,但这些工具都只是整个系统的附属品。

    菜鸟:附属品?真是不可思议。

     

    老鸟:是的,附属品。你的系统业务逻辑或许会用到这些工具,但这些工具并非业务逻辑固有的组成部分。如果有必要,你可以随时替换掉这些工具,但业务逻辑还是那些业务逻辑。

    菜鸟:好吧,不过如果把这些工具替换掉,我们就要重新实现业务逻辑了。

     

    老鸟:那是你的问题。

    菜鸟:为什么这么说?

     

    老鸟:你认为业务逻辑依赖数据库,但实际上不是这样的。如果你的架构足够好,最起码业务逻辑不应该依赖数据库。

    菜鸟:这太疯狂了。我怎么可能创建出不使用这些工具的业务逻辑?

     

    老鸟:我并没有说业务逻辑不要使用数据库工具,我的意思是它们不应该依赖这些工具。业务逻辑不应该知道使用的是哪一种数据库。

    菜鸟:如果业务逻辑对数据库一无所知,它怎么使用这些工具呢?

     

    老鸟:依赖反转。你要让数据库依赖业务逻辑,而不是让业务逻辑依赖数据库。

    菜鸟:你的话让人费解。

     

    老鸟:费解吗?我讲的可是软件架构。这个就是依赖反转原则,让下层策略来依赖上层策略。

    菜鸟:那就更加费解了!既然上层策略(假设你指的是业务逻辑)要调用下层策略(假设你指的是数据库),那么就应该是上层策略依赖依赖下层策略,就像调用者依赖被调用者一样。这是众所周知的!

     

    老鸟:在运行时确实是这样的,但在编译时我们要把依赖反转过来。上层策略的代码里不要引用任何下层策略的代码。

    菜鸟:拜托!不引用代码就无法调用它们。

     

    老鸟:当然可以调用了。面向对象就可以做到。

    菜鸟:面向对象对真实世界进行建模,把数据和函数组合到对象里,把代码组织成直观的结构。

     

    老鸟:这是他们告诉你的吗?

    菜鸟:所有人都知道的,这不是很明显的事情吗?

     

    老鸟:确实如此。不过,面向对象是可以做到不引用也能调用的。

    菜鸟:好吧,那它是怎么做到的?

     

    老鸟:你应该知道,在面向对象系统里对象会给其它对象发送消息的,对吧?

    菜鸟:是的,当然。

     

    老鸟:那么你就该知道,消息发送者是不知道消息接收者是什么类型的。

    菜鸟:这要看使用的是哪一种语言了。在Java里,发送者最起码要知道接收者的基本类型。在Ruby里,发送者知道接收者一定会处理它所发送的消息。

     

    老鸟:是的。不过不管是哪一种情况,发送者都不知道接收者具体的类型。

    菜鸟:嗯,是的。

     

    老鸟:所以发送者可以给接收者传递一个函数,让接收者执行这个函数,这样发送者就不需要知道接收者是什么类型了。

    菜鸟:没错。我了解你的意思。不过发送者仍然依赖接收者。

     

    老鸟:在运行时确实是的,但在编译时不是这样的。发送者的代码里并没有引用接收者的代码。实际上,是接收者的代码依赖了发送者的代码。

    菜鸟:啊!但发送者仍然会依赖接收者的类。

     

    老鸟:看来需要用代码来说明了,我用Java来写些代码。首先是发送者代码:

    老鸟:下面是接收者代码:

    老鸟:可以看到,接收者代码依赖了发送者代码,也就是说SpecificReceiver依赖了Sender。同时可以看到,发送者代码对接收者代码一无所知。

    菜鸟:哈,你作弊了。你把接收者的接口放到了发送者的类里了。

     

    老鸟:你开始明白了。

    菜鸟:明白什么?

     

    老鸟:当然是架构原则啊。发送者持有接收者必须实现的接口。

    菜鸟:如果这意味着我要使用内部类,那么……

     

    老鸟:使用内部类只是方法之一,还有其它的方法。

    菜鸟:请等一下。最开始我们讨论的是数据库,那这些跟数据库又有什么关系呢?

     

    老鸟:让我们来看一下其它代码吧。首先是一个简单的业务逻辑

    菜鸟:这个业务逻辑没有做什么事情啊。

     

    老鸟:这只是个例子。在实际实现业务逻辑的时候,不会有很多类似这样的类的。

    菜鸟:好吧。那么Gateway是用来做什么的呢?

     

    老鸟:它为业务逻辑提供了所有访问数据的方法。下面是它的代码:

    老鸟:要注意,这个接口是在businessRules包里面的。

    菜鸟:好吧。那Something这个类又是用来做什么的呢?

     

    老鸟:它代表一个简单的业务对象。我把它放在另一个叫entities的包里。

    老鸟:最后需要实现BusinessRuleGateway接口,这个实现类会知道相关的数据库细节:

    老鸟:可以看到,业务逻辑是在运行时对数据库进行调用的。而在编译时,是database包引用了businessRules包。

    菜鸟:好吧,我想我明白了。你用多态性隐藏了数据库实现。不过在业务逻辑里,仍然引用了数据库的工具接口。

     

    老鸟:不,不是这样的。我们并没有打算为业务逻辑提供所有的数据库工具接口,而是业务逻辑创建了它们所需要的接口。在实现这些接口的时候,可以调用相应的工具。

    菜鸟:嗯,这样的话,如果业务逻辑需要所有的工具,那么你必须把所有工具都放到Gateway接口里。

     

    老鸟:哈,我觉得你还是没有明白。

    菜鸟:不明白什么?我觉得已经很清楚了。

     

    老鸟:每个业务逻辑只定义它所需要的接口。

    菜鸟:等等,什么意思?

     

    老鸟:这个叫作接口分离原则。每个业务逻辑只使用一部分数据库工具,所以每个业务逻辑只定义能够满足需要的接口。

    菜鸟:这样的话,你就会有很多接口,而且有很多实现类。

     

    老鸟:哈,是的。你开始明白了。

    菜鸟:这样子很浪费时间!我为什么要这样做呢?

     

    老鸟:这样做是为了让代码更干净,并且节省时间。

    菜鸟:算了吧,这样只会增加更多的代码。

     

    老鸟:相反,这其实是很重要的架构决定,这跟你之前所说的那些所谓的重要决定是不一样的。

    菜鸟:什么意思?

     

    老鸟:还记得你刚开始说你要成为一个软件架构师吗?你还想要做所有重要的决定?

    菜鸟:是啊,我是这么想过。

     

    老鸟:你想做所有关于数据库、Web服务和框架的决定。

    菜鸟:是啊,而你却说它们都不重要,还说它们其实跟重要的决定不相干。

     

    老鸟:没错,它们确实跟重要的决定不相干。一个软件架构师真正要做的重要决定都在数据库、Web服务器和框架之外。

    菜鸟:但首先要先决定用什么数据库、Web服务器或框架啊!

     

    老鸟:实际上应该在开发后期才开始做这些事情——在你掌握了更多信息之后。

     

    老鸟当架构师草率地决定要使用一个数据库,后来却发现使用文件系统效率更高

     

    老鸟当架构师草率的决定使用一个Web服务器,后来却发现团队需要的不过是一个socket接口

     

    老鸟当架构师草率地决定使用一个框架,后来却发现框架提供的功能是团队不需要的,反而给团队带来了诸多约束

     

    老鸟当架构师在掌握了足够多的信息后才决定该用什么数据库、Web服务器或框架

     

    老鸟当架构师为团队鉴别出运行缓慢、耗费资源的IO设备和框架,这样他们就可以构建飞速运行的轻量级测试环境

     

    老鸟:当架构师把注意力放在那些真正重要的事情上,并把那些不重要的事情放在一边。

    菜鸟:我完全不知道你在说什么了。

     

    老鸟:好吧,如果在若干年后你还没有转做管理,或许会明白这一切的……

     

    对话来源网络,若有侵权,请联系删除

    通过上面的对话,让我们对架构师有了个简单的了解,那么架构师在一家公司有多重要呢?架构师对一家公司、一个项目有多重要?

    我们来看一看调查的数据

    架构师在公司中担当着「IT架构灵魂人物」的角色,因为他们不仅做着架构师的本职工作,还同时做程序开发,写核心代码。另外,架构师依旧是技术高手,编程能力依然是一流的。

    从图表结果来看,架构师必须具备出色的设计能力、编程能力和沟通能力,在完成本职的架构工作外,还要协调好项目中人员的关系,做出合理的分工,最终完成全部工作。

    最后,看下企业对Java架构师的职位描述与职位要求

    从招聘信息来看,架构师们必须是具有多年的从业经验,有过项目开发经历,精通多门编程语言且熟悉数据库的大咖。所以,想以架构师为目标的读者,就要加倍努力了!

     

    ·END·

    路虽远,行则必至

    本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。

    微信ID:cxydczzl

     

    往期精彩回顾

    程序员接私活的7大平台利器

    教你一招用 IDE 编程提升效率的骚操作!

    作为程序员的你,一年看几本技术相关的书

    大学期间的副业赚钱之道

    5个相见恨晚的Linux命令

    缓存穿透,缓存击穿,缓存雪崩解决方案分析

    为啥程序员下班后只关显示器从不关电脑?

    送给程序员们的经典电子书大礼包

    面试时如何优雅地自我介绍?

    支撑百万并发的数据库架构如何设计?

    一千行MySQL详细学习笔记

    展开全文
  • 目录:前言偏相关或复相关意义与用途分析方法:1、 样本相关系数矩阵、相关系数检验2、 复相关分析3、 决定系数 (RMSE的介绍)小结、前言:继上篇文章,继续探讨相关性分析,这次不再是两变量,而是3或者...
  • 决定系数R2相关知识,以及与相关系数之间的关系

    万次阅读 多人点赞 2021-08-18 10:21:07
    决定系数R2的计算公式有很多,不同条件下用不同的公式进行计算,方可以得到正确的决定系数(拟合优度),下面做一个总结巩固一下知识点。 1、R2值一般为[0-1]之间的值,越靠近1说明拟合的越好。但时常为发生R2大于1...
  • DPOS:Delegated Proof of Stake,委任权益证明 比特股的 DPoS 机制,中文名叫做股份授权证明机制(又称受托人机制),它的原理是让每一个持有比特股的人进行投票,由此产生101位代表,我们可以将其理解为101个超级...
  • 我觉得这篇文章不单单是面向程序猿来讲的,其实比较官方的讲的话,应该更多的讲述种人生思想和认知态度等等,对所有人应该都有所裨益。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
  • 定位决定地位,眼界决定境界

    千次阅读 2014-07-16 23:42:22
    培训告段落,天天嘻嘻哈哈,sui
  • 三种方式评价回归模型结果:误差平方和,R-Square(决定系数),Adjusted R-Square(校正决定系数)。及相关公式。
  • 做好件事的三要素

    千次阅读 多人点赞 2020-02-19 20:25:54
    能否做好件事,心态有着决定性作用。 在做事的时候,必须切实行动,不能抱着试试的心态,如果是这种心态,那么最终都会以失败而告终。 试试的心态更多的是种借口,在还没有之前,我们就给自己找好了退路,...
  • 最近我在使用layui的时候发现,点击左侧菜单右边的tab只是跳转到了对应的页面,但是并没有刷新,本人觉得这种太不人性化了,决定优化一下,然后百度了好久没有找到解决方案,最后决定硬着头皮直接看它底层的实现代码,发现...
  • 在我的理解范畴中,理财是一个big(逼格)比较高的领域,不但需要投入大量的精力和时间来进行各种规划,而且还不能像炒股一样在短时间内就出效果。 我能行吗? 但编辑跟我说,理财分为很多阶段,你现在接触并所...
  • 如何才能成为一个成熟的投资者?

    万次阅读 2021-11-20 21:21:25
    笔者自己也经历过很多大起大落,如今慢慢觉得摸到了一些门道,在这里和大家一起探讨,如何才算是一个成熟的投资者呢? 首先,了解自己,明白自己是个什么样的人。这个很重要,所有的事情都是发乎于心的。你自己的...
  • 一个牛人提供的GIS源码(很好)

    千次下载 热门讨论 2010-08-25 22:49:21
    这个应该是05年的时候的毕业设计,用超图的Supermap IS 2003+SQL Server 2000建立的一个比较的简单的系统,只是玄乎了下就变的有点意思了,甚至也有点学习或者创新的意思。 加上上次发布的论文部分,这样整个系统...
  • 以前想过一个类似问题,就是没有个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。 于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理个人的随机数上。 于是在面试时间就没有解决...
  • 习题31 作出决定

    2020-03-25 17:08:30
    有时候可以,不过这也取决于 if/else 是怎样写的,而且这样一来Python就需要去检查每一处 if/else ,而不是像 if/elif/else 一样,只要检查到第一个 True 就可以停下来了。试着写些代码看两者有何不同。 怎样判断...
  • 图2-1 “一个需求的奋斗史”缩略图 首先说说“从用户中来到用户中去”,任何产品都是一个端到端的过程,端即用户,所以“用户是需求之源”,我们要拥有“以用户为中心的思想”,不断“体会真正的用户”,于是,本...
  • 其实性格决定命运,细节决定成败,知识改变命运,学习成就未来,观念决定行动,思维决定出路,态度决定一切,他们唯一的目的是要你认清自己的短处,发挥自己的长处,慢慢改正自己的缺点。以文章《变色龙》为例,如果...
  • 你必须知道的495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    我在设计一个状态机,用函数表示种状态,个函数都会返回一个指向下一个状态的函数的指针。可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • 一个创客的自述

    2020-03-18 15:43:47
    每一个创客产品的出现都为了解决一个或者多个问题、简化工作流程,或是让生活更加便利。 如果一个产品的诞生不能解决某个问题的话,就不能算是个好产品。2012年,在众筹网站上出现了一个定制明信片的产品,但因为不...
  • 给定一个正整数N,从1到N所有整数,计算出现1的个数
  • 一个大城市有成千上万个路口,个路口不同时段不同季节的交通流量都会有不同的规律,时而发生的交通事故也会对周围几个路口的交通流量产生影响。因此,这种人工设置的方式是非常低效率的。 智能交通控制系统可以...
  • 我们欠用户一个解释

    2020-03-18 15:43:47
    用户能够从何种程度上接收并理解这些信息,不但直接决定了产品的用户体验,还能够间接影响产品的命运甚至一个品牌的形象和地位。 【巨大的提升空间】 对于产品的理解和深入程度,相信绝大多数用户永远赶不上设计制造...
  • 图 2-5:打开“Upload on reload” 上述的演示可能没有给你留下深刻的印象,那么请思考:我们的页面发起的每一个请求(包括向第三方服务器发起的请求)现在都会经过我们的 service worker。现在所有的这些请求都...
  • 如果你已经跟着上一章一起,那么你现在应该有一个类似以下结构的项目: identidock/ ├── Dockerfile ├── app │ └── identidock.py ├── cmd.sh └── docker-compose.yml 如果你没有跟着也不用...
  • 第5章 编写一个

    2020-03-18 15:43:47
    虽然 distutils 是一个标准库模块,但建议你使用 setuptools 包来代替,它对标准的 distutils 了一些改进。 因此,这个文件的最少内容如下: from setuptools import setup setup( name='mypackage', ) name 给出...
  • 因此你需要双重循环:外层循环遍历行,而内层要经过每一行中的每一个数据(单元格)。这可以通过前面提到的 .map() 方法完成: data.map(function(row) { return ( React.DOM.tr(null, row.map(function(cell) { ...
  • 我们会在本书中讲解每一个文件的含义和用途。不过现在,我们先把注意力集中在如何用Angular代码开始工作上。 进入 ng 命令创建的angular2_hello_world目录,来看看它里面都有什么: $ cd angular2_hello_world $ ...
  • 结合以上分析,修改polls/models.py文件完成模型代码如下: 上面代码中每一个类就是一个Django模型,它们都继承自django.db.models.Model类,而模型的每一个属性都是Field类的实例,同时也对应一个数据库表的字段。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,367,586
精华内容 547,034
热门标签
关键字:

做的每一个决定