• 关于

    工作量证明怎么用

    的搜索结果

回答

广大码农同学们大多都有个共识,认为算法是个硬骨头,很难啃,悲剧的是啃完了还未必有用——除了面试的时候。实际工程中一般都是用现成的模块,一般只需了解算法的目的和时空复杂度即可。 不过话说回来,面试的时候面算法,包括面项目中几乎不大可能用到的算法,其实并不能说是毫无道理的。算法往往是对学习和理解能力的一块试金石,难的都能掌握,往往容易的事情不在话下。志于高者得于中。反之则不成立。另一方面,虽说教科书算法大多数都是那些即便用到也是直接拿模块用的,但不幸的是,我们这群搬砖头的有时候还非得做些发明家的事情:要么是得把算法当白盒加以改进以满足手头的特定需求;要么干脆就是要发明轮子。所以,虽说面试的算法本身未必用得到,但熟悉各种算法的人通常更可能熟悉算法的思想,从而更可能具备这里说的两种能力。 那么,为什么说算法很难呢。这个问题只有两种可能的原因: 算法本身就很难。也就是说,算法这个东西对于人类的大脑来说本身就是个困难的事儿。 讲得太烂。 下面会说明,算法之所以被绝大多数人认为很难,以上两个原因兼具。 我们说算法难的时候,有两种情况:一种是学算法难。第二种是设计算法难。对于前者,大多数人(至少我当年如此)学习算法几乎是在背算法,就跟背菜谱似的(“Cookbook”是深受广大码农喜爱的一类书),然而算法和菜谱的区别在于,算法包含的细节复杂度是菜谱的无数倍,算法的问题描述千变万化,逻辑过程百转千回,往往看得人愁肠百结,而相较之下任何菜谱涉及到的基本元素也就那么些(所以程序员肯定都具有成为好厨师的潜力:D)注意,即便你看了算法的证明,某种程度上还是“背”(为什么这么说,后面会详述)。我自己遇到新算法基本是会看证明的,但是发现没多久还是会忘掉,这是死记硬背的标准症状。如果你也啃过算法书,我相信很大可能性你会有同感:为什么当时明明懂了,但没多久就忘掉了呢。为什么当时明明非常理解其证明,但没过多久想要自己去证明时却发现怎么都没法补上证明中缺失的一环呢。 初中学习几何证明的时候,你会不会傻到去背一个定理的证明。不会。你只会背结论。为什么。一方面,因为证明过程包含大量的细节。另一方面,证明的过程环环相扣,往往只需要注意其中关键的一两步,便能够自行推导出来。算法逻辑描述就好比定理,算法的证明的过程就好比定理的证明过程。但不幸的是,与数学里面大量简洁的基本结论不同,算法这个“结论”可不是那么好背的,许多时候,算法本身的逻辑就几乎包含了与其证明过程等同的信息量,甚至算法逻辑本身就是证明过程(随便翻开一本经典的算法书,看几个经典的教科书算法,你会发现算法逻辑和算法证明的联系有多紧密)。于是我们又回到刚才那个问题:你会去背数学证明么。既然没人会傻到去背整个证明,又为什么要生硬地去背算法呢。 那么,不背就不背,去理解算法的证明如何。理解了算法的证明过程,便更有可能记住算法的逻辑细节,理解记忆嘛。然而,仍然不幸的是,绝大多数算法书在这方面做的实在糟糕,证明倒是给全了,逻辑也倒是挺严谨的,可是似乎没有作者能真正还原算法发明者本身如何得到算法以及算法证明的思维过程,按理说,证明的过程应该反映了这个思维过程,但是在下文关于霍夫曼编码的例子中你会看到,其实饱受赞誉的CLRS和《Algorithms》不仅没能还原这个过程,反而掩盖了这个过程。 必须说明的是,没有哪位作者是故意这样做的,但任何人在讲解一个自己已经理解了的东西的时候,往往会无意识地对自己的讲解进行“线性化”,例如证明题,如果你回忆一下高中做平面几何证明题的经历,就会意识到,其实证明的过程是一个充满了试错,联想,反推,特例,修改问题条件,穷举等等一干“非线性”思维的,混乱不堪的过程,而并不像写在课本上那样——引理1,引理2,定理1,定理2,一口气直到最终结论。这样的证明过程也许容易理解,但绝对不容易记忆。过几天你就会忘记其中一个或几个引理,其中的一步或几步关键的手法,然后当你想要回过头来自己试着去证明的时候,就会发现卡在某个关键的地方,为什么会这样。因为证明当中并没有告诉你为什么作者当时会想到证明算法需要那么一个引理或手法,所以,虽说看完证明之后,对算法这个结论而言你是知其所以然了,但对于算法的证明过程你却还没知其所以然。在我们大脑的记忆系统当中,新的知识必须要和既有的知识建立联系,才容易被回忆起来(《如何有效地学习与记忆》),联系越多,越容易回忆,而一个天外飞仙似地引理,和我们既有的知识没有半毛钱联系,没娘的孩子没人疼,自然容易被遗忘。(为什么还原思维过程如此困难呢。我曾经在知其所以然(一)里详述) 正因为绝大多数算法书上悲剧的算法证明过程,很多人发现证明本身也不好记,于是宁可选择直接记结论。当年我在数学系,考试会考证明过程,但似乎计算机系的考试考算法证明过程就是荒谬的。作为“工程”性质的程序设计,似乎更注重使用和结果。但是如果是你需要在项目中自己设计一个算法呢。这种时候最起码需要做的就是证明算法的正确性吧。我们面试的时候往往都会遇到一些算法设计问题,我总是会让应聘者去证明算法的正确性,因为即便是一个“看上去”正确的算法,真正需要证明起来往往发现并不是那么容易。 所以说,绝大多数算法书在作为培养算法设计者的角度来说是失败的,比数学教育更失败。大多数人学完了初中平面几何都会做证明题(数学书不会要求你记住几何所有的定理),但很多人看完了一本算法书还是一团浆糊,不会证明一些起码的算法,我们背了一坨又一坨结论,非但这些结论许多根本用不上,就连用上的那些也不会证明。为什么会出现这样的差异。因为数学教育的理想目的是为了让你成为能够发现新定理的科学家,而码农系的算法教育的目的却更现实,是为了让你成为能够使用算法做事情的工程师。然而,事情真的如此简单么。如果真是这样的话干脆连算法结论都不要背了,只要知道算法做的是什么事情,时空复杂度各是多少即可。 如果说以上提到的算法难度(讲解和记忆的难度)属于Accidental Complexity的话,算法的另一个难处便是Essential Complexity了:算法设计。还是拿数学证明来类比(如果你看过《Introduction to Algorithms:A Creative Approach》就知道算法和数学证明是多么类似。),与单单只需证明相比,设计算法的难处在于,定理和证明都需要你去探索,尤其是前者——你需要去自行发现关键的那(几)个定理,跟证明已知结论相比(已经确定知道结论是正确的了,你只需要用逻辑来连接结论和条件),这件事情的复杂度往往又难上一个数量级。 一个有趣的事实是,算法的探索过程往往蕴含算法的证明过程,理想的算法书应该通过还原算法的探索过程,从而让读者不仅能够自行推导出证明过程,同时还能够具备探索新算法的能力。之所以这么说,皆因为我是个懒人,懒人总梦想学点东西能够实现以下两个目的: 一劳永逸:程序员都知道“一次编写到处运行”的好处,多省事啊。学了就忘,忘了又得学,翻来覆去浪费生命。为什么不能看了一遍就再也不会忘掉呢。到底是教的不好,还是学得不好。 事半功倍:事实上,程序员不仅讲究一次编写到处运行,更讲究“一次编写到处使用”(也就是俗称的“复用”)。如果学一个算法所得到的经验可以到处使用,学一当十,推而广之,时间的利用效率便会大大提高。究竟怎样学习,才能够使得经验的外推(extrapolate)效率达到最大呢。 想要做到这两点就必须尽量从知识树的“根节点”入手,虽然这是一个美梦,例如数学界寻找“根节点”的美梦由来已久(《跟波利亚学解题》的“一点历史”小节),但哥德尔一个证明就让美梦成了泡影(《永恒的金色对角线》));但是,这并不阻止我们去寻找更高层的节点——更具普适性的解题原则和方法。所以,理想的算法书或者算法讲解应该是从最具一般性的思维法则开始,顺理成章地推导出算法,这个过程应该尽量还原一个”普通人“思考的过程,而不是让人看了之后觉得”这怎么可能想到呢。 以本文上篇提到的霍夫曼编码为例,第一遍看霍夫曼编码的时候是在本科,只看了算法描述,觉得挺直观的,过了两年,忘了,因为不知道为什么要把两个节点的频率加在一起看做单个节点——一件事情不知道“为什么”就会记不牢,知道了“为什么”的话便给这件事情提供了必然性。不知道“为什么”这件事情便可此可彼,我们的大脑对于可此可彼的事情经常会弄混,它更容易记住有理有据的事情(从信息论的角度来说,一件必然的事情概率为1,信息量为0,而一件可此可彼的事情信息量则是大于0的)。第二遍看是在工作之后,终于知道要看证明了,拿出著名的《Algorithms》来看,边看边点头,觉得讲得真好,一看就理解了为什么要那样来构造最优编码树。可是没多久,又给忘了。这次忘了倒不是忘了要把两个节点的频率加起来算一个,而是忘了为什么要这么做,因为当时没有弄清霍夫曼为什么能够想到为什么应该那样来构造最优编码树。结果只知其一不知其二。 必须说明的是,如果只关心算法的结论(即算法逻辑),那么理解算法的证明就够了,光背算法逻辑难记住,理解了证明会容易记忆得多。但如果也想不忘算法的证明,那么不仅要理解证明,还要理解证明背后的思维,也就是为什么背后的为什么。后者一般很难在书和资料上找到,唯有自己多加揣摩。为什么要费这个神。只要不会忘记结论不就结了吗。取决于你想做什么,如果你想真正弄清算法设计背后的思想,不去揣摩算法原作者是怎么想出来的是不行的。

小旋风柴进 2019-12-02 01:21:29 0 浏览量 回答数 0

回答

呼叫 @中山野鬼######叫我做什么?这些都是教科书的东西。哈。。。基本无视。答的好的未必干的好,干的好的未必答的好。中国有中国的国情。如果要我回答,没有什么异议的我就不说了,我说说可能和标准答案结果不对的我的态度(当然我也不知道标准答案)。 第1题,我没什么异议。不过,在中国,非语言传递的信息,能有5%是可靠的就不错了。纸面上的东西无论再怎么正确,客户决策者的态度,不会在纸面上摆着,不吃饭,不吹牛,怎么摸的清楚? 第2题,比较扯淡,标准学院派的。因为“缺陷”的定义是动态的。同样的问题,对于不同的客户关注点是不同的。例如OA系统,报表是个大头,但对于数据库,LOG足够。即便有BUG,重要性才决定它是否算是个缺陷。这种动态的东西怎么可能后面有个基本排序原则。   例如,第4题,更接近实际情况的是a,进度问题。但我不知道上面的标准答案是什么。 例如第7题,这个题目称述有问题,因为客户在扩大项目范围时,项目经理要做的是递烟,泡澡,塞纸钱而使得甲方另起项目,而不是在原有项目中扩充,或修改合同。项目经理看到的并不是个计划的实施,而是一个合同。对合同外的描述内容,应该以增补和另立合同为主此已经超出了项目经理的职权范围。项目范围扩大65%,成本增加4倍(也就老外想的出,项目范围扩大4倍,成本增加65%倒更贴近实际,否则更本就是不能接的单子),这就不是一个项目内可接受的现实。如果甲方非要如此,还是上面的三个步骤,不然就死破脸走官司路线。公司就是关门,也不能自己贴钱这么给甲方耍,没底线的乙方,是做不成甲方认可的东西的,也是活不长久的乙方。 第8题表示,整个题目是老外出的,哈。以我的经验,大头是项目计划实施。 简答题中,第5题也是有问题的,至少我有很大异议,原型更本就不应该在项目中出现。除非原型设计就是项目本身,此时也就不存在针对项目的原型一说。 国内,很多问题不是问题,只要问题本身不是人的问题。是问题的,都是人的思想问题。国内从老板到一线员工,出了问题,感性的很多,就是屁股决定意识的很多。所以国内做项目经理,最要紧的还是靠嘴巴说。要么中国怎么“厚黑”能成个学问呢。######主要想看你对简答那块的经验######如果是简答题,上面没有说的题目我补充一下,也当给这里的朋友提点片面的意见,以后要面试或许能用上,无论正面还是反面。 1、这个题目比较虚。得看什么类型的项目。但无非是计划、实施(执行),验收,三个环节。我说了,不能出现变更,当然实际情况不能没有变更。项目经理和其他人员要和甲方互动到,形式变更实质没变更的程度才行。项目实施不存在规划问题,这个是售前的事情。计划属于售前规划后的细化。实施是计划的落地和推进。验收这块存在调整,但在计划和实施中需要提前和甲方互动,项目实施的整体其实就围绕一个核心,就是合同的履行,所以所有工作都是围绕验收来忙。 2、这个问题很小白。工期是计划时间表,工作量是执行量。两个东西毛关系没有。而且工作量和业务本身的形态有关,有些东西先进场,有些东西后才到,比如你代码没写好,测个毛啊?当然这里说的不是测试代码本身的构造,只是基于测试代码已经存在的情况。工期和工作量没有对等关系。 3、这个问题问的比较好。就我的经验,明确谈什么,这是第一。明确想要什么,这是第二。余下就是开会。开会其实有三种。一种是传达信息。一种是说服别人,一种是汇总信息。每种不一样。传达信息,确认大家明确就OK。说服别人重点不在于用谁的意见说服,重点在于大家一致认可。汇总信息重点在明确大家说清楚了该说的内容。 4、这个我个人觉得是挺白痴的问题,可能对有些企业有些项目经理的考核是需要的。这个问题如同有次我去算法的面试,有人问我XX版本管理工具会不会?确实不会。当时不仅有种弱智感,同时还有种BS惜BS的感觉。我还没无聊到靠工具来维护自己的技术水平证明的低级趣味阶段。 6、这个问题,只有一个结论。就是硬抗过去。没有它法。因为资源不足,你分包,或者卖掉都不切合实际。 7、项目经理主要做哪些内容,其实也很简单,首先是协调,组内协调,甲乙双方的协调。其次是决策调整,根据组内和甲乙双方的情况调整规划和审核内容,最后是审核阶段情况。 不能反过来做,先审核内部,再去协调和和调整。项目实施是有时间期限的,多拖一天,公司多投入一份,回款的变数也多一份。好的项目经理在于先能搞清楚哪些是需要拖的问题,哪些是需要解决的问题。前者尽快留资源准备,后者尽量掩盖以回避。 虽然上面有些话说的很负面,但实际上都是中立的话。做事情就是做事情。把事情做好皆大欢喜,而不存在什么吭蒙拐骗一说。而好和不好,对乙方就是少投入,收回款。对甲方就是保护好甲方投入的价值存在。 后面一句话可能很多人又不理解了。我先说个做人的道理,你不考虑对方,对方就不会考虑你。再简单举个例子:比如客户要上个项目,那么你搞不清楚客户上项目的更本动力在哪,你就无法从客户的角度来判断,你所带的项目,哪些是能给你客户带来价值的。哪些对他是没价值的。客户投钱,不是你的钱,也只是给你所在公司的,但是既然你是做项目经理,你就要对这笔钱的投入保护好,也就是让该展现的展现。什么是该展现的?不是客户的某个代表认为有价值的,而是确实对客户有价值的。 如果你只以客户的某个代表的喜好来判断客户(抽象的)投入的价值点,那么迟早会倒霉。如果你真从客户的角度来判断价值点,你也迟早会说服客户。###### 引用来自“中山野鬼”的答案 如果是简答题,上面没有说的题目我补充一下,也当给这里的朋友提点片面的意见,以后要面试或许能用上,无论正面还是反面。 1、这个题目比较虚。得看什么类型的项目。但无非是计划、实施(执行),验收,三个环节。我说了,不能出现变更,当然实际情况不能没有变更。项目经理和其他人员要和甲方互动到,形式变更实质没变更的程度才行。项目实施不存在规划问题,这个是售前的事情。计划属于售前规划后的细化。实施是计划的落地和推进。验收这块存在调整,但在计划和实施中需要提前和甲方互动,项目实施的整体其实就围绕一个核心,就是合同的履行,所以所有工作都是围绕验收来忙。 2、这个问题很小白。工期是计划时间表,工作量是执行量。两个东西毛关系没有。而且工作量和业务本身的形态有关,有些东西先进场,有些东西后才到,比如你代码没写好,测个毛啊?当然这里说的不是测试代码本身的构造,只是基于测试代码已经存在的情况。工期和工作量没有对等关系。 3、这个问题问的比较好。就我的经验,明确谈什么,这是第一。明确想要什么,这是第二。余下就是开会。开会其实有三种。一种是传达信息。一种是说服别人,一种是汇总信息。每种不一样。传达信息,确认大家明确就OK。说服别人重点不在于用谁的意见说服,重点在于大家一致认可。汇总信息重点在明确大家说清楚了该说的内容。 4、这个我个人觉得是挺白痴的问题,可能对有些企业有些项目经理的考核是需要的。这个问题如同有次我去算法的面试,有人问我XX版本管理工具会不会?确实不会。当时不仅有种弱智感,同时还有种BS惜BS的感觉。我还没无聊到靠工具来维护自己的技术水平证明的低级趣味阶段。 6、这个问题,只有一个结论。就是硬抗过去。没有它法。因为资源不足,你分包,或者卖掉都不切合实际。 7、项目经理主要做哪些内容,其实也很简单,首先是协调,组内协调,甲乙双方的协调。其次是决策调整,根据组内和甲乙双方的情况调整规划和审核内容,最后是审核阶段情况。 不能反过来做,先审核内部,再去协调和和调整。项目实施是有时间期限的,多拖一天,公司多投入一份,回款的变数也多一份。好的项目经理在于先能搞清楚哪些是需要拖的问题,哪些是需要解决的问题。前者尽快留资源准备,后者尽量掩盖以回避。 虽然上面有些话说的很负面,但实际上都是中立的话。做事情就是做事情。把事情做好皆大欢喜,而不存在什么吭蒙拐骗一说。而好和不好,对乙方就是少投入,收回款。对甲方就是保护好甲方投入的价值存在。 后面一句话可能很多人又不理解了。我先说个做人的道理,你不考虑对方,对方就不会考虑你。再简单举个例子:比如客户要上个项目,那么你搞不清楚客户上项目的更本动力在哪,你就无法从客户的角度来判断,你所带的项目,哪些是能给你客户带来价值的。哪些对他是没价值的。客户投钱,不是你的钱,也只是给你所在公司的,但是既然你是做项目经理,你就要对这笔钱的投入保护好,也就是让该展现的展现。什么是该展现的?不是客户的某个代表认为有价值的,而是确实对客户有价值的。 如果你只以客户的某个代表的喜好来判断客户(抽象的)投入的价值点,那么迟早会倒霉。如果你真从客户的角度来判断价值点,你也迟早会说服客户。 请问先生,这些知识或者叫经验,你是怎么学到的,或者说知道的? 我想学习你的学习能力。 ######我奇怪的是如果世上所有的项目经理都是这个标准来考核那将没有经理可言,因为这些题都是针对那些有丰富经验的项目经理,刚上任的经理能答出这些题目算见鬼了。######对单选题表示无语。###### 引用来自“李渊”的答案 引用来自“中山野鬼”的答案 如果是简答题,上面没有说的题目我补充一下,也当给这里的朋友提点片面的意见,以后要面试或许能用上,无论正面还是反面。 1、这个题目比较虚。得看什么类型的项目。但无非是计划、实施(执行),验收,三个环节。我说了,不能出现变更,当然实际情况不能没有变更。项目经理和其他人员要和甲方互动到,形式变更实质没变更的程度才行。项目实施不存在规划问题,这个是售前的事情。计划属于售前规划后的细化。实施是计划的落地和推进。验收这块存在调整,但在计划和实施中需要提前和甲方互动,项目实施的整体其实就围绕一个核心,就是合同的履行,所以所有工作都是围绕验收来忙。 2、这个问题很小白。工期是计划时间表,工作量是执行量。两个东西毛关系没有。而且工作量和业务本身的形态有关,有些东西先进场,有些东西后才到,比如你代码没写好,测个毛啊?当然这里说的不是测试代码本身的构造,只是基于测试代码已经存在的情况。工期和工作量没有对等关系。 3、这个问题问的比较好。就我的经验,明确谈什么,这是第一。明确想要什么,这是第二。余下就是开会。开会其实有三种。一种是传达信息。一种是说服别人,一种是汇总信息。每种不一样。传达信息,确认大家明确就OK。说服别人重点不在于用谁的意见说服,重点在于大家一致认可。汇总信息重点在明确大家说清楚了该说的内容。 4、这个我个人觉得是挺白痴的问题,可能对有些企业有些项目经理的考核是需要的。这个问题如同有次我去算法的面试,有人问我XX版本管理工具会不会?确实不会。当时不仅有种弱智感,同时还有种BS惜BS的感觉。我还没无聊到靠工具来维护自己的技术水平证明的低级趣味阶段。 6、这个问题,只有一个结论。就是硬抗过去。没有它法。因为资源不足,你分包,或者卖掉都不切合实际。 7、项目经理主要做哪些内容,其实也很简单,首先是协调,组内协调,甲乙双方的协调。其次是决策调整,根据组内和甲乙双方的情况调整规划和审核内容,最后是审核阶段情况。 不能反过来做,先审核内部,再去协调和和调整。项目实施是有时间期限的,多拖一天,公司多投入一份,回款的变数也多一份。好的项目经理在于先能搞清楚哪些是需要拖的问题,哪些是需要解决的问题。前者尽快留资源准备,后者尽量掩盖以回避。 虽然上面有些话说的很负面,但实际上都是中立的话。做事情就是做事情。把事情做好皆大欢喜,而不存在什么吭蒙拐骗一说。而好和不好,对乙方就是少投入,收回款。对甲方就是保护好甲方投入的价值存在。 后面一句话可能很多人又不理解了。我先说个做人的道理,你不考虑对方,对方就不会考虑你。再简单举个例子:比如客户要上个项目,那么你搞不清楚客户上项目的更本动力在哪,你就无法从客户的角度来判断,你所带的项目,哪些是能给你客户带来价值的。哪些对他是没价值的。客户投钱,不是你的钱,也只是给你所在公司的,但是既然你是做项目经理,你就要对这笔钱的投入保护好,也就是让该展现的展现。什么是该展现的?不是客户的某个代表认为有价值的,而是确实对客户有价值的。 如果你只以客户的某个代表的喜好来判断客户(抽象的)投入的价值点,那么迟早会倒霉。如果你真从客户的角度来判断价值点,你也迟早会说服客户。 请问先生,这些知识或者叫经验,你是怎么学到的,或者说知道的? 我想学习你的学习能力。 吹水的说一句,无论你信不信,曾经在一家公司,我只是个技术人员。做算法写代码。不过平时对于公司管理的东西也带这思考。公司整体的每月运营支出,我的估算和外面朋友做的调研基本上接近。我觉得没什么刻意学吧,如同你对数字感兴趣,对很多数学问题就会很敏感。如果你对管理有兴趣,对很多组织化的东西就会很敏感。沉淀久了,多少也能算水多。。。 ######学习了######请参考 信息系统项目管理师 这本教材,虽然这是理论,现实项目中不一定这样,但是你要去应聘一个比较大的项目的项目经理时,还是要有一定的理论支撑的,项目越大作用越明显######哈。水平的深度是由理论的高度决定的嘛。希望我关于对学院派的鄙夷不要误导大家理解理论。######嗯 项目越大越明显######PMP例题?######这个是考试题,不是面试题######回复 @dedenj : 呵呵 专业的PM 这是基础######个人觉得,如果我去应聘PM,别人甩一张这个试卷来,我直接闪人。至少说明一点,这个公司的HR不知道到底如果招聘PM。。 我们不是来考PM证的,要考证至少要加几题,PM主要职责是什么,关键路径和成本控制,沟通原则,呵呵######就是面试时做的一份简单试卷

kun坤 2020-06-08 11:13:54 0 浏览量 回答数 0

问题

荆门开诊断证明-scc

游客5k2abgdj3m2ti 2019-12-01 22:09:00 1 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

面试薪资翻倍?你只需搞懂这个思维方式!

有只黑白猫 2020-01-14 15:11:16 531 浏览量 回答数 1

问题

【archsummit 回顾】阿里云章文嵩:构建大型云计算平台分布式技术的实践

云课堂 2019-12-01 21:03:36 14448 浏览量 回答数 9

问题

分布式系统 CAP 定理 P 代表什么含义【Java问答学堂】55期

剑曼红尘 2020-07-10 14:49:59 12 浏览量 回答数 1

回答

所谓区块链,即为一个个用这样的计算力保障的数据块链条。从第一块开始,每一个区块依照一定规则收集数据,然后将这些数据附上一个值,使得形成的数据块经过类似的单向函数计算后的结果落到一定范围内。通过估算全网的算力以及控制结果范围的大小,来保障符合要求数据块在足够长的时间内才能被找到。这个计算结果会被下一个区块包含,而这样形成的链式数据结构则称为区块链。 每一个小账本被称为区块,每一个不同的区块链协议(产生不同的加密货币)都会规定每一个区块的大小(最初比特币为1M)账本组成区块,区块构成链表,区块的头包含前一块的哈希值,这就是区块链。如此一来,任何人就不能随意修改其中的内容,或者交换顺序。如果你这么做,意味着你需要重新计算所有的特殊数字。 规定,允许世界上的每一个人建造区块。每一个新建区块的人(找到了这个特殊数字 - SHA256值有30个零)都能获得奖励,对于新建区块的这部分人(矿工)来说: 没有发送者信息,不需要签名 每一个新区块都会给整个币种增加新的虚拟(加密)货币 新建区块的过程又被称为"挖矿":需要大量工作量并且可以向整个经济体注入新的货币 挖矿的工作是:接受交易信息,建造区块,把区块广播出去,然后得到新的钱作为奖励 对每个矿工来说,每个区块就像一个小彩票,所有人都在拼命快速猜数字,直到有一个幸运儿找到了一个特殊数字,使得整个区块的哈希值开头有许多个零,就能得到奖励。我记得有一个知乎答主给了一个形象的比喻,区块链就像一个拥有貌美如花女儿(区块)的国王,有很多的青年翘首以盼,而国王的方法是出了一道很难得题目让所有的青年计算(学习改变人生),谁算的快(在计算哈希值过程也可能是运气好)就能抱得美人归 对于想用这个系统来收付款的用户来说,他们不需要收听所有的交易,而只要收听矿工们广播出来的区块,然后更新到自己保存的区块链中就可以了 "区块"也可以想象为一个盒子,区块里放着一些数字货币以及一张小纸条,小纸条上记录了这十分钟内产生的那唯一一笔交易信息, 比如说--"小A转账给了小B100元";当然,这段信息肯定是被加密处理过的,为的就是保证只有小A和小B(通过他们手上的钥匙)才有能力解读里面真正的内容。 这个神奇的区块被创造出来之后,很快被埋在了地底下,至于埋在哪里?没有一个人不知道,需要所有计算机节点一起参与进来掘地三尺后才有可能找到(找到一个有效的工作量证明)。显然,这是一件工作量巨大、成果随机的事件。但是呢,对于计算机节点来说,一旦从地底下挖出这个区块,他将获得区块内价值不菲的数字货币,以及"小A转账给了小B100元"过程中小A所支付的小费。同时,对于这个节点来说,也只有他才有权利真正记录小纸条里的内容,这是一份荣耀,而其他节点相当于只能使用它的复制品,一个已经没有数字货币加持的副本。当然这个神奇的区块还有一些其他很特别的地方, 可以将计算机节点从地底下挖出区块的过程叫做「挖矿」,刚才说了,这是一件工作量巨大、运气成分较多、但收益丰厚的事儿。来自中国上海浦东新区张衡路上的一个节点突然跳出来很兴奋的说:" 我挖到区块了!里面的小纸条都是有效的!奖励归我!" .虽然此刻张衡路节点已经拿到了数字货币,但对于其他计算机节点来说,因为这里面还涉及到其他一些利益瓜葛,他们不会选择默认相信张衡路节点所说的话;基于陌生节点彼此不信任的原则,他们拿过张衡路节点所谓挖到的区块(副本),开始校验区块内的小纸条信息是否真实有效等等。在区块链世界里,节点们正是通过校验小纸条信息的准确性,或间接或直接判断成功挖出区块的节点是否撒谎。(如何定义小纸条信息真实有效,后面会讲解,这里暂不做赘述)。在校验过程中,各个节点们会直接通过下面两个行为表达自己对张衡路节点的认同(准确无误)和态度:停止已经进行了一半甚至80%的挖矿进程;将张衡路节点成功挖出的区块(副本)追加到自己区块链的末尾。你可以稍微有点困惑:停止可能已经执行了80%的挖矿行为,那之前80%的工作不是就白做了嘛?!然后,区块链的末尾又是个什么鬼东西?对于第一个困惑。 我想说,你说的一点没错,但是没办法,现实就是这么残酷,即便工作做了80%,那也得放弃,这80%的工作劳苦几乎可以视为无用功,绝对的伤财劳众。第二个困惑,区块链和区块链的末尾是什么鬼?这里因为事先并没有讲清楚,但是你可以简单想象一下:区块是周期性不断的产生和不断的被挖出来,一个计算机节点可能事先已经执行了N次"从别人手上拿过区块 -> 校验小纸条有效性"的流程,肯定在自己的节点上早已经存放了N个区块,这些区块会按照时间顺序整齐的一字排列成为一个链状。没错,这个链条,就是你一直以来认为的那个区块链。如果你还是不能够理解,没关系,文章后面还会有很多次机会深入研究。 进入到区块内更微观的世界里一探究竟,看看小纸条到底是怎么一回事,它的产生以及它终其一生的使命:发起交易的时候,发起人会收到一张小纸条,他需要将交易记录比如说"盗盗转账给张三40元"写在纸上。说来也神奇,当写完的那一刹那,在小纸条的背面会自动将这段交易记录格式化成至少包含了"输入值"和"输出值"这两个重要字段;"输入值"用于记录数字货币的有效来源,"输出值"记录着数字货币发往的对象。刚刚创建的小纸条立马被标记成为"未确认"的小纸条。从地下成功挖出区块并最终连接到区块链里的小纸条一开始会被标记为"有效". 若这条有效的小纸条作为其他交易的输入值被使用,那么,这个有效的小纸条很快会被标记为"无效".因为各种原因,区块从链上断开、丢弃,曾经这个区块内被标记为"有效"的小纸条会被重新标记为"未确认".区块链里面没有账户余额的概念,你真正拥有的数字资产实际上是一段交易信息;通过简单的加减法运算获知你数字钱包里的余额。上面的1、2、3仅仅作为结论一开始强行灌输给你的知识点,其中有几个描述可能会有点绕,让你觉得云里雾里,只有了解整体区块链你才能更全面认知其中奥妙。 区块容量,比特币从被创建时,或者说源代码中规定了,区块容量是1M.最初设计成1M的原因一方面,防止DOS攻击。另一方面,当年中本聪在创建区块链的时候的容量是32M,但是他通过一个说明为"Clear up"这样毫不起眼的Commit把区块容量改成了1M,为防止区块链体积增长过快,为区块容量这个问题添加了些神秘色彩。1M的容量意味着比特币最大的处理交易数量在约2400(486882区块1034.39的大小很接近了)。

问问小秘 2019-12-02 03:07:11 0 浏览量 回答数 0

问题

盘点年度 Python 类库 Top 10

珍宝珠 2020-01-09 13:39:35 77 浏览量 回答数 1

问题

从一道面试题谈谈一线大厂码农应该具备的基本能力 7月16日 【今日算法】

游客ih62co2qqq5ww 2020-07-22 13:45:47 118 浏览量 回答数 1

回答

在PaaS层中一个复杂的通用应用就是大数据平台。大数据是如何一步一步融入云计算的呢?首先我们来看一下大数据里面的数据,就分三种类型,一种叫结构化的数据,一种叫非结构化的数据,还有一种叫半结构化的数据。 大数据拥抱云计算 在PaaS层中一个复杂的通用应用就是大数据平台。大数据是如何一步一步融入云计算的呢? 1 数据不大也包含智慧 一开始这个大数据并不大。原来才有多少数据?现在大家都去看电子书,上网看新闻了,在我们80后小时候,信息量没有那么大,也就看看书、看看报,一个星期的报纸加起来才有多少字?如果你不在一个大城市,一个普通的学校的图书馆加起来也没几个书架,是后来随着信息化的到来,信息才会越来越多。 首先我们来看一下大数据里面的数据,就分三种类型,一种叫结构化的数据,一种叫非结构化的数据,还有一种叫半结构化的数据。 结构化的数据:即有固定格式和有限长度的数据。例如填的表格就是结构化的数据,国籍:中华人民共和国,民族:汉,性别:男,这都叫结构化数据。 非结构化的数据:现在非结构化的数据越来越多,就是不定长、无固定格式的数据,例如网页,有时候非常长,有时候几句话就没了;例如语音,视频都是非结构化的数据。 半结构化数据:是一些XML或者HTML的格式的,不从事技术的可能不了解,但也没有关系。 其实数据本身不是有用的,必须要经过一定的处理。例如你每天跑步带个手环收集的也是数据,网上这么多网页也是数据,我们称为Data。数据本身没有什么用处,但数据里面包含一个很重要的东西,叫做信息(Information)。 数据十分杂乱,经过梳理和清洗,才能够称为信息。信息会包含很多规律,我们需要从信息中将规律总结出来,称为知识(Knowledge),而知识改变命运。信息是很多的,但有人看到了信息相当于白看,但有人就从信息中看到了电商的未来,有人看到了直播的未来,所以人家就牛了。如果你没有从信息中提取出知识,天天看朋友圈也只能在互联网滚滚大潮中做个看客。 所以数据的应用分这四个步骤:数据、信息、知识、智慧。 最终的阶段是很多商家都想要的。你看我收集了这么多的数据,能不能基于这些数据来帮我做下一步的决策,改善我的产品。例如让用户看视频的时候旁边弹出广告,正好是他想买的东西;再如让用户听音乐时,另外推荐一些他非常想听的其他音乐。 用户在我的应用或者网站上随便点点鼠标,输入文字对我来说都是数据,我就是要将其中某些东西提取出来、指导实践、形成智慧,让用户陷入到我的应用里面不可自拔,上了我的网就不想离开,手不停地点、不停地买。 很多人说双十一我都想断网了,我老婆在上面不断地买买买,买了A又推荐B,老婆大人说,“哎呀,B也是我喜欢的啊,老公我要买”。你说这个程序怎么这么牛,这么有智慧,比我还了解我老婆,这件事情是怎么做到的呢? 2 数据如何升华为智慧 数据的处理分几个步骤,完成了才最后会有智慧。 第一个步骤叫数据的收集。首先得有数据,数据的收集有两个方式: 第一个方式是拿,专业点的说法叫抓取或者爬取。例如搜索引擎就是这么做的:它把网上的所有的信息都下载到它的数据中心,然后你一搜才能搜出来。比如你去搜索的时候,结果会是一个列表,这个列表为什么会在搜索引擎的公司里面?就是因为他把数据都拿下来了,但是你一点链接,点出来这个网站就不在搜索引擎它们公司了。比如说新浪有个新闻,你拿百度搜出来,你不点的时候,那一页在百度数据中心,一点出来的网页就是在新浪的数据中心了。 第二个方式是推送,有很多终端可以帮我收集数据。比如说小米手环,可以将你每天跑步的数据,心跳的数据,睡眠的数据都上传到数据中心里面。 第二个步骤是数据的传输。一般会通过队列方式进行,因为数据量实在是太大了,数据必须经过处理才会有用。可系统处理不过来,只好排好队,慢慢处理。 第三个步骤是数据的存储。现在数据就是金钱,掌握了数据就相当于掌握了钱。要不然网站怎么知道你想买什么?就是因为它有你历史的交易的数据,这个信息可不能给别人,十分宝贵,所以需要存储下来。 第四个步骤是数据的处理和分析。上面存储的数据是原始数据,原始数据多是杂乱无章的,有很多垃圾数据在里面,因而需要清洗和过滤,得到一些高质量的数据。对于高质量的数据,就可以进行分析,从而对数据进行分类,或者发现数据之间的相互关系,得到知识。 比如盛传的沃尔玛超市的啤酒和尿布的故事,就是通过对人们的购买数据进行分析,发现了男人一般买尿布的时候,会同时购买啤酒,这样就发现了啤酒和尿布之间的相互关系,获得知识,然后应用到实践中,将啤酒和尿布的柜台弄的很近,就获得了智慧。 第五个步骤是对于数据的检索和挖掘。检索就是搜索,所谓外事不决问Google,内事不决问百度。内外两大搜索引擎都是将分析后的数据放入搜索引擎,因此人们想寻找信息的时候,一搜就有了。 另外就是挖掘,仅仅搜索出来已经不能满足人们的要求了,还需要从信息中挖掘出相互的关系。比如财经搜索,当搜索某个公司股票的时候,该公司的高管是不是也应该被挖掘出来呢?如果仅仅搜索出这个公司的股票发现涨的特别好,于是你就去买了,其实其高管发了一个声明,对股票十分不利,第二天就跌了,这不坑害广大股民么?所以通过各种算法挖掘数据中的关系,形成知识库,十分重要。 3 大数据时代,众人拾柴火焰高 当数据量很小时,很少的几台机器就能解决。慢慢的,当数据量越来越大,最牛的服务器都解决不了问题时,怎么办呢?这时就要聚合多台机器的力量,大家齐心协力一起把这个事搞定,众人拾柴火焰高。 对于数据的收集:就IoT来讲,外面部署这成千上万的检测设备,将大量的温度、湿度、监控、电力等数据统统收集上来;就互联网网页的搜索引擎来讲,需要将整个互联网所有的网页都下载下来。这显然一台机器做不到,需要多台机器组成网络爬虫系统,每台机器下载一部分,同时工作,才能在有限的时间内,将海量的网页下载完毕。 对于数据的传输:一个内存里面的队列肯定会被大量的数据挤爆掉,于是就产生了基于硬盘的分布式队列,这样队列可以多台机器同时传输,随你数据量多大,只要我的队列足够多,管道足够粗,就能够撑得住。 对于数据的存储:一台机器的文件系统肯定是放不下的,所以需要一个很大的分布 式文件系统来做这件事情,把多台机器的硬盘打成一块大的文件系统。 对于数据的分析:可能需要对大量的数据做分解、统计、汇总,一台机器肯定搞不定,处理到猴年马月也分析不完。于是就有分布式计算的方法,将大量的数据分成小份,每台机器处理一小份,多台机器并行处理,很快就能算完。例如著名的Terasort对1个TB的数据排序,相当于1000G,如果单机处理,怎么也要几个小时,但并行处理209秒就完成了。 所以说什么叫做大数据?说白了就是一台机器干不完,大家一起干。可是随着数据量越来越大,很多不大的公司都需要处理相当多的数据,这些小公司没有这么多机器可怎么办呢? 4 大数据需要云计算,云计算需要大数据 说到这里,大家想起云计算了吧。当想要干这些活时,需要很多的机器一块做,真的是想什么时候要就什么时候要,想要多少就要多少。 例如大数据分析公司的财务情况,可能一周分析一次,如果要把这一百台机器或者一千台机器都在那放着,一周用一次非常浪费。那能不能需要计算的时候,把这一千台机器拿出来;不算的时候,让这一千台机器去干别的事情? 谁能做这个事儿呢?只有云计算,可以为大数据的运算提供资源层的灵活性。而云计算也会部署大数据放到它的PaaS平台上,作为一个非常非常重要的通用应用。因为大数据平台能够使得多台机器一起干一个事儿,这个东西不是一般人能开发出来的,也不是一般人玩得转的,怎么也得雇个几十上百号人才能把这个玩起来。 所以说就像数据库一样,其实还是需要有一帮专业的人来玩这个东西。现在公有云上基本上都会有大数据的解决方案了,一个小公司需要大数据平台的时候,不需要采购一千台机器,只要到公有云上一点,这一千台机器都出来了,并且上面已经部署好了的大数据平台,只要把数据放进去算就可以了。 云计算需要大数据,大数据需要云计算,二者就这样结合了。 人工智能拥抱大数据 机器什么时候才能懂人心 虽说有了大数据,人的欲望却不能够满足。虽说在大数据平台里面有搜索引擎这个东西,想要什么东西一搜就出来了。但也存在这样的情况:我想要的东西不会搜,表达不出来,搜索出来的又不是我想要的。 例如音乐软件推荐了一首歌,这首歌我没听过,当然不知道名字,也没法搜。但是软件推荐给我,我的确喜欢,这就是搜索做不到的事情。当人们使用这种应用时,会发现机器知道我想要什么,而不是说当我想要时,去机器里面搜索。这个机器真像我的朋友一样懂我,这就有点人工智能的意思了。 人们很早就在想这个事情了。最早的时候,人们想象,要是有一堵墙,墙后面是个机器,我给它说话,它就给我回应。如果我感觉不出它那边是人还是机器,那它就真的是一个人工智能的东西了。 让机器学会推理 怎么才能做到这一点呢?人们就想:我首先要告诉计算机人类的推理的能力。你看人重要的是什么?人和动物的区别在什么?就是能推理。要是把我这个推理的能力告诉机器,让机器根据你的提问,推理出相应的回答,这样多好? 其实目前人们慢慢地让机器能够做到一些推理了,例如证明数学公式。这是一个非常让人惊喜的一个过程,机器竟然能够证明数学公式。但慢慢又发现其实这个结果也没有那么令人惊喜。因为大家发现了一个问题:数学公式非常严谨,推理过程也非常严谨,而且数学公式很容易拿机器来进行表达,程序也相对容易表达。 教给机器知识 因此,仅仅告诉机器严格的推理是不够的,还要告诉机器一些知识。但告诉机器知识这个事情,一般人可能就做不来了。可能专家可以,比如语言领域的专家或者财经领域的专家。 语言领域和财经领域知识能不能表示成像数学公式一样稍微严格点呢?例如语言专家可能会总结出主谓宾定状补这些语法规则,主语后面一定是谓语,谓语后面一定是宾语,将这些总结出来,并严格表达出来不就行了吗?后来发现这个不行,太难总结了,语言表达千变万化。 人工智能这个阶段叫做专家系统。专家系统不易成功,一方面是知识比较难总结,另一方面总结出来的知识难以交给计算机。因为你自己还迷迷糊糊,觉得似乎有规律,就是说不出来,又怎么能够通过编程教给计算机呢? 算了,教不会你自己学吧 于是人们想到:机器是和人完全不一样的物种,干脆让机器自己学习好了。

茶什i 2019-12-31 13:13:50 0 浏览量 回答数 0

回答

作为一个软件工程专业的过来人,希望我的回答能够帮助你,假设你每天坚持学习 首先找一本简单的教材,先对java有个基本的认识(大概看那么半个月就差不多了,随便下载一本入门的书就行了) 然后推荐你看<<java核心技术>>,分为上下两卷,已经是第八版了,大概有一千六七百页;当 你看完后,基本的java知识已经掌握了(记住,一定要多练习啊)(我那时候一个暑假看完第一遍,每天看将近十个小时加练习,但是要弄懂,呵呵,至少看个三四遍吧,这两本书只要能搞懂70%就很不错了) 这个时候你可以看看<<thinking in java>>中文名"java编程思想",这本书写的比较难,如果你看不懂,那么你要多做练习,慢慢看,如果看完了,而且懂了,那么证明你的java水平到达了一个更高的层次;(去参加面试的时候问的那些java知识完全可以应付过来了)(或者你可以先看下面的书,边看thinking in java这本书,这样也是可以的,而且学习的效率应该会高些) 然后java就会分方向,j2me(手机编程)不建议你去学这个(要学就学android手机编程),已经过时了;j2ee方向(Web编程),先学html,javaScript,css(这些书多得数不清,呵呵),然后就学servlet和jsp,《jsp应用开发详解》(入门) 《Servlet与JSP核心编程》(核心)这两本书还不错,然后就可以学SSH(三大框架,这个书一大堆), 学习struts的时候建议你从struts1开始学起《精通Struts基于MVC的Java Web设计与开发》,然后就可以学习struts2《Struts2权威指南》,接下来学习Hibernate《精通Hibernate:Java对象持久化技术详解》,最后学习Spring《spring2.0技术手册》(提示:只要你java基础学得好,这些东西都会学得很快) 这个时候你就要把注意力放在设计模式,数据结构和计算机算法上面来了, 设计模式可以先看<<深入浅出设计模式>> 然后再看<<java与模式>>, 数据结构建议你看清华大学严慰敏老师写的那本教材; 计算机算法要了解基本的排序,如果你不做底层,只做应用的话,没有必要去看那个<<算法导论>这本书太难了。 (设计模式,数据结构和算法才是真正的精髓,要有很多年的编程经验才能够使用得游刃有余,光看懂还不行的,一定要多练习,到了这个境界才是真正的java高手)(我学java有三年了,这是我的体会) 等你掌握前面的这些知识之后,推荐你看<<effective java>>,这本书是目前java领域公认的高级书籍。在项目中你肯定会遇到一些前端的知识,那么你得精通javascript,<<JavaScript权威指南>>(入门), <<JavaScript高级程序设计>>(进阶),这两本书弄懂了,那么学习jquery和extjs都会很快的。 还有要提醒你一下,对于初学者,不要使用eclipse编程工具,建议你先用记事本写程序,当你比较熟练了之后就可以使用eclipse这些工具了。 不要心急,不要图快,所有的书要一本本的慢慢看,多看几遍(一本书看上个四五遍,你就可以成高手,呵呵)。 java基础(j2se)的重点有:继承、多态、流、线程、网络编程、反射、集合、数据库连接、泛型、JNI技术、分布式技术还有解析xml也是很重要的,如果你想学android手机编程,那么SWING和AWT要熟悉一下。如果你不想学Web编程(j2ee),那么我建议你可以学android手机编程《Google+Android开发入门与实战》(入门) 《Google Android SDK开发范例大全》(深入)(建议把android当作业余爱好,把web编程当作主攻方向,因为j2ee包含了大量框架知识),书很多,可以自己去搜。多想 多看 多练才是王道,不要相信什么培训机构,这些都没啥用,真正学好只能靠你自己。 面向对象思想+java基础(j2se)+数据结构+设计模式+计算机算法 为核心,学好了这几个8000元/月轻而易举,什么都可以不学好,唯独这几科一定要学好,切记切记。 当然,随着你的技术水平的提高,你还会要学习其他的语言,不过这都是后话,等你把上面的东西掌握了,我再告诉你怎么学(高并发等内容),哈哈。 你现在还是在校的学生,那么请记住,不要沉迷于游戏,把时间用于学习上面的知识,千万别听一些人说什么'学校学的东西工作都用不到',完全是胡扯,我很负责任的告诉你,只有学校里学的东西才是真正有技术含量的东西,真正工作了,你就没有那么多时间来学习了(唉,感触很深呐) 以上的内容是我学习的总结,当然我走过很多弯路,现在我把这条正确的路径介绍给你,也是希望你能够少走弯路,希望几年之后,你能够比现在的我更牛X(呵呵,吹个小牛)。加油。参考资料来源:http://zhidao.baidu.com/question/404215211.html

晚来风急 2019-12-02 01:20:25 0 浏览量 回答数 0

问题

网贷实时数据出售

游客oicjp4phhw6fk 2019-12-01 19:47:10 1 浏览量 回答数 0

问题

洗牌算法和它的应用场景 7月20日 【今日算法】

游客ih62co2qqq5ww 2020-07-27 13:19:28 3 浏览量 回答数 0

问题

【阿里云产品评测】个人WP站的云体验

cnsjw 2019-12-01 20:54:27 22207 浏览量 回答数 25

回答

曾经因为看不懂数据结构和算法,而一度怀疑是自己太笨,实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门课望而却步,希望以下分享能为初学者排忧解难。 我个人觉得,其实真正的原因是你没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。 还记得大学里每次考前老师都要划重点吗?今天,我就给你划划我们这门课的重点,再告诉你一些我总结的学习小窍门。相信有了这些之后,你学起来就会有的放矢、事半功倍了。 什么是数据结构?什么是算法? 大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。 虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。下面我就从广义和狭义两个层面,来帮你理解数据结构与算法这两个概念。 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律编号,就是书籍这种“数据”的存储结构。 那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。 从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要讲的这些经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。 那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢? 这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。 比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。 数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。 现在你对数据结构与算法是不是有了比较清晰的理解了呢?有了这些储备,下面我们来看看,究竟该怎么学数据结构与算法。 看到数据结构和算法里的“算法”两个字,很多人就会联想到“数学”,觉得算法会涉及到很多深奥的数学知识。那我数学基础不是很好,学起来会不会很吃力啊? 数据结构和算法课程确实会涉及一些数学方面的推理、证明,尤其是在分析某个算法的时间、空间复杂度的时候,但是这个你完全不需要担心。 学习的重点在什么地方? 提到数据结构和算法,很多人就很头疼,因为这里面的内容实在是太多了。这里,我就帮你梳理一下,应该先学什么,后学什么。你可以对照看看,你属于哪个阶段,然后有针对地进行学习。 想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。 这个概念究竟有多重要呢?可以这么说,它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓。 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。所以,如果你只掌握了数据结构和算法的特点、用法,但是没有学会复杂度分析,那就相当于只知道操作口诀,而没掌握心法。只有把心法了然于胸,才能做到无招胜有招! 所以,复杂度分析这个内容,你也一定要花大力气来啃,必须要拿下,并且要搞得非常熟练。否则,后面的数据结构和算法也很难学好。 搞定复杂度分析,下面就要进入数据结构与算法的正文内容了。 为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。 但是,作为初学者,或者一个非算法工程师来说,你并不需要掌握图里面的所有知识点。很多高级的数据结构与算法,比如二分图、最大流等,这些在我们平常的开发中很少会用到。所以,你暂时可以不用看。我还是那句话,咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力。 所以,结合我自己的学习心得,还有这些年的面试、开发经验,我总结了20个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这20个知识点就足够了。 这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。 与此同时,为了帮助大家学习算法,准备了一份学习资料,获取方式:关注我的公众号“程序媛不是程序猿”,回复“算法”即可弹出领取地址。对于新手来说很适用。 在学习数据结构和算法的过程中,你也要注意,不要只是死记硬背,不要为了学习而学习,而是要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”。对于每一种数据结构或算法,我都会从这几个方面进行详细讲解。只要你掌握了《数据结构与算法之美》每节课里讲的内容,就能在开发中灵活应用。 学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。 一些可以让你事半功倍的学习技巧 前面我给你划了学习的重点,作为一个过来人,现在我就给你分享一下,学习的一些技巧。掌握了这些技巧,可以让你化被动为主动,学起来更加轻松,更加有动力! 边学边练,适度刷题 “边学边练”这一招非常有用。建议你每周花1~2个小时的时间,集中把这周的三节内容涉及的数据结构和算法,全都自己写出来,用代码实现一遍。这样一定会比单纯地看或者听的效果要好很多! 有面试需求的同学,可能会问了,那我还要不要去刷题呢? 我个人的观点是可以“适度”刷题,但一定不要浪费太多时间在刷题上。我们学习的目的还是掌握,然后应用。除非你要面试Google、Facebook这样的公司,它们的算法题目非常非常难,必须大量刷题,才能在短期内提升应试正确率。如果是应对国内公司的技术面试,即便是BAT这样的公司,你只要彻底掌握这个专栏的内容,就足以应对。 多问、多思考、多互动 学习最好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求老师答疑。但是,离开大学之后,既没有同学也没有老师,这个条件就比较难具备了。 打怪升级学习法 学习的过程中,我们碰到最大的问题就是,坚持不下来。是的,很多基础课程学起来都非常枯燥。为此,我自己总结了一套“打怪升级学习法”。 游戏你肯定玩过吧?为什么很多看起来非常简单又没有乐趣的游戏,你会玩得不亦乐乎呢?这是因为,当你努力打到一定级别之后,每天看着自己的经验值、战斗力在慢慢提高,那种每天都在一点一点成长的成就感就不由自主地产生了。 知识需要沉淀,不要想试图一下子掌握所有 在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。 这些内容是我根据平时的学习和工作、面试经验积累,精心筛选出来的。只要掌握这些内容,应付日常的面试、工作,基本不会有问题。 以上内容出自近70000+程序员的算法课堂《数据结构与算法之美》,这个专栏是市面上唯一一门真正适用于工程师的专栏,专栏中列举大量实际软件开发中的场景,给你展示如何利用数据结构和算法解决真实的问题。整个专栏会涵盖100 多个算法真实项目场景案例,更难得的是它跟市面上晦涩的算法书籍不同的是,还手绘了一些清晰易懂的详解图(总共有 300 多张)。 手绘图—出自《数据结构与算法之美》 专栏已经更新完毕,72 篇文章,27 万字,这个专栏作者并非只是单纯地把某个知识点讲清楚,而是结合作者的理解、实践和经验来讲解,我相信它是一个跟所有国内、国外经典书籍都不一样的专栏,一个可以长期影响一些人的专栏。 这个专栏不会像《算法导论》那样,里面有非常复杂的数学证明和推理。作者会由浅入深,从概念到应用,一点一点给你解释清楚。你只要有高中数学水平,就完全可以学习。 当然,当然希望你最好有些编程基础,如果有项目经验就更好了。这样给你讲数据结构和算法如何提高效率、如何节省存储空间,你就会有很直观的感受。因为,对于每个概念和实现过程,作者都会从实际场景出发,不仅教你“是什么”,还会教你“为什么”,并且告诉你遇到同类型问题应该“怎么做”。 强烈推荐这个专栏给想攻克算法的同学,它改变了无数对算法恐惧的同学,我整理了一些专栏的评价给大家参考。

游客arp6khj2dsufi 2019-12-02 03:09:08 0 浏览量 回答数 0

回答

从业余程序员到职业程序员 程序员刚入行时,我觉得最重要的是把自己培养成职业的程序员。 我的程序员起步比同龄人都晚了很多,更不用说现在的年轻人了。我大学读的是生物专业,在上大学前基本算是完全没接触过计算机。军训的时候因为很无聊,我和室友每天跑去学校的机房玩,我现在还印象很深刻,我第一次走进机房的时候,别人问,你是要玩windows,还是dos,我那是完全的一抹黑。后来就只记得在机房一堆人都是在练习盲打,军训完,盲打倒是练的差不多了,对计算机就这么产生了浓厚的兴趣,大一的时候都是玩组装机,捣鼓了一些,对计算机的硬件有了那么一些了解。 到大二后,买了一些书开始学习当时最火的网页三剑客,学会了手写HTML、PS的基本玩法之类的,课余、暑假也能开始给人做做网站什么的(那个时候做网站真的好赚钱),可能那样过了个一年左右,做静态的网页就不好赚钱了,也不好找实习工作,于是就开始学asp,写些简单的CRUD,做做留言板、论坛这些动态程序,应该算是在这个阶段接触编程了。 毕业后加入了深圳的一家做政府行业软件的公司,一个非常靠谱和给我空间的Leader,使得自己在那几年有了不错的成长,终于成了一个职业的程序员。 通常来说,业余或半职业的程序员,多数是1个人,或者很小的一个团队一起开发,使得在开发流程、协作工具(例如jira、cvs/svn/git等)、测试上通常会有很大的欠缺,而职业的程序员在这方面则会专业很多。另外,通常职业的程序员做的系统都要运行较长的时间,所以在可维护性上会特别注意,这点我是在加入阿里后理解更深的。一个运行10年的系统,和一个写来玩玩的系统显然是有非常大差别的。 这块自己感觉也很难讲清楚,只能说模模糊糊有个这样的概念。通常在有兴趣的基础上,从业余程序员跨越到成为职业程序员我觉得不会太难。 编程能力的成长 作为程序员,最重要的能力始终是编程能力,就我自己的感受而言,我觉得编程能力的成长主要有这么几个部分: 1、编程能力初级:会用 编程,首先都是从学习编程语言的基本知识学起的,不论是什么编程语言,有很多共同的基本知识,例如怎么写第一个Hello World、if/while/for、变量等,因此我比较建议在刚刚开始学一门编程语言的时候,看看编程语言自己的一些文档就好,不要上来就去看一些高阶的书。我当年学Java的时候上来就看Think in Java、Effective Java之类的,真心好难懂。 除了看文档以外,编程是个超级实践的活,所以一定要多写代码,只有这样才能真正熟练起来。这也是为什么我还是觉得在面试的时候让面试者手写代码是很重要的,这个过程是非常容易判断写代码的熟悉程度的。很多人会说由于写代码都是高度依赖IDE的,导致手写很难,但我绝对相信写代码写了很多的人,手写一段不太复杂的、可运行的代码是不难的。即使像我这种三年多没写过代码的人,让我现在手写一段不太复杂的可运行的Java程序,还是没问题的,前面N年的写代码生涯使得很多东西已经深入骨髓了。 我觉得编程能力初级这个阶段对于大部分程序员来说都不会是问题,勤学苦练,是这个阶段的核心。 2、编程能力中级:会查和避免问题 除了初级要掌握的会熟练的使用编程语言去解决问题外,中级我觉得首先是提升查问题的能力。 在写代码的过程中,出问题是非常正常的,怎么去有效且高效的排查问题,是程序员群体中通常能感受到的大家在编程能力上最大的差距。 解决问题能力强的基本很容易在程序员群体里得到很高的认可。在查问题的能力上,首先要掌握的是一些基本的调试技巧,好用的调试工具,在Java里有JDK自带的jstat、jmap、jinfo,不在JDK里的有mat、gperf、btrace等。工欲善其事必先利其器,在查问题上是非常典型的,有些时候大家在查问题时的能力差距,有可能仅仅是因为别人比你多知道一个工具而已。 除了调试技巧和工具外,查问题的更高境界就是懂原理。一个懂原理的程序员在查问题的水平上和其他程序员是有明显差距的。我想很多的同学应该能感受到,有些时候查出问题的原因仅仅是因为有效的工具,知其然不知其所以然。 我给很多阿里的同学培训过Java排查问题的方法,在这个培训里,我经常也会讲到查问题的能力的培养最主要的也是熟练,多尝试给自己写一些会出问题的程序,多积极的看别人是怎么查问题的,多积极的去参与排查问题,很多最后查问题能力强的人多数仅仅是因为“无他,但手熟尔”。 我自己排查问题能力的提升主要是在2009年和2010年。那两年作为淘宝消防队(处理各种问题和故障的虚拟团队)的成员,处理了很多的故障和问题。当时消防队还有阿里最公认的技术大神——多隆,我向他学习到了很多排查问题的技巧。和他比,我排查问题的能力就是初级的那种。 印象最深刻的是一次我们一起查一个应用cpu us高的问题,我们两定位到是一段代码在某种输入参数的时候会造成cpu us高的原因后,我能想到的继续查的方法是去生产环境抓输入参数,然后再用参数来本地debug看是什么原因。但多隆在看了一会那段代码后,给了我一个输入参数,我拿这个参数一运行,果然cpu us很高!这种case不是一次两次。所以我经常和别人说,我是需要有问题场景才能排查出问题的,但多隆是完全有可能直接看代码就能看出问题的,这是本质的差距。 除了查问题外,更厉害的程序员是在写代码的过程就会很好的去避免问题。大家最容易理解的就是在写代码时处理各种异常情况,这里通常也是造成程序员们之间很大的差距的地方。 写一段正向逻辑的代码,大部分情况下即使有差距,也不会太大,但在怎么很好的处理这个过程中有可能出现的异常上,这个时候的功力差距会非常明显。很多时候一段代码里处理异常逻辑的部分都会超过正常逻辑的代码量。 我经常说,一个优秀程序员和普通程序员的差距,很多时候压根就不需要看什么满天飞的架构图,而只用show一小段的代码就可以。 举一个小case大家感受下。当年有一个严重故障,最后查出的原因是输入的参数里有一个是数组,把这个数组里的值作为参数去查数据库,结果前面输入了一个很大的数组,导致从数据库查了大量的数据,内存溢出了,很多程序员现在看都会明白对入参、出参的保护check,但类似这样的case我真的碰到了很多。 在中级这个阶段,我会推荐大家尽可能的多刻意的去培养下自己这两个方面的能力,成为一个能写出高质量代码、有效排查问题的优秀程序员。 3、编程能力高级:懂高级API和原理 就我自己的经历而言,我是在写了多年的Java代码后,才开始真正更细致的学习和掌握Java的一些更高级的API,我相信多数Java程序员也是如此。 我算是从2003年开始用Java写商业系统的代码,但直到在2007年加入淘宝后,才开始非常认真地学习Java的IO通信、并发这些部分的API。尽管以前也学过也写过一些这样的代码,但完全就是皮毛。当然,这些通常来说有很大部分的原因会是工作的相关性,多数的写业务系统的程序员可能基本就不需要用到这些,所以导致会很难懂这些相对高级一些的API,但这些API对真正的理解一门编程语言,我觉得至关重要。 在之前的程序员成长路线的文章里我也讲到了这个部分,在没有场景的情况下,只能靠自己去创造场景来学习好。我觉得只要有足够的兴趣,这个问题还是不大的,毕竟现在有各种开源,这些是可以非常好的帮助自己创造机会学习的,例如学Java NIO,可以自己基于NIO包一个框架,然后对比Netty,看看哪些写的是不如Netty的,这样会非常有助于真正的理解。 在学习高级API的过程中,以及排查问题的过程中,我自己越来越明白懂编程语言的运行原理是非常重要的,因此我到了后面的阶段开始学习Java的编译机制、内存管理、线程机制等。对于我这种非科班出身的而言,学这些会因为缺乏基础更难很多,但这些更原理性的东西学会了后,对自己的编程能力会有质的提升,包括以后学习其他编程语言的能力,学这些原理最好的方法我觉得是先看看一些讲相关知识的书,然后去翻看源码,这样才能真正的更好的掌握,最后是在以后写代码的过程中、查问题的过程中多结合掌握的原理,才能做到即使在N年后也不会忘。 在编程能力的成长上,我觉得没什么捷径。我非常赞同1万小时理论,在中级、高级阶段,如果有人指点或和优秀的程序员们共事,会好非常多。不过我觉得这个和读书也有点像,到了一定阶段后(例如高中),天分会成为最重要的分水岭,不过就和大部分行业一样,大部分的情况下都还没到拼天分的时候,只需要拼勤奋就好。 系统设计能力的成长 除了少数程序员会进入专深的领域,例如Linux Kernel、JVM,其他多数的程序员除了编程能力的成长外,也会越来越需要在系统设计能力上成长。 通常一个编程能力不错的程序员,在一定阶段后就会开始承担一个模块的工作,进而承担一个子系统、系统、跨多领域的更大系统等。 我自己在工作的第三年开始承担一个流程引擎的设计和实现工作,一个不算小的系统,并且也是当时那个项目里的核心部分。那个阶段我学会了一些系统设计的基本知识,例如需要想清楚整个系统的目标、模块的划分和职责、关键的对象设计等,而不是上来就开始写代码。但那个时候由于我是一个人写整个系统,所以其实对设计的感觉并还没有那么强力的感觉。 在那之后的几年也负责过一些系统,但总体感觉好像在系统设计上的成长没那么多,直到在阿里的经历,在系统设计上才有了越来越多的体会。(点击文末阅读原文,查看:我在系统设计上犯过的14个错,可以看到我走的一堆的弯路)。 在阿里有一次做分享,讲到我在系统设计能力方面的成长,主要是因为三段经历,负责专业领域系统的设计 -> 负责跨专业领域的专业系统的设计 -> 负责阿里电商系统架构级改造的设计。 第一段经历,是我负责HSF。HSF是一个从0开始打造的系统,它主要是作为支撑服务化的框架,是个非常专业领域的系统,放在整个淘宝电商的大系统来看,其实它就是一个很小的子系统,这段经历里让我最深刻的有三点: 1).要设计好这种非常专业领域的系统,专业的知识深度是非常重要的。我在最早设计HSF的几个框的时候,是没有设计好服务消费者/提供者要怎么和现有框架结合的,在设计负载均衡这个部分也反复了几次,这个主要是因为自己当时对这个领域掌握不深的原因造成的; 2). 太技术化。在HSF的阶段,出于情怀,在有一个版本里投入了非常大的精力去引进OSGi以及去做动态化,这个后来事实证明是个非常非常错误的决定,从这个点我才真正明白在设计系统时一定要想清楚目标,而目标很重要的是和公司发展阶段结合; 3). 可持续性。作为一个要在生产环境持续运行很多年的系统而言,怎么样让其在未来更可持续的发展,这个对设计阶段来说至关重要。这里最low的例子是最早设计HSF协议的时候,协议头里竟然没有版本号,导致后来升级都特别复杂;最典型的例子是HSF在早期缺乏了缺乏了服务Tracing这方面的设计,导致后面发现了这个地方非常重要后,全部落地花了长达几年的时间;又例如HSF早期缺乏Filter Chain的设计,导致很多扩展、定制化做起来非常不方便。 第二段经历,是做T4。T4是基于LXC的阿里的容器,它和HSF的不同是,它其实是一个跨多领域的系统,包括了单机上的容器引擎,容器管理系统,容器管理系统对外提供API,其他系统或用户通过这个来管理容器。这个系统发展过程也是各种犯错,犯错的主要原因也是因为领域掌握不深。在做T4的日子里,学会到的最重要的是怎么去设计这种跨多个专业领域的系统,怎么更好的划分模块的职责,设计交互逻辑,这段经历对我自己更为重要的意义是我有了做更大一些系统的架构的信心。 第三段经历,是做阿里电商的异地多活。这对我来说是真正的去做一个巨大系统的架构师,尽管我以前做HSF的时候参与了淘宝电商2.0-3.0的重大技术改造,但参与和自己主导是有很大区别的,这个架构改造涉及到了阿里电商众多不同专业领域的技术团队。在这个阶段,我学会的最主要的: 1). 子系统职责划分。在这种超大的技术方案中,很容易出现某些部分的职责重叠和冲突,这个时候怎么去划分子系统,就非常重要了。作为大架构师,这个时候要从团队的职责、团队的可持续性上去选择团队; 2). 大架构师最主要的职责是控制系统风险。对于这种超大系统,一定是多个专业领域的架构师和大架构师共同设计,怎么确保在执行的过程中对于系统而言最重要的风险能够被控制住,这是我真正的理解什么叫系统设计文档里设计原则的部分。 设计原则我自己觉得就是用来确保各个子系统在设计时都会遵循和考虑的,一定不能是虚的东西,例如在异地多活架构里,最重要的是如何控制数据风险,这个需要在原则里写上,最基本的原则是可接受系统不可用,但也要保障数据一致,而我看过更多的系统设计里设计原则只是写写的,或者千篇一律的,设计原则切实的体现了架构师对目标的理解(例如当时异地多活这个其实开始只是个概念,但做到什么程度才叫做到异地多活,这是需要解读的,也要确保在技术层面的设计上是达到了目标的),技术方案层面上的选择原则,并确保在细节的设计方案里有对于设计原则的承接以及执行; 3). 考虑问题的全面性。像异地多活这种大架构改造,涉及业务层面、各种基础技术层面、基础设施层面,对于执行节奏的决定要综合考虑人力投入、机器成本、基础设施布局诉求、稳定性控制等,这会比只是做一个小的系统的设计复杂非常多。 系统设计能力的成长,我自己觉得最重要的一是先在一两个技术领域做到专业,然后尽量扩大自己的知识广度。例如除了自己的代码部分外,还应该知道具体是怎么部署的,部署到哪去了,部署的环境具体是怎么样的,和整个系统的关系是什么样的。 像我自己,是在加入基础设施团队后才更加明白有些时候软件上做的一个决策,会导致基础设施上巨大的硬件、网络或机房的投入,但其实有可能只需要在软件上做些调整就可以避免,做做研发、做做运维可能是比较好的把知识广度扩大的方法。 第二点是练习自己做tradeoff的能力,这个比较难,做tradeoff这事需要综合各种因素做选择,但这也是所有的架构师最关键的,可以回头反思下自己在做各种系统设计时做出的tradeoff是什么。这个最好是亲身经历,听一些有经验的架构师分享他们选择背后的逻辑也会很有帮助,尤其是如果恰好你也在同样的挑战阶段,光听最终的架构结果其实大多数时候帮助有限。 技术Leader我觉得最好是能在架构师的基础上,后续注重成长的方面还是有挺大差别,就不在这篇里写了,后面再专门来写一篇。 程序员金字塔 我认为程序员的价值关键体现在作品上,被打上作品标签是一种很大的荣幸,作品影响程度的大小我觉得决定了金字塔的层次,所以我会这么去理解程序员的金字塔。 当然,要打造一款作品,仅有上面的两点能力是不够的,作品里很重要的一点是对业务、技术趋势的判断。 希望作为程序员的大伙,都能有机会打造一款世界级的作品,去为技术圈的发展做出贡献。 由于目前IT技术更新速度还是很快的,程序员这个行当是特别需要学习能力的。我一直认为,只有对程序员这个职业真正的充满兴趣,保持自驱,才有可能在这个职业上做好,否则的话是很容易淘汰的。 作者简介: 毕玄,2007年加入阿里,十多年来主要从事在软件基础设施领域,先后负责阿里的服务框架、Hbase、Sigma、异地多活等重大的基础技术产品和整体架构改造。

茶什i 2020-01-10 15:19:35 0 浏览量 回答数 0

回答

如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会选择哪本书呢。我希望这个书单列表内容丰富,可以涵盖很多东西。” 1、《代码大全》 史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,《代码大全》注重个人技术,其中所有东西加起来, 就是我们本能所说的“编写整洁的代码”。这本书有50页在谈论代码布局。” —— Joel Spolsky 对于新手来说,这本书中的观念有点高阶了。到你准备阅读此书时,你应该已经知道并实践过书中99%的观念。– esac Steve McConnell的原作《代码大全》(第1版)是公认的关于编程的最佳实践指南之一, 在过去的十多年间,本书一直在帮助开发人员编写更好的软件。 现在,作者将这本经典著作全新演绎,融入了最前沿的实践技术,加入了上百个崭新的代码示例, 充分展示了软件构建的艺术性和科学性。 McConnell汇集了来自研究机构、学术界以及业界日常实践的主要知识, 把最高效的技术和最重要的原理交织融会为这本既清晰又实用的指南。 无论您的经验水平如何,也不管您在怎样的开发环境中工作,也无论项目是大是小, 本书都将激发您的思维并帮助您构建高品质的代码。 《代码大全(第2版))》做了全面的更新,增加了很多与时俱进的内容,包括对新语言、新的开发过程与方法论的讨论等等。 2、《程序员修炼之道》 推荐数:1504 对于那些已经学习过编程机制的程序员来说,这是一本卓越的书。 或许他们还是在校生,但对要自己做什么,还感觉不是很安全。 就像草图和架构之间的差别。虽然你在学校课堂上学到的是画图,你也可以画的很漂亮, 但如果你觉得你不太知道从哪儿下手,如果某人要你独自画一个P2P的音乐交换网络图,那这本书就适合你了。—— Joel 《程序员修炼之道:从小工到专家》内容简介:《程序员修炼之道》由一系列独立的部分组成, 涵盖的主题从个人责任、职业发展,知道用于使代码保持灵活、并且易于改编和复用的各种架构技术, 利用许多富有娱乐性的奇闻轶事、有思想性的例子及有趣的类比, 全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。 无论你是初学者,是有经验的程序员,还是软件项目经理,《程序员修炼之道:从小工到专家》都适合你阅读。 3、《计算机程序的构造和解释》 推荐数:916 就个人而言,这本书目前为止对我影响醉倒的一本编程书。 《代码大全》、《重构》和《设计模式》这些经典书会教给你高效的工作习惯和交易细节。 其他像《人件集》、《计算机编程心理学》和《人月神话》这些书会深入软件开发的心理层面。 其他书籍则处理算法。这些书都有自己所属的位置。 然而《计算机程序的构造和解释》与这些不同。 这是一本会启发你的书,它会燃起你编写出色程序的热情; 它还将教会你认识并欣赏美; 它会让你有种敬畏,让你难以抑制地渴望学习更多的东西。 其他书或许会让你成为一位更出色的程序员,但此书将一定会让你成为一名程序员。 同时,你将会学到其他东西,函数式编程(第三章)、惰性计算、元编程、虚拟机、解释器和编译器。 一些人认为此书不适合新手。 个人认为,虽然我并不完全认同要有一些编程经验才能读此书,但我还是一定推荐给初学者。 毕竟这本书是写给著名的6.001,是麻省理工学院的入门编程课程。 此书或许需要多做努力(尤其你在做练习的时候,你也应当如此),但这个价是对得起这本书的。 4、《C程序设计语言》 推荐数:774 这本书简洁易读,会教给你三件事:C 编程语言;如何像程序员一样思考;底层计算模型。 (这对理解“底层”非常重要)—— Nathan 《C程序设计语言》(第2版新版)讲述深入浅出,配合典型例证,通俗易懂,实用性强, 适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。 《C程序设计语言》(第2版新版)原著即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的 一本介绍C语言的权威经典著作。 我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。 原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。 人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。 5、《算法导论》 推荐数:671 《代码大全》教你如何正确编程; 《人月神话》教你如何正确管理; 《设计模式》教你如何正确设计…… 在我看来,代码只是一个工具,并非精髓。 开发软件的主要部分是创建新算法或重新实现现有算法。 其他部分则像重新组装乐高砖块或创建“管理”层。 我依然梦想这样的工作,我的大部分时间(>50%)是在写算法,其他“管理”细节则留给其他人…… —— Ran Biron 经典的算法书,被亚马逊网,《程序员》等评选为2006年最受读者喜爱的十大IT图书之一。 算法领域的标准教材,全球多所知名大学选用 MIT名师联手铸就,被誉为“计算机算法的圣经” 编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。 6、《重构:改善既有代码的设计》 推荐数:617 《重构:改善既有代码的设计》清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式, 并给出了何时以及何地应该开始挖掘代码以求改善。 书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。 《重构:改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。 《重构:改善既有代码的设计》适合软件开发人员、项目管理人员等阅读, 也可作为高等院校计算机及相关专业师生的参考读物。 我想我不得不推荐《重构》:改进现有代码的设计。—— Martin 我必须承认,我最喜欢的编程语录是出自这本书:任何一个傻瓜都能写出计算机能理解的程序, 而优秀的程序员却能写出别人能读得懂的程序。—— Martin Fowler 7、《设计模式》 推荐数:617 自1995年出版以来,本书一直名列Amazon和各大书店销售榜前列。 近10年后,本书仍是Addison-Wesley公司2003年最畅销的图书之一。 中文版销售逾4万册。 就我而言,我认为四人帮编著的《设计模式》是一本极为有用的书。 虽然此书并不像其他建议一样有关“元”编程,但它强调封装诸如模式一类的优秀编程技术, 因而鼓励其他人提出新模式和反模式(antipatterns),并运用于编程对话中。—— Chris Jester-Young 8、《人月神话》 推荐数:588 在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。 Brooks博士为人们管理复杂项目提供了最具洞察力的见解。 既有很多发人深省的观点,又有大量软件工程的实践。 本书内容来自Brooks博士在IBM公司System/360家族和OS/360中的项目管理经验。 该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄中等多种语言,全球销量数百万册。 确立了其在行业内的经典地位。 9、《计算机程序设计艺术》 推荐数:542 《计算机程序设计艺术》系列著作对计算机领域产生了深远的影响。 这一系列堪称一项浩大的工程,自1962年开始编写,计划出版7卷,目前已经出版了4卷。 《美国科学家》杂志曾将这套书与爱因斯坦的《相对论》等书并列称为20世纪最重要的12本物理学著作。 目前Knuth正将毕生精力投入到这部史诗性著作的撰写中。 这是高德纳倾注心血写的一本书。—— Peter Coulton 10、《编译原理》(龙书) 推荐数:462 我很奇怪,居然没人提到龙书。(或许已有推荐,我没有看到)。 我从没忘过此书的第一版封面。 此书让我知道了编译器是多么地神奇绝妙。- DB 11、《深入浅出设计模式》 推荐数:445 强大的写作阵容。 《Head First设计模式》(中文版) 作者Eric Freeman; ElElisabeth Freeman是作家、讲师和技术顾问。 Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。 Kathy Sierra(javaranch.com的创始人)FHBert Bates是畅销的HeadFirst系列书籍的创立者,也是Sun公司Java开发员认证考试的开发者。 本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里, 不容易被遗忘。 本书的编写方式采用引导式教学,不直接告诉你该怎么做,而是利用故事当作引子,带领读者思考并想办法解决问题。 解决问题的过程中又会产生一些新的问题,再继续思考、继续解决问题,这样可以加深体会。 作者以大量的生活化故事当背景,例如第1章是鸭子,第2章是气象站,第3章是咖啡店, 书中搭配大量的插图(几乎每一页都有图),所以阅读起来生动有趣,不会感觉到昏昏欲睡。 作者还利用歪歪斜斜的手写字体,增加“现场感”。 精心设计许多爆笑的对白,让学习过程不会太枯燥。 还有模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。 每一章都有数目不等的测验题。 每章最后有一页要点整理,这也是精华所在,我都是利用这一页做复习。 我知道四人帮的《设计模式》是一本标准书,但倒不如先看看这部大部头,此书更为简易。 一旦你了解了解了基本原则,可以去看四人帮的那本圣经了。- Calanus 12、《哥德尔、艾舍尔、巴赫书:集异璧之大成》 推荐数:437 如果下昂真正深入阅读,我推荐道格拉斯·侯世达(Douglas Hofstadter)的《哥德尔、艾舍尔、巴赫书》。 他极为深入研究了程序员每日都要面对的问题:递归、验证、证明和布尔代数。 这是一本很出色的读物,难度不大,偶尔有挑战,一旦你要鏖战到底,将是非常值得的。 – Jonik 13、《代码整洁之道》 推荐数:329 细节之中自有天地,整洁成就卓越代码 尽管糟糕的代码也能运行,但如果代码不整洁,会使整个开发团队泥足深陷, 写得不好的代码每年都要耗费难以计数的时间和资源。 然而这种情况并非无法避免。 著名软件专家RoberfC.Marlin在《代码整洁之道》中为你呈现出了革命性的视野。 Martin携同ObjectMetltor公司的同事,从他们有关整洁代码的最佳敏捷实践中提炼出软件技艺的价值观, 以飨读者,让你成为更优秀的程序员——只要你着手研读《代码整洁之道》。 阅读《代码整洁之道》需要你做些什么呢。你将阅读代码——大量代码。 《代码整洁之道》促使你思考代码中何谓正确,何谓错误。 更重要的是,《代码整洁之道》将促使你重新评估自己的专业价值观,以及对自己技艺的承诺。 从《代码整洁之道》中可以学到: 好代码和糟糕的代码之间的区别; 如何编写好代码,如何将糟糕的代码转化为好代码; 如何创建好名称、好函数、好对象和好类; 如何格式化代码以实现其可读性的最大化; 如何在不妨碍代码逻辑的前提下充分实现错误处理; 如何进行单元测试和测试驱动开发。 虽然《代码整洁之道》和《代码大全》有很多共同之处,但它有更为简洁更为实际的清晰例子。 – Craig P. Motlin 14、《Effective C++》和《More Effective C++》 推荐数:297 在我职业生涯早期,Scott Meyer的《Effective C++》和后续的《More Effective C++》都对我的编程能力有着直接影响。 正如当时的一位朋友所说,这些书缩短你培养编程技能的过程,而其他人可能要花费数年。 去年对我影响最大的一本书是《大教堂与市集》,该书教会我很有关开源开发过程如何运作,和如何处理我代码中的Bug。 – John Channing 15、《编程珠玑》 推荐数:282 多年以来,当程序员们推选出最心爱的计算机图书时,《编程珠玑》总是位列前列。 正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力, 从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”, 成为世界计算机界名刊《ACM通讯》历史上最受欢迎的专栏, 最终结集为两部不朽的计算机科学经典名著,影响和激励着一代又一代程序员和计算机科学工作者。 本书为第一卷,主要讨论计算机科学中最本质的问题:如何正确选择和高效地实现算法。 尽管我不得不羞愧地承认,书中一半的东西我都没有理解,但我真的推荐《编程珠玑》,书中有些令人惊奇的东西。 – Matt Warren 16、《修改代码的艺术》by Michael Feathers 本书是继《重构》和《重构与模式》之后探讨修改代码技术的又一里程碑式的著作, 而且从涵盖面和深度上都超过了前两部经典。 书中不仅讲述面向对象语言(Java、C#和C++)代码,也有专章讨论C这样的过程式语言。 作者将理解、测试和修改代码的原理、技术和最新工具(自动化重构工具、单元测试框架、仿对象、集成测试框架等), 与解依赖技术和大量开发和设计优秀代码的原则、最佳实践相结合,许多内容非常深入,而且常常发前人所未发。 书中处处体现出作者独到的洞察力,以及多年开发和指导软件项目所积累的丰富经验和深厚功力。 通过这部集大成之作,你不仅能掌握最顶尖的修改代码技术,还可以大大提高对代码和软件开发的领悟力。 我认为没有任何一本书能向这本书一样影响了我的编程观点。 它明确地告诉你如何处理其他人的代码,含蓄地教会你避免哪些(以及为什么要避免)。- Wolfbyte 同意。很多开发人员讨论用干净的石板来编写软件。 但我想几乎所有开发人员的某些时候是在吃其他开发人员的狗食。– Bernard Dy 17、《编码:隐匿在计算机软硬件背后的语言》 这是一本讲述计算机工作原理的书。 不过,你千万不要因为“工作原理”之类的字眼就武断地认为,它是晦涩而难懂的。 作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。 更重要的是,你会因此而获得对计算机工作原理较深刻的理解。 这种理解不是抽象层面上的,而是具有一定深度的,这种深度甚至不逊于“电气工程师”和“程序员”的理解。 不管你是计算机高手,还是对这个神奇的机器充满敬畏之心的菜鸟, 都不妨翻阅一下《编码:隐匿在计算机软硬件背后的语言》,读一读大师的经典作品,必然会有收获。 我推荐Charles Petzold的《编码》。 在这个充满工具和IDE的年代,很多复杂度已经从程序员那“抽取”走了,这本书一本开眼之作。 – hemil 18、《禅与摩托车维修艺术 / Zen and the Art of Motorcycle Maintenance》 对我影响最大的那本书是 Robert Pirsig 的《禅与摩托车维修艺术》。 不管你做什么事,总是要力求完美,彻底了解你手中的工具和任务,更为重要的是, 要有乐趣(因为如果你做事有乐趣,一切将自发引向更好的结果)。 – akr 19、《Peopleware / 人件集:人性化的软件开发》 Demarco 和 Lister 表明,软件开发中的首要问题是人,并非技术。 他们的答案并不简单,只是令人难以置信的成功。 第二版新增加了八章内容。 – Eduardo Molteni 20、《Coders at Work / 编程人生》 这是一本访谈笔录,记录了当今最具个人魅力的15位软件先驱的编程生涯。 包括DonaldKnuth、Jamie Zawinski、Joshua Bloch、Ken Thompson等在内的业界传奇人物,为我们讲述了 他们是怎么学习编程的,在编程过程中发现了什么以及他们对未来的看法, 并对诸如应该如何设计软件等长久以来一直困扰很多程序员的问题谈了自己的观点。 一本非常有影响力的书,可以从中学到一些业界顶级人士的经验,了解他们如何思考并工作。 – Jahanzeb Farooq 21、《Surely You’re Joking, Mr. Feynman! / 别闹了,费曼先生。》 虽然这本书可能有点偏题,但不管你信不信,这本书曾在计算机科学专业课程的阅读列表之上。 一个优秀的角色模型,一本有关好奇心的优秀书籍。 – mike511 22、《Effective Java 中文版》 此书第二版教你如何编写漂亮并高效的代码,虽然这是一本Java书,但其中有很多跨语言的理念。 – Marcio Aguiar 23、《Patterns of Enterprise Application Architecture / 企业应用架构模式》 很奇怪,还没人推荐 Martin Fowler 的《企业应用架构模式》- levi rosol 24、《The Little Schemer》和《The Seasoned Schemer》 nmiranda 这两本是LISP的英文书,尚无中文版。 美国东北大学网站上也有电子版。 25、《交互设计之路》英文名:《The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity》该书作者:Alan Cooper,人称Visual Basic之父,交互设计之父。 本书是基于众多商务案例,讲述如何创建更好的、高客户忠诚度的软件产品和基于软件的高科技产品的书。 本书列举了很多真实可信的实际例子,说明目前在软件产品和基于软件的高科技产品中,普遍存在着“难用”的问题。 作者认为,“难用”问题是由这些产品中存在着的高度“认知摩擦”引起的, 而产生这个问题的根源在于现今软件开发过程中欠缺了一个为用户利益着想的前期“交互设计”阶段。 “难用”的产品不仅损害了用户的利益,最终也将导致企业的失败。 本书通过一些生动的实例,让人信服地讲述了由作者倡导的“目标导向”交互设计方法在解决“难用”问题方面的有效性, 证实了只有改变现有观念,才能有效地在开发过程中引入交互设计,将产品的设计引向成功。 本书虽然是一本面向商务人员而编写的书,但也适合于所有参与软件产品和基于软件的高科技产品开发的专业人士, 以及关心软件行业和高科技行业现状与发展的人士阅读。 他还有另一本中文版著作:《About Face 3 交互设计精髓》 26、《Why’s (Poignant) Guide to Ruby 》 如果你不是程序员,阅读此书可能会很有趣,但如果你已经是个程序员,可能会有点乏味。 27、《Unix编程艺术》 It is useful regardless operating system you use. – J.F. Sebastian 不管你使用什么操作系统,这本书都很有用。 – J.F. Sebastian 28、《高效程序员的45个习惯:敏捷开发修炼之道》 45个习惯,分为7个方面:工作态度、学习、软件交付、反馈、编码、调试和协作。 每一个具体的习惯里,一开始提出一个谬论,然后展开分析,之后有正队性地提出正确的做法,并设身处地地讲出了正确做法给你个人的“切身感受”,最后列出几条注意事项,帮助你修正自己的做法(“平衡的艺术”)。 29、《测试驱动开发》 前面已经提到的很多书都启发了我,并影响了我,但这本书每位程序员都应该读。 它向我展示了单元测试和TDD的重要性,并让我很快上手。 – Curro 我不关心你的代码有多好或优雅。 如果你没有测试,你或许就如同没有编写代码。 这本书得到的推荐数应该更高些。 人们讨论编写用户喜欢的软件,或既设计出色并健壮的高效代码,但如果你的软件有一堆bug,谈论那些东西毫无意义。– Adam Gent 30、《点石成金:访客至上的网页设计秘笈》 可用性设计是Web设计中最重要也是难度最大的一项任务。 《点石成金-访客至上的网页设计秘笈(原书第二版)》作者根据多年从业的经验,剖析用户的心理, 在用户使用的模式、为扫描进行设计、导航设计、主页布局、可用性测试等方面提出了许多独特的观点, 并给出了大量简单、易行的可用性设计的建议。 本书短小精炼,语言轻松诙谐,书中穿插大量色彩丰富的屏幕截图、趣味丛生的卡通插图以及包含大量信息的图表, 使枯燥的设计原理变得平易近人。 本书适合从事Web设计和Web开发的技术人员阅读,特别适合为如何留住访问者而苦恼的网站/网页设计人员阅读。 这是一本关于Web设计原则而不是Web设计技术的书。 本书作者是Web设计专家,具有丰富的实践经验。 他用幽默的语言为你揭示Web设计中重要但却容易被忽视的问题,只需几个小时, 你便能对照书中讲授的设计原则找到网站设计的症结所在,令你的网站焕然一新。

青衫无名 2019-12-02 01:20:04 0 浏览量 回答数 0

回答

【丁宁-清华大学-阿里达摩院自然语言技术实习体验】 作者简介:丁宁,清华大学计算机科学与技术系2年级博士生,研究方向为自然语言处理、信息抽取、语言表示学习等,在ACL、EMNLP、AAAI、IJCAI等发表多篇文章,作为研究型实习生在阿里达摩院实习半年+。 实习体会 很幸运能来到阿里巴巴进行实习!组里的氛围特别好,同事和师兄师姐都非常专业、友善、亲切。无论是科研上还是工作生活上的任 何问题,都能得到慷慨的帮助。在这里,我认识了一批学术和生活上的榜样(我的主管每天都吃健康餐,而我牛肉汤泡饼),结交了志同道合的朋友(排队喝牛肉汤回来写论文的日子),见识到了IT同学的认真负责(远程帮我调试打印机,周末修电脑),见过了马云老师,也亲身经历了一次双十一奋战。阿里的科研积淀和文化氛围都让我感到收获颇丰,感谢阿里巴巴提供研究型实习生这一高水平项目,也期待更多的同学可以加入研究型实习生的大家庭。 科研心得& 工作宣传 今年在阿里巴巴所做的跨领域分词工作被ACL 2020高分接收,其中meta review说“well-written, well-motivated with strong results, sure accept”。其实这句话可以很好地总结评判科研论文好坏的标准,实际上或许现阶段的科研也并没有什么秘密,动机明确、方法得当、实验充分,就可以形成一篇不错的科研论文。当然了,如果想做出让领域内眼前一亮的工作,可能就需要一些灵光一闪了。 具体到我们的工作上来,跨领域任务往往面临目标领域精标注数据缺失的问题,具体到分词任务上来说,这种数据缺失往往会导致OOV和词的分布差异问题。本文通过弱监督启发式算法来进行远程标注,并引入对抗学习来进行降噪。本文的实验中以newswire (新闻语料)作为源领域,在5个不同的目标领域数据上都取得了较好的效果。 这个工作或许有助于我们真正的往跨领域的两个通用问题上去设计了相关的解决办法。论文名字:《Coupling Distant Annotation and Adversarial Training for Cross-Domain Chinese Word Segmentation》,具体可以查看达摩院的官方宣传~:ACL 2020有哪些值得关注的论文? - 阿里巴巴达摩院的回答 - 知乎https://www.zhihu.com/question/385259014/answer/1190808208 另外,也宣传一下作为co-author的另一篇ACL 2020论文,是实习生同事周洁(上海交大研究生)的工作,瞄准多层级文本分类任务,设计层级敏感编码器将多层结构作为有向图建模,并且实现了一个串行和并行的版本,论文名字:Hierarchy-Aware Global Model for Hierarchical Text Classification。 还有另一个实习生同事张浩宇(国防科大博士生)在IJCAI 2020的工作,使用noisy learning的方法去进行远程监督entity typing降噪,方法非常优雅,论文名字:Learning with Noise: Improving Distantly-Supervised Fine-grained Entity Typing via Automatic Relabeling。 【杜志浩-哈尔滨工业大学-我在达摩院作实习研究僧的那些事儿】 经韩老师介绍,2019年7月,有幸进入阿里巴巴达摩院成为一名实习研究僧。如今也已半年有余,期间发生的事情仍然历历在目。从初出茅庐的不安,到积极融入的快乐,再到宠辱不惊的泰然,一路走来收获良多! 初出茅庐 其实,刚到达摩院语音算法组时,我的内心充满了不安。这种不安来自于初出茅庐的不自信,不知自己能否胜任这份工作,为公司带来效益。同时,也来自于环境转变的不适应,换了一个全新的环境,对公司内的工作方式、待人接物都不甚了解。 但是,在算法组师兄师姐的帮助下,我的这些不安很快就烟消云散了。为了能够使我尽快熟悉工作内容、了解工作方式,雷鸣师兄坚持每周四晚上为实习生开组会,拉着仕良哥、智颖等很多小伙伴一起讨论算法思路和实验中遇到的问题。我想他们应该都挺忙的吧,但还是牺牲自己休息的时间来参加组会。 刚来的那段时间,除了“雷老师,xxx麻烦审批通过一下”以外,我说的最多的恐怕就是“xx姐/哥,xxx在哪”。由于对很多事情都不了解,比如服务器怎么申请啊,oss怎么弄啊,我总是要麻烦逍北姐、遥仙哥等目之所及的小伙伴。他们一边在忙自己的工作一边还不厌其烦的告诉我,为我提供了莫大的帮助。 积极融入 在算法组这段时间,让我印象最为深刻的一句话就是“我们做事情都很直接,有什么问题,就带着方案提出来”。以前,总是被教育和鼓励发现问题,在阿里,找到问题只是完成了第一步,还需要再提出一个切实可行的解决方案。期间发生的一段小插曲让我现在依然记忆犹新。  为了准备910,语音测试组的小伙伴每天都在紧张的进行测试。其中一项是对语音实时转录及翻译软件的稳定性测试。由于已经进入应用阶段,不能在直接将数据送入到模型中,需要将语音播放出来,再由软件录音进行测试。播放的内容是马老师的演讲,对于坐在旁边的小伙伴来说既是一件好事,也是一件坏事。由于马老师的演讲实在太引人入胜了,每次他们进行测试时,我们都无法专心工作,最终只能……。 咳咳,我心想,这么下去也不是事儿啊,梦想要有,生活也得继续啊,得想想办法解决一下这个问题。我尝试了各种办法,但似乎都无法绕过功放这个问题。最终功夫不负有心人,找到了一款虚拟声卡的软件,能够将一个应用程序的音频输出直接作为另一个应用程序的输入。在熟悉过这个软件的使用方式后,我找到测试组的组长,向他提出了我现在的处境和解决方案。他告诉我,他也知道这样会打扰到周边的人,但是之前也没有太好的办法,感谢我提出的解决方案。 虽然这只是实习期间的一段小插曲,但是我依然印象深刻。通过这件事,我践行了带着方案提问题,这一阿里人所特有的工作方式,让我感觉自己正在逐渐融入到这个集体当中。 宠辱不惊 经过几个月“死去”又“活来”的做实验、写论文,我跟雷鸣师兄合作的语音增强相关工作投稿到了ICASSP 2020。这是语音信号处理领域的顶级会议,在来阿里之前,我也投稿过一次,但不幸被拒。为了准备这篇文章,雷鸣师兄跟我保持着很高互动,了解实验进度,适时的进行指导。此外,还有仕良哥帮助我进行语音畸变的评估。 2020年1月25日这一天,是我国的传统节日,春节,同时也是ICASSP出结果的日子。在得知结果前,我的内心非常忐忑。但当得知接收的喜讯时,我反而没有想象中那么兴奋,没有想象中那么高兴。我的第一反应是看看审稿人的意见,看看我专家们对我文章的看法,还有哪些不足和需要改进的地方。 我想宠辱不惊的心态应该是我在阿里的一个重要收获吧,不以物喜不以己悲。尽力做好自己该做的事儿,结果自然水到渠成。 再说两句 在阿里的这段实习使我受益匪浅。这里有乐于助人、善解人意的师兄师姐,也有认真负责、要求严格的主管Leader;有弹性自由的工作时间,也有肝到深夜的满腔热情;有最新最热的研究成果,也有成熟稳定的应用软件。这里不像实验室的象牙塔,关注技术的同时,也更关注技术如何落地、如何应用到生活中去,最终如何造福亿万用户。 韩鹏-KAUST-青春没有我之阿里巴巴天猫精灵争夺赛被迫写的研究心得 竞选宣言: 在阿里实习摸了几个月的鱼,最开心的就是又吃到了祖国的美食,虽然杭州的食物实在是太清淡了,但总比我在沙特每天吃水煮青菜不放盐要好很多。在阿里的这几个月,让我看淡了很多,发现生命里比较重要的就是长在自己脑袋上的头发,不能太年轻就失去他们。女网红我是感觉自己这辈子没机会了,毕竟流量明星也不是靠推荐算法能捧红的,也就希望能够得到这次500块钱的天猫精灵,请大家pick我。 研究心得: 多抱大腿 为了凑足300字的内心情感白描: 这个世界实在是太无聊了,尤其疫情导致的只能居家办公,我已经憋得快精神失常了,虽然平时也不是那么正常。希望这个世界早日恢复原来的美好,我还打算去越南胡志明市的日式KTV感受一下女仆装呢,希望疫情不会让这些服务业倒闭呢吧。 居然还不够300字,感觉生命浪费在写文字上要比大保健上还是好一些的,希望这些文字能够启发你,虽然我感觉也并没有什么意义,而人活着的意义又是什么呢? 【韩镕罄-南加州大学- 阿里研究型实习生体验】 简介: 经过两年研究时间,找到了学校的教职,也找到了老婆,感谢阿里~ 2018年八月来阿里做研究型实习生,本人在南加州大学商学院读Operations Management 的Ph.D. 块两年时间做了几篇 field experiment paper, 感觉阿里有太多好玩有趣的商业问题可以讨论直接研究。 通过和阿里的合作顺利找到UIUC 伊利诺伊大学香槟分校的常任轨教职。 更神奇的是,在实习期间,随便刷个阿里妹儿的相亲帖, 加个微信 聊一聊 发现和自己一天生日。 就是你了!现在已经结婚快半年! 三十而立,一切静好,感谢阿里! 【马腾-清华大学- 阿里巴巴RI项目心得】 我与阿里之缘 在2019年的夏天,后来成为我主管的文侑来到清华进行交流,当时的我刚刚完成了一个学术项目的研究,正在寻求于之后的研究方向。恰好在交流会上碰见了文侑,经过一番交流之后吗,了解到操作系统团队是阿里 RDMA 技术的先行者和推广者,这正是我计划之后想要研究的方向,于是便一拍即合。由于我之前所研究的领域刚好符合是阿里目前正在做的一些项目,所以文侑提供了一个可以在阿里实习的机会。 在通过了多轮面试之后,我终于成功的入职了操作系统内核组作为学术型实习生。从2018年九月初入职至今,将近两年的时间,我也逐渐地适应了在阿里的生活,松弛有度而又充满欢乐。在这里我也结识了许多要好的朋友,并且,通过公司组织的各种聚会和团建的活动,让我解释了许多有着共同语言爱好的伙伴,大家给与了我这个新人很多的帮助和照顾,使我也渐渐地融入了这个有爱的团队。 在阿里的学术成果 在阿里实习期间,在同事们的帮助下,我顺利地完成了两个与我所在实验室合作的学术项目,并且这两个项目也幸运的产出了两篇高质量的论文,分别发表在了不同领域的高水平会议当中。 其中,第一篇论文发表在第21届Cluster会议,与2019年在美国阿尔伯克基召开。Cluster 是高性能计算方向计算机系统领域的主要会议,这个工作提出并实现了统一高效的 RDMA 消息中间件,解决了 RDMA 在实际生产过程中的一些关键可靠性和可用性问题,例如:极简的接口抽象,必要的上层消息确认机制,中间件辅助流控配合 DCQCN,结合生产系统的诊断机制等等,目前该技术已经被广泛应用在阿里巴巴基础云产品中(包括:数据库,分布式存储等)。另外一个工作则发表在了第25届 ASPLOS会议。ASPLOS 是操作系统,体系结构和编程语言三个方向综合的计算机系统领域顶级会议。这篇论文是和我所在的清华高性能所合作完成的,文章中第一次提出了利用RDMA将数据中心的NVM做disaggregation, 实现了高效的框架,同时证明了这种新架构的可行性。 在阿里的感想 阿里巴巴操作系统团队是一直致力于建立和完善系统领域工业界和学术界的纽带,并且在持续实践工业界和学术界之间的问题分享和工作互动,他们希望通过这些分析和互动能够更好地促进中国在世界计算机系统领域的整体发展和创新。作为操作系统团队中的一员,我深切了解到了先进技术对于企业发展的重要性,在实习的过程中,同我所在的实验室进行合作,我更是深深感受到只有通过学术与工业相辅相成,才能够真正让企业发展先进技术。另外一方面,经过一段时间的实习,我对所在的操作系统团队和阿里技术部门的工作有了更深入的了解,我对自己也有了进一步的规划,计划在毕业之后能够入职阿里,通过我的努力,继续在追逐技术之路上奋斗着。 【亓家鑫-新加坡南洋理工大学- 阿里云实习心得】 非常荣幸我们的研究工作*《Two causal principles for improving visual dialog》*获得了同行的认可,并收录在CVPR 2020会议中。在此要特别感谢我的教授,MReaL实验室成员以及阿里城市大脑实验室师兄师姐一直以来的支持和帮助。比起论文本身的内容,我更希望跟大家分享一年来做研究的心得和感悟,虽然目前我仍然是一个萌新,不过我希望通过萌新的角度能带给大家一些研究上的启发。 开始一个研究之前,选择方向很重要。当然,每一个方向都有自己的优缺点,比如新的方向“容易”发文章,可能将其他领域原有的方法引入加一些调整就可以达到比较高的结果。不过如果没有坚实的创新,在同行评议时,可能会受到质疑。一旦没有通过,再转投时可能发现已经落后于其他人。“老“的方向可能会感觉灌水困难,不过因为我没有真正做过经典的方向,所以不太好发表评论。根据观察,在一堆全面而又坚实的研究中找到创新点,对萌新来说确实困难,不过一旦有所突破,肯定会对这个社区产生广泛的影响。作为一个萌新,可能不会自己选择方向或者领域,所以接受导师或者主管的安排成了唯一的选择,不过要相信自己的导师和主管,因为大家都是在帮助你,而且他们经验丰富。只有当自己走完一套研究的流程,并且真正找到自己感兴趣或者觉得可以有所突破的方向,那可能才是真正属于自己的研究的开始。 当选定了方向,开始做研究的时候,清楚的了解所有有关的方法是非常重要的,因为这样可以防止你的idea被存在的方法“抄袭“。其实对一个比较成熟的研究方向来说,简单思考得到的idea一般都会被提出过。不过研究完所有存在方法后,要跳出这些方法,因为阅读他们的方法可能不是来借鉴,更多的是防止撞车,想要真正有创新,在别人的方法上改动往往是不够的,这就要求我们重新审视这个任务甚至数据集的每一个样本。当然目前即使是学术界toy的数据集也有动辄几十万的数据量,看完是不可能的,不过根据自己的思路统计一些数据特征,有时候对研究会产生很大的帮助。当觉得自己已经掌握了这个数据集或者这个任务的时候,应该是跑一些baseline来练习了。 我作为萌新,没有从零开始写,而是找了一个现成的模型开始修改,这样难度会减少很多,不过毕竟是别人的代码,还是有很多不舒服的地方,所以等自己成熟了的时候,有空的时候,一定要从头写一遍。当然我也不知道什么时候有空。当我开始修改baseline的时候,此次的研究旅行就算是上路了,在接受导师的指引的同时也可以自己不断的尝试自己的想法,因为不知道什么是有用的。我作为萌新刚开始的感受是我觉得可能我想的都有用,那一定要去试一下,所以我也建议大家多试一下,说不定真的有用呢,反正电费不花自己的。当一个东西有用的时候,就可以来思考他为什么有用了,当你想好它为什么有用并且通过了广泛的测试,就到了跟大家分享成果的时候。 当然,一个有用的idea背后可能有无数个没用的idea,至于他们为什么没用,我觉得如果实在是有兴趣,可以研究一下,但是有时候会花大量的时间。举一个实际的例子,我在去年做visual dialog比赛,大概四月份就发现了一个有用的方法,之后也顺利的拿到了第一并且在此基础上进行探究和扩展发表了自己的成果。不过同时,当时有一个效果降低的操作一直困扰着我,直到六个月以后,当然这六个月中还做了其他的事情,我才发现了它真正的原因,并且最终变成了我文章中的一句话。举这个例子的目的是,研究没有效果的idea会对研究有所帮助,不过可能会收益较低。 研究成果的发表是一个很重要的过程,它可以给领域内的同行以启发,甚至可以影响本领域之外的人,所以有时候高度总结自己的思想是一件有用的事情。比如我所做的工作我认为进行高度总结之后可以得到一个启发是:对多模态任务来说不一定所有模态都是平等的,对模型来说所存在模态也不一定是影响结果的全部。除了对自己motivation的总结,应用细节以及结果展示也是非常重要的,因为我是萌新,怎样写出一篇文章的经验肯定是不足的,所以在此不再赘述。在发表完文章之后,“售后服务“也是非常重要的一点,这也是我的教授教我的很重要的理念。因为发表的内容不是刊登出来就结束了,而是你对社区贡献的开始,之后做研究可能会发现更好的实现,或者当时的理论没有讲清楚完善,这些都可以补充到自己的代码中,让大家更好的了解你的思路和工作,或许以后还能收获好评。 此外,实验室的成员就是自己研究道路上的引导者和伙伴,会对自己的研究产生各种各样至关重要的影响,大多时候大家都不会吝惜跟你讨论分享自己的观点,有时还会亲自帮助你解决问题,所以要记得经常参加团建和小集体聚会。不过也不能太依赖别人,每当遇到问题的时候,特别是技术性的问题,还是依靠自己解决的好,毕竟未来总会离开实验室,离开乐于帮助你的人。最后,保护好自己的头发,还是要早睡早起,调不出来的bug熬夜也调不出来,不work的idea可能真的不work,没有人保证炼出来的一定是金子,不要过分影响正常的作息,毕竟这不是百米赛跑,也不能算是马拉松,而是长久的起码好几年以上要坚持的事业。不过我作为萌新才刚刚起步,依然没有体会到最艰难的时刻,不过做好心理准备还是应该的,该来的总是会来的。最后的最后希望这些浅显的经验总结能够给大家带来一点儿帮助,谢谢大家的阅读。 【田冰川-南京大学- 在阿里网络团队实习两年是一种怎样的体验?】 简介: 大家好!我是田冰川,南京大学2016级直博生,导师为田臣老师,研究方向为计算机网络。2018年6月,我以研究型实习生的身份入职阿里巴巴基础设施事业部网络研究团队,实习期间主要从事网络验证相关的研究工作,即通过形式化方法与灰度测试,来降低网络变更中的潜在风险。 2018年既是网络研究团队刚刚组建的一年,也是研究型实习生在阿里刚刚起步的一年。这年春天,经我导师田臣老师介绍,我参加了研究型实习生面试,加入了网络研究团队。 来到团队后,我参加的第一个研究项目是“金睛”,用以保障复杂ACL变更的正确性。ACL即访问控制列表,网络中的ACL决定着流量的连通性。网络架构演化有时会伴随着对ACL的迁移,如何保证迁移前后网络连通性是等价的,是困扰架构与运营部门的一大难题,而金睛项目则是为该问题而生。项目落地以来,金睛系统多次在骨干网ACL迁移中对变更方案进行了验证,并逐渐扩展至对边缘网络的验证。相关论文发表于SIGCOMM 2019主会,我在会场进行了20余分钟的演讲,与我们团队的另一篇文章HPCC共同成为阿里集团在网络领域top1学术会议主会中的首次亮相。 时间总是过的很快。转眼间,我来阿里已经两年了,自金睛之后,又陆续参与了多个研究课题。在阿里的时间越久,就越能切身体会到学术界研究与工业界研究的不同。在阿里实习以来,我接触到的所有研究课题,都不是凭空“想”出来的空中楼阁,更不是靠别人论文“启发”出来的二手课题,而是源自于真实业务的现阶段瓶颈与下一阶段发展趋势——这一点是高校科研很难做到的。 这两年间,我对科研这件事的心态也发生了进一步的变化。2017年,来到阿里之前,我的论文达到了学校博士毕业的最低要求,相当于没有了毕业之忧,对科研的心态从“先拿到博士学位再说”,变成了“想要做出点什么,不想让自己的博士5年就这么水过去”;在来到阿里,接触到工业界的前沿课题之后,我对科研的心态再一次发生了转变,变成“因为认可一件事的价值,所以想要去做好”——这已经成为一种内在的驱动力,让我在认真工作的同时,享受研究带来的乐趣。 如果一切顺利的话,我将于2021年6月博士毕业。能在阿里巴巴度过专属实习生的“三年醇”,想必也是人生中的一大成就了! 【吴秉哲-北京大学- 吴师傅的博士研究课题:大数据时代的数据隐私研究方向初探】 加上本科的时间,不知不觉已经在燕园里面呆了八年了,明年不出意外应该就会离开学校去业界工作。准备最近以文章的形式梳理一下博士几年的研究以及生活的心路历程。由于内容比较分散,所以决定分为几个不同的部分。这次推送封面图片是16年骑行到加乌拉山口遥看喜马拉雅山脉的图片,而我在阿里的花名是风远,意为远处的风。希望多年之后,还有一颗少年的心,投入每天永不变。这次借着阿里内部一个活动的机会,写了今天的这篇稿子,为大家介绍一下我的thesis topic。 已经在蚂蚁实习了一年了,一年时光匆匆而过,而在蚂蚁金服度过的这段时光带给了我很多研究以及生活中的体验,这一年里学到的经验也将伴随着我之后的研究之路。 我本科四年是在数院度过,在研究生阶段决定转换方向到计算机系。博士的前两年一直在跌跌撞撞地寻找自己的研究方向,尝试过很多方向均以失败告终。终于在第三年的时候,误打误撞开始研究起机器学习的隐私保护问题并找到了很多灵感,开始沉淀了一些基本的研究工作。有一天我从一个朋友那里听到了她关于金服这边隐私保护机器学习的团队介绍,当时我就决定要到业界的前沿去看一看隐私保护的真实业界需求。在此之前,我已经在谷歌,IBM等公司有过多段实习的经历,但是在蚂蚁这一次实习经历,是与我自己研究方向最接近,也是时间最长的一次。借着这次约稿的机会,以此文简单总结一下自己过去两年在这一方向的研究。 隐私保护与共享学习 目前随着各种机器学习算法在集团的业务落地,许多隐私泄露与数据滥用的风险相继而来。 尤其是在蚂蚁金服这样一个拥有很多支付数据的企业,数据安全以及隐私保护的重要性更是不言而喻。站在商业合作的角度,如何实现不同公司或者部门之间的数据共享学习也是我所在的团队现在攻坚的一个问题。在这样一个研究背景下,我来到了蚂蚁金服的共享智能团队,开始和师兄师姐们从不同的维度对上述问题展开了深入的研究。 共享学习这样一个概念听起来很美好,但是实际落地起来却困难重重,需要考虑到上层软件算法的设计以及底层系统和硬件的优化,才有可能真正在实际的业务中兼顾效率和隐私保护强度。共享智能团队在这一方向上有着得天独厚的优势。一是领先的业务场景,在国际同行好多还停留在学术研究阶段时,我们团队已经和国内多家银行有了合作。另一个则是技术沉淀的领先。因为金服自身业务的特殊性,我们团队很早就开始了隐私保护机器学习和共享学习的布局,包括很多原始的技术沉淀,强大的工程团队以及学术预研团队。这些积累也使得我们能够很快地摸清最新的一些研究成果并能将其吸入到我们自己的系统当中。 我自己关于隐私保护机器学习的研究主要是围绕着三个层面展开,分别是理论,算法设计,以及系统和硬件优化。在理论层面,我主要针对现有的各种机器学习算法,建立相应的隐私泄露分析框架,比如我们在之前的工作中,针对一种常用的贝叶斯学习的算法根据雷尼差分隐私建立了隐私泄露的定量分析框架,我们进一步使用我们的框架和已有的一些泛化误差上界做了联系,从而能从多个角度去解释该算法的隐私泄露原因。在算法设计层面,我们针对各种已有的新兴算法以及场景,比如图神经网络,推荐系统建立了相应的共享学习算法,并利用我们的理论框架,对这些算法的隐私保护强度做了定量的评估。除开上层的理论和算法设计,底层的系统和硬件的优化同样是非常重要的一环。 在我们团队,我们主打基于硬件可信执行环境 (TEE)的机器学习serving系统,我针对我们当前这套服务系统,结合神经网络计算的一些特点,定制了该系统的一系列优化措施大大提升了整个系统的吞吐量。我也将其中一些措施注册了专利,并在前几天得到了内部的专利授权。除开上述介绍的学术研究方面的成果,我也参与了IEEE共享学习标准的制定会议,这也使得我从标准制定者的角度去更深地思考如何使用技术在未来社会中实现隐私与效率的兼顾。 总之,我自己很感谢能成为共享智能团队的一员,我在这里学到的最宝贵的经验就是详细地从上到下了解了这样一个大团队的合作与分工,学习他们是如何一步步从最初的需求分析,算法设计,到最后真正的业务落地。也很高兴和各位共享智能的同事度过自己博士生涯中很重要的一年。也非常感谢我的博士导师对我研究的无条件支持。回看博士这一路的艰辛,也是感慨万千。有点像自己之前高原骑行的经历,经历了爬到坡顶的缺氧与无力,终在转角处遇见了骑行途中最美的雪山风光。

游客bnlxddh3fwntw 2020-05-19 16:05:51 0 浏览量 回答数 0

回答

一、NGINX 502错误排查 NGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多。将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手: 1.FastCGI进程是否已经启动 2.FastCGI worker进程数是否不够 运行 netstat -anpo | grep “php-cgi” | wc -l 判断是否接近FastCGI进程,接近配置文件中设置的数值,表明worker进程数设置太少 3.FastCGI执行时间过长 根据实际情况调高以下参数值 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; 4.FastCGI Buffer不够 nginx和apache一样,有前端缓冲限制,可以调整缓冲参数 fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; 5.Proxy Buffer不够 如果你用了Proxying,调整 proxy_buffer_size   16k; proxy_buffers    4 16k; 参见:http://www.server110.com 6.https转发配置错误 正确的配置方法 server_name www.mydomain.com; location /myproj/repos { set $fixed_destination $http_destination; if ( $http_destination ~* ^https(.*)$ ) { set $fixed_destination http$1; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Destination $fixed_destination; proxy_pass http://subversion_hosts; } 当然,还要看你后端用的是哪种类型的FastCGI,我用过的有php-fpm,流量约为单台机器40万PV(动态页面), 现在基本上没有碰到502。 7.php脚本执行时间过长 将php-fpm.conf的<value name="request_terminate_timeout">0s</value>的0s改成一个时间 二、Nginx 413错误的排查:修改上传文件大小限制 在上传时nginx返回了413错误,查看log文件,显示的错误信息是:”413 Request Entity Too Large”, 于是在网上找了下“nginx 413错误”发现需要做以下设置: 在nginx.conf增加 client_max_body_size的相关设置, 这个值默认是1m,可以增加到8m以增加提高文件大小限制; 如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。 post_max_size = 8M upload_max_filesize = 2M 三、Nginx 400错误排查:HTTP头/Cookie过大 今天有人汇报nginx的HTTP400错误,而且这个HTTP400错误并不是每次都会出现的,查了一下发现nginx400错误是由于request header过大,通常是由于cookie中写入了较长的字符串所引起的。 解决方法是不要在cookie里记录过多数据,如果实在需要的话可以考虑调整在nginx.conf中的client_header_buffer_size(默认1k) 若cookie太大,可能还需要调整large_client_header_buffers(默认4k),该参数说明如下: 请求行如果超过buffer,就会报HTTP 414错误(URI Too Long) nginx接受最长的HTTP头部大小必须比其中一个buffer大,否则就会报400的HTTP错误(Bad Request)。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。 Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。 解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。 而正确的设置需要考虑服务器自身的性能和访客的数量等多重因素。 以我目前的服务器为例子CPU是奔四1.5G的,内存1GB,CENTOS的系统,访客大概是50人左右同时在线。 但是在线的人大都需要请求PHP-CGI进行大量的信息处理,因此我将nginx.conf设置为: fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; fastcgi_buffer_size 128k; fastcgi_buffers 8 128k;#8 128 fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; 这里最主要的设置是前三条,即 fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; 这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。 下面我们来仔细分析一下php-fpm.conf几个重要的参数: php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout” 我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。 计算的方式如下: 如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。 而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// nginx中配置php fastcgi组解决莫名其妙的502 Bad Gateway错误 一般nginx搭配php都采用这样的方式: location ~ .php$ { proxy_pass        http://localhost:9000; fastcgi_param   SCRIPT_FILENAME   /data/_hongdou$fastcgi_script_name; include        fastcgi_params; } 这个方式只能连接到一组spawn-fcgi开启的fastcgi,在服务器负载稍高时常常出现502 bad gateway错误。 起先怀疑这是php-cgi的进程开得太少,增加后仍然有反映时常有错,偶然间发现php-cgi会报出这样的错误: zend_mm_heap corrupted 看来是php-cgi在执行某些代码时有问题,以致于该线程中止。 在服务器上可能还会看到php-cgi进程在不断变少,估计是出现错误的php-cgi的进程自动退出了。 php的问题总是不太容易能解决,所以在nginx方面想想办法,nginx的好处是它总是能爆出一些稀奇古怪的做法出来。 在nginx的proxy中,规避莫名其妙错误的办法无非是proxy到一个upstream的服务器组中,然后配置 proxy_next_upstream,让nginx遇到某种错误码时,自动跳到下一个后端上。这样,应用服务器即使不稳定,但是在nginx后面就变成了稳定服务。想到nginx的fastcgi和proxy是一路东西,所以proxy能用的经验,移植到fastcgi也能跑得起来。 照着这个思路,用spawn-fcgi多开同样一组php进程,所不同的仅仅是端口: spawn-fcgi -a 127.0.0.1 -p 9000 -u nobody -f php-cgi -C 100 spawn-fcgi -a 127.0.0.1 -p 9001 -u nobody -f php-cgi -C 100 然后把fastcgi的这段配置改成用upstream的方式: upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; } location ~ .php$ { fastcgi_pass        backend; fastcgi_param   SCRIPT_FILENAME   /data/_hongdou$fastcgi_script_name; include        fastcgi_params; } 检查配置结果正确,能跑起来;同时在服务器上netstat -n|grep 9000和grep 9001都有记录,证明连接无误;在前台查阅页面,一切运行正常。 这个配置是最简单的配置,既然能连接上upstream,那么很显然upstream的一些东西都可以拿来用,比如ip_hash、weight、max_fails等。 这样的配置在单机下不知能不能共享session,没有测试,如果有问题,可以加上ip_hash,或者配置php把session存进memcached中。 然后就是fastcgi_next_upstream的配置,nginx wiki中没有介绍到这个配置,查了一下,在nginx的CHANGES中有提到,而且出生年月是和proxy_next_upstream一样的。既然如此,那就照proxy_next_upstream一样配吧。一般按默认的值error timeout就可以工作,因为php出现502错误的异常是返回的500错误,所以我把fastcgi_next_upstream定为: fastcgi_next_upstream error timeout invalid_header http_500; 通过这个配置,就可以基本杜绝任何时常性的500错误,出问题的几率会变小很多,如果客户反映仍然激烈,那么就多增加几组fastcgi进程。

sosyxg 2019-12-02 02:43:07 0 浏览量 回答数 0

问题

敏捷软件测试常见的七个误区

技术小菜鸟 2019-12-01 21:47:08 3794 浏览量 回答数 2

问题

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

xiaofanqie 2019-12-01 21:24:21 74007 浏览量 回答数 38

回答

首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。######+1,网页不能允许你修改客户本地内容,得到数据然后后台根据这些数据再去读写服务器上的内容######我可以用js操作vba修改我本地的office文档,这是怎么回事######意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?######回复 @業餘碼農 : 映射可能不准确,应该是理解成副本要好点。######回复 @業餘碼農 : 这两天脑壳想了很多。个人理解成,每个用户在处理php等的时候是获取其文档里面的一个映射,然后再处理。你说的fclose,我理解成很多用户在一个服务器里面映射了很多php文档,如果不关闭,每个映射在处理过程中都占用一定内存,但是~!~,如果没个用户使用映射的时间不一样,那么对于fclose就可有可无,因为反正用户使用映射完了传送数据给用户了,打开的文档就自动关闭,是把?######回复 @kog-7 : 而unset,不一定是用来销毁数组的。 也可以用来销毁数组元素的。比如unset( $arr['a'] ); 这样就是纯粹的数组函数了。 关于PHP事件,不知道可不可以这样称呼, PHP只有一种事件,就是请求事件,就是说只有客户端请求它才会响应并执行。 当然如果你在服务器设置了计划任务那就另当别论了。 以上都是我的个人观点。经验之谈。 不一定正确。######回复 @kog-7 : fclose你可能现在看不出作用。 但是大项目的时候,资源优化要做的很全面的。 一个用户读一个文件是1M,1000个用户同时读就是1G,并且占用1000个I/O资源,用完就手动fclose,而不是等到程序结束,这样就能在同一时刻减少I/O占用率( 有时你看到fclose靠近文件末尾,但那里有时并不代表程序结束。特别是面向对象程序设计 )。######回复 @業餘碼農 : 就是点击,或者某个状态生成了激活某处功能。###### 引用来自“kog-7”的答案 我可以用js操作vba修改我本地的office文档,这是怎么回事 百度了一下 : Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。 关键是你能修改别的文档吗? ###### 引用来自“kog-7”的答案 意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?  。。呃,关键不在于内存的占用。 而在于I/O的占用。 内存很便宜,但是I/O资源有限,你要知道像百度谷歌这样的大网站,每秒钟都会有几千上万的用户在同时操作。而且一个请求不是一秒就可以完成的。 虽说现在有什么负载均衡的技术,不过算下来,每时段的用户请求也不是小数目 。fclose要养成习惯。数据库也是一样。 遇到大项目就不易出问题。 你说的映射,或者副本,应该可以理解成C语言里的指针。 你可以想象一下,如果某个用户上传了一个100G的文件,如果要删除这个文件,是不是要把它载入内存? 我想不可能吧。  读取也是一样, 通过指针去读取数据流而已。 而不用把整个文件放入内存。 并且单个用户的内存占用是有限制的。所以fclose是省I/O。 ######如果没经过内存的,再要引用他,就要指定相关已被传输的文档,然后找起!!!是不? (限制字数,我分开回答)######同时我理解的js和html也如此,也是向文档请求,然后文档把其代码复制张贴到内存。。。这样子我觉得要容易理解一些,也很容易解释为什么你操作的js是不会反应到本来的js文档中的。。。。同时对于跨内容的传递,比如你说的100g的文档,我理解的是,让这个100g移动的命令是在内存中的,但是命令只是要求其从a文档移动到b文档,不经过内存。。。同时,如果有那种要经过内存的数据,就可以直接引用其值######我说的副本,理解是,比如服务器上有个PHP文档,我在浏览器请求这个php,那么这个php就把其代码复制张贴到内存中运行(所以这个副本跟前面的php就没有关系了),然后内存的代码运行得出一些数据。。######呵呵,不知道I/O是什么东西,都是自学的,这些没看到,读书的时候工科,所以c什么指针的不重要都在睡觉。######  所谓I/O就是输入输出。通俗说,就是硬盘的数据通道。你fopen一次,就占用一个通道(直到程序执行结束或fclose)。硬盘的I/O发展远没有容量发展的快。 所以硬盘容量可以十几个TB但是I/O还是差不多。  你说的副本这个原理,我也说不清楚,我也是自学的。 C语言也只是了解了一下而已。 不论PHP JS HTML都是载入内存来执行的。 但是会不会一个用户载入一个PHP我就不敢肯定了。 不过有一点可以肯定, 你在服务器修改程序,新的请求会得到新的程序执行的结果 。 而不需要重启PHP服务,这应该能证明你说的副本吧。 然后html不算编程语言,是标记语言,你不能说一个html文件是一个程序吧,程序的结果是可变的,纯html 是固定的。js不能操作文档不是因为它被载入内存。 PHP也被载入内存的,任何程序都要载入内存去执行。 关键在于js寄存的浏览器,没有给js操作权限。 js被包裹起来了。 只能通过浏览器去操作cookie之类的有严格限定的文件。 而php的解释器是拥有文件操作权限的。 当然只是有服务器的文件操作权限。 客户端的东西是不能操作的。 至少光凭它自己是不能的。 同样的,js也是不能操作服务器上的东西的。 就算是读取服务器的文件,也是要经过apache之类 的服务器软件来读取的。 js本身只是给服务器发个话。 服务器给不给返回,还是看服务器心情的。 很多东西个人理解会有偏差,我建议你有不理解的地方就查查文档。 比我这种业余的码农更权威。 ######还有就是不管i/O和内存,都是开始说的一个用户占用部分的东西,如果多个用户不是同时解析,那么,,就可以说成是fclose这个可以不写,当然写了最好######额,问下,你什么行业啊,以前学什么专业。。? 专业的书籍我看了一些,但是一两本书说的很少,同时国内的书确实不好,国外的书翻译的又老火。###### 我就是一个业余的爱好者而已。没学过什么专业,也不在什么行业。 纯兴趣。 当然以后就难说了。 老实说,我是最近一年才学的编程。 但是计算基础方面的东西积累了很多年,也有一定的了解了。 你叫我买书来看我真看不下去。 我的方法是,先看视频。 对一门语言有大概了解,然后把文档上的每一条都拿 来琢磨透,然后开发小项目。 当然我也没能吞下文档。 所以才成为业余的。 另外上面这个问题 如果多个用户不是同时请求或者用户很少,自然不需要fclose了。 不过也有可能程序结束没有关闭I/O连接导致进程关闭失败造成僵尸进程, 浪费了资源。也难说的。 ######呵呵,你让我想起了有,不要问我从哪里来,我不也不知道去哪里,我不属于任何地方,未来一切皆有可能的某部电影~~~~###### @kog-7 这是褒奖吗。。。。 ######回复 @Infinity : 改xml的php,写在上面,感觉用了很多重复的话######回复 @業餘碼農 : 那好多人都去提鞋了~我只是好奇好奇,你要是提鞋的,我就是给别人檫菊花的~!~######。。。。要是有个人对自己的身份工作支支吾吾遮遮掩掩,要么他是个特工黑客要么他就是个提鞋的。你觉得我像不像特工呢?######回复 @業餘碼農 : 呵呵,搞那么多标签干嘛嘛,你就是你,我只想了解你是干嘛的。######回复 @kog-7 : 。。。。。。。。。。。。农二代工一代码后代。######就是这个改xml,感觉写多了<?php header("Content-type: text/html; charset=utf-8"); print '<style> body{ background:rgba(223,238,231,0.9); } .error{color:rgb(182,69,69);font-size:60%;} .iput { border:1px solid black;      height:10%; background:rgb(223,238,231); font-family:"Microsoft YaHei",微软雅黑,helvetica; } #word0u { margin-left:2%; float:left; margin-top:5%; font-family:"Microsoft YaHei",微软雅黑,helvetica; } #input0u { list-style-type:none; float:left; margin-top:5%; } </style>'; print "<script> function closef() {window.parent.document.getElementById('screen').style.display='none';} </script>"; print '<body><button  style="cursor:pointer;border:1px;right:0px;top:0px;font-family:arial;font-weight:bolder;position:absolute" onclick="closef()">X</button>  '; $pro=true; if($_SERVER['REQUEST_METHOD']=="POST") { $pro=false;    if(empty($_POST['user'])||empty($_POST['pw'])||empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','请输入用户名和密码').' </span>';}    if(strlen($_POST['user'])>15)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','用户名要小于5位数').' </span>';}    if(strlen($_POST['pw'])<5)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','密码要大于5位数').' </span>';}    if(empty($_POST['pw'])!=empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','两次密码输入不一样').' </span>';}  $xmluser=new DOMDocument;  $xmluser->load('euser.xml');  $users=$xmluser->getElementsByTagName('user'); for($i=0;$i<$users->length;$i++) { if($users->item($i)->childNodes->item(0)->nodeValue==$_POST['user']) { $pro=true; print '<p class="error">'.iconv('gb2312','utf-8','有人用了这个用户名').'</p>';; break; } } } if(!$pro) { date_default_timezone_set('Asia/Shanghai');  $log= $xmluser->createElement('log');  $user= $xmluser->createElement('user');  $pw= $xmluser->createElement('pw');  $time=$xmluser->createElement('time'); $usert=$xmluser->createTextNode($_POST['user']); $pwt=$xmluser->createTextNode($_POST['pw']); $da=date("Y-m-d"); $timet=$xmluser->createTextNode($da); $user->appendChild($usert); $pw->appendChild($pwt); $time->appendChild($timet); $log->appendChild($user); $log->appendChild($pw); $log->appendChild($time); $xmluser->documentElement->appendChild($log); $xmluser->save('euser.xml'); print "<h2 style='font-family:微软雅黑,helvetica'>".iconv('gb2312','utf-8','欢迎').$_POST['user']." ".$da." ".iconv('gb2312','utf-8','您已注册')."</h2>"; $uu=$_POST['user']; $pp=$_POST['pw']; print "<script> window.parent.document.getElementById('user').innerHTML='hello<br>$uu'; window.parent.document.getElementById('login').style.display='none'; window.parent.document.getElementById('logon').style.display='none'; window.parent.document.getElementById('cookss').style.display='none'; window.parent.document.getElementById('clears').style.display='inherit'; window.parent.document.getElementById('chat').src='example1.html'; document.cookie='koguser=$uu'; </script></body>"; } else { print "<p style='font-family:arial;font-weight:bold;font-size:150%;letter-spacing:5px;margin-left:auto;margin-right:auto;width:70%;height:10%;text-align:center;margin-top:2%'>welcome</p>"; $_POST=array(); print  "<form action='elog.php' method='post'><ul id='word0u'><li>".iconv('gb2312','utf-8','用户名')."</li><br><li>" .iconv('gb2312','utf-8','密码')."</li><br><li>" .iconv('gb2312','utf-8','再次确认密码')."</li></ul> <ul id='input0u'><li><input class='iput' type='text' name='user' size='20'/></li><br> <li><input class='iput' type='password' name='pw' size='20'/></li><br> <li><input class='iput' type='password' name='pw2' size='20'/></li></ul><div><input style='border:2px solid black;clear:left;font-family:helvetica;background:rgb(223,238,231);margin-left:42%;margin-top:3%;font-size:18px;width:100px;text-align:center' type='submit' value=".iconv('gb2312','utf-8','注册')."></div></form></body>"; } ?> ###### 引用来自“Infinity”的评论首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。 谢谢~

kun坤 2020-06-05 14:27:36 0 浏览量 回答数 0

回答

1、拼多多被黑产薅羊毛事件 提名理由: 2019 年 1 月 20 日,微博爆料称拼多多出现重大 Bug:从网友晒出的图片看,此次 100 元无门槛券随便领,全场通用(特殊商品除外),有效期一年。有网友表示,凌晨 3 点多被同行“喊醒”,让来拼多多“薅羊毛”,“只需支付 4 毛钱,就可以充值 100 元话费”。 拼多多回应表示:有黑灰产团伙通过一个过期的优惠券漏洞盗取数千万元平台优惠券,进行不正当牟利。针对此行为,平台已第一时间修复漏洞,并正对涉事订单进行溯源追踪。同时我们已向公安机关报案,并将积极配合相关部门对涉事黑灰产团伙予以打击。 **翻车点评:**本次事件除了反映出拼多多在研发流程上的管控问题,也侧写出了中国企业的公关之难:在拼多多公关看来,此次被薅羊毛 200 亿的谣言是有心人在造谣抹黑;在旁观者看来,此次 200 亿谣言是拼多多的营销手段。一场罗生门背后,除了要敬畏每一行代码,还要敬畏每一位用户才是。 翻车等级:★★★☆☆ 2、苹果误发 7 倍工资给开发者,随后追回 提名理由: 2019 年 9 月 4 日,一位名为 @waylybaye 的 IOS 开发者在社交平台上爆料:“苹果搞了个大事故!!给国内开发者打上上个月的钱的时候,把单位是人民币的钱当成美元打过来了!所有开发者的收入都翻了 7 倍!现在这笔 7 倍的外汇已经到账可以申报了,但我不敢动……请问这种情况怎么搞?” 9 月 5 日,苹果官方发出邮件回应结算出错。在邮件中,苹果公司称,由于合作银行德意志银行方的问题,影响了开发者 2019 年 7 月的收入。希望开发者能够配合银行退回错误的金额,另外再汇一笔正确的金额。 该开发者表示将配合苹果公司退回款项,律师表示如果主张返还的行为给中国开发者带来很大的不便,甚至造成一些损失并有证据证明,那么中国开发者可以向苹果公司主张赔偿损失。 **翻车点评:**如果是越南开发者,收入岂不是翻了 2 万多倍?如果是津巴布韦开发者,岂不是要上天? **翻车等级:**★★★☆☆ 3、李世石击败围棋 AI:怀疑电脑质量有问题 提名理由: 李世石是当今世界唯一一位曾经打败 AI 围棋程序 AlphaGo 的人类棋手,他在 2019 年宣布了正式退役。这位棋手表示:在 AI 出现之后,他意识到即使通过疯狂的努力再次成为排名第一的棋手,他也无法真正一览众山小,因为有一个实体你无法击败它。 此次退役赛,李世石选择了对战 NHN Entertainment 开发的 AI 围棋程序 HanDol,这名 AI 棋手已经打败了韩国排名前五的棋手。2019 年 12 月 18 日,退役赛首战,李世石被让两子,做好了首战告负心理准备的李世石却意外取胜,原因在于 AI 程序在对弈中出现了一个低级失误,被李世石抓住机会一举奠定胜局。赢棋后的李世石并没有表现出过多的兴奋,他甚至怀疑是这台电脑的质量没有达到应有的水平。 **翻车点评:**AI、大数据、云计算的三位一体 ABC 战略,将给未来的世界带来怎样的颠覆?也许再过几年,你看到的金翻车奖就是 AI 评选的了。 翻车等级:★★★☆☆ 4、程序员用 Null 做车牌,命中车管所漏洞吃下所有无主罚单 提名理由: Joseph Tartaro 是一位美国软件安全领域的专家,2016 年年底,Tartaro 决定要注册一块有个性的车牌。作为一名软件安全方面的专家,他有着许多技术人独有的职业癖好:希望车牌号能够与工作联系在一起。“我可以给我老婆注册一块 VOID 车牌,这样我们的车道就变成了 NULL 和 VOID 了”。 当然,这里面是有其深层含义的。Tartaro 在最近的一次 Defcon 黑客大会上说,“null”在很多编程语言中是一个文本字符串,用来表示空值或未定义的值。在很多计算机中,null 就是 void。也就是说,他跟她老婆其实是二位一体的存在,公不离婆秤不离砣,颇有点程序员式的浪漫。但很快,这个车牌就让他浪不起来了,因为 Null 命中了车管所系统漏洞,他为此收到了所有的无名罚单,总额超过 1.2 万美元。他后来坦言,初衷其实只是为了使用 Null 车牌来逃避罚单,万万没想到无名罚单却成了自己的。 延展阅读:使用 Null 做自定义车牌,成功命中车管所系统漏洞,所有未填车牌的罚单都是我的了 **翻车点评:**我在看房的时候是坚决不看 404 号门牌的,这哥们却主动给自己报空指针,果然跟那些妖艳贱货有些不同。 **翻车等级:**★★★☆☆ 5、游戏公司主程锁死服务器事件 提名理由: 2019 年 1 月 21 日,一封《告游戏行业全体同仁书》将一家创业公司 C++ 主程燕某推向舆论高潮,这篇文章指责燕某在就职深圳螃蟹网络科技有限公司 3 个月期间,出于报复心理,于游戏上线测试当天无故失踪并锁死电脑和服务器,最终导致公司开发两年的项目失败,损失惨重,创始人尹某背上百万债务开始打工之路。 1 月 24 日,燕某发表长文针对深圳市螃蟹网络科技有限公司创始人尹某的《告游戏行业全体同仁书》中提及的各项指责以及网络传言一一反驳,并表示一切法庭上见,相信法律会还一个公道。 **翻车点评:**2019 年让吃瓜群众真正学到了新闻等等再看,本次事件是典型的反转案例,从《告游戏行业全体同仁书》发布后的”程序员是如何逼死一家公司“的舆论,到后来的风向大反转,深刻地揭示了:瓜,要慢慢吃。脸,要慢慢打。 **翻车等级:**★★★★☆ 6、李彦宏被泼水 提名理由: 2019 年 7 月 3 日,百度 AI 开发者大会于北京国家会议中心举行。百度创始人、董事长兼任 CEO 李彦宏首先发表演讲。而在他正在演示 AI 自主泊车“最后一公里”时,有持矿泉水瓶的男青年冲上台,将水浇在李彦宏头上。李彦宏的白衬衫几乎湿透,他愣了一下后说:“What‘s your problem?” 随后泼水者被工作人员控制,李彦宏在掌声鼓励中说道:“大家看到在 AI 前进的道路上还是会有各种各样想不到的事情会发生。但是我们前行的决心不会改变,我们坚信 AI 会改变每一个人的生活。” **翻车点评:**在技术发展的历史上,总会出现风口过热的情况,无论是 AI 还是区块链,都存在被吹过头的现象,我们愿意看到有清醒的人为这些过热的技术降降温,但却绝对不认可目前这种方式。 翻车等级:★★★★☆ 7、62 岁程序员骚操作,翻车获刑 **提名理由: ** 现年 62 岁的大卫·廷利 (David Tinley) 来自匹兹堡附近的哈里森市,廷利为西门子在 Monroeville 的办事处工作了将近 10 年的时间,他曾接过一个为西门子公司创建管理订单的电子表格需求,电子表格包含自定义脚本,可以根据存储在其他远程文档中的当前订单更新文件的内容,从而允许公司自动化库存和订单管理。 廷利十年前在给西门子写的电子表格中植入了逻辑炸弹,它会在特定日期之后导致电子表格崩溃,于是西门子就必须再次雇佣他进行修复,每次都需要重新支付修复费用,持续时间近 3 年。最近他被抓包了,面临最高十年监禁和 25 万美元(约合人民币 172 万)的指控。 **翻车点评:**西门子居然没有人 review 代码,廷利居然忘了自己挖的坑的发作时间,60 多岁还没退休,资本主义果然罪恶,emmm… 翻车等级:★★★★☆ 8、FBI 网站被黑,数千特工信息泄露 提名理由: 在传统的好莱坞大片里,FBI 通常都是神通广大,无所不能,个个有着汤姆斯克鲁斯的脸,施瓦辛格的体格,既有拳脚功夫了得的特工,也有技术实力超群的 Nerd。从来只有他们攻破某某国家防火墙的份,但现实告诉我们,这真的只是在拍戏。 2019 年 4 月,包括 TechCrunch 等多家媒体报导,一个黑客组织黑了美国联邦调查局 FBI 的附属网站,并泄露了数千名联邦特工和执法人员的个人信息。黑客攻击了与 FBI 培训学院 National Academy Association 相关的三个网站,利用其中存在的漏洞,下载了每个服务器上的内容。随后黑客将数据发布到他们自己的网站上,并提供下载。电子表格在删除重复数据后包含大约 4 000 条独特记录,包括 FBI 特工与其它执法人员的姓名、个人和政府电子邮件地址、职位、电话号码和邮政地址等信息。 **翻车点评:**有道是终日打雁,却被雁啄了眼睛。但对我们这一代看着 FBI Warning 长大的孩子来说,FBI 它算个球。 翻车等级:★★★★☆ 9、IT 圈的暴力裁员事件 提名理由: 2018 年的春天,堪称近年来最暖的春天。彼时人工智能领域风起云涌,AI 创业公司们纷纷高薪疯抢 AI 开发者,月薪动辄 10 万级别。人工智能的流行还未结束,一个名叫区块链的技术突然又火爆了起来,一时间,“凡人饮水处,皆言区块链”。那是程序员们最甜蜜的一段时间。 这一年的上半年,互联网公司们扎堆上市,蔚为壮观:哔哩哔哩、爱奇艺、美团、小米、拼多多、趣头条……上市后的互联网新兴巨头、独角兽公司为了攻城略地,开启了全面的整军备战:唯有技术、开发者,才是未来的决定因素,这是技术最好的时代。许多人都如此笃信。 一年后的 2019,一切变了:保安赶走身患绝症员工、统计时长裁员、251、1024 等事件频繁映入眼帘,从最开始的愤怒到最后来的无助,我们感同身受。当企业紧缩银根,高薪资的开发们就成了裁员者的 KPI 了。 **翻车点评:**2019 也许是过去十年最坏的一年,也可能是未来十年最好的一年。如果真到万不得已,我们只求一场好聚好散。PS:小编我买了一支录音笔。 **翻车等级:**★★★★★ 10、波音 737 Max 客机软件故障坠机事件 提名理由: 2019 年 3 月 10 日,埃塞俄比亚航空公司一架波音 737 MAX 8 客机在飞往肯尼亚途中坠毁。机上有 149 名乘客和 8 名机组成员,无人生还。据报道,此次失事的是一架全新的波音飞机,四个月前才交付给该航空公司。这是波音 737 MAX 8 半年内出现的第二起严重事故。(第一起为 2018 年 10 月 29 日印尼狮航的坠落事件,189 人罹难) 两次空难的影响因素都有该机型配置的自动控制下压机头的系统,其设计初衷是,如果机身上的传感器检测到高速失速的情况,即使在没有飞行员输入信号的情况下,该系统将强制将飞机的机头向下推。但在狮航空难事件中,该系统接收到了错误数据,导致飞机在正常情况下开始不断下压机头,飞行员在 11 分钟内连续手动拉升 20 余次终告失败,坠海罹难。 这次事故引发了技术圈的广泛讨论,这种由软件带来的自动化能力,究竟是好是坏? **点评:**两起空难总计 346 条人命面前,我们不愿也不敢戏谑。通过对波音公司的陆续调查发现,该公司为了节省成本,裁员了大量资深开发,代之以时薪 9 美元的印度外包,这家数字化转型的“代表企业”看起来光鲜亮丽,但也有阳光下的阴暗背面。 **等级:**★★★★★ 其他候选事件 韩企被爆用免费饮料换 GitHub 上的 star Twitter CEO 杰克·多西的推特账号被黑 特斯拉 App 突然瘫痪,大批车主没法上车 太空作案,NASA 女航天员在太空盗窃前任银行账户 中国人霸榜 GitHub Trending 引发国外开发者不满 你心目中,今年的翻车新闻之首是谁呢?

游客pklijor6gytpx 2020-01-02 10:26:08 0 浏览量 回答数 0

回答

"首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。######+1,网页不能允许你修改客户本地内容,得到数据然后后台根据这些数据再去读写服务器上的内容######我可以用js操作vba修改我本地的office文档,这是怎么回事######意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 映射可能不准确,应该是理解成副本要好点。######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 这两天脑壳想了很多。个人理解成,每个用户在处理php等的时候是获取其文档里面的一个映射,然后再处理。你说的fclose,我理解成很多用户在一个服务器里面映射了很多php文档,如果不关闭,每个映射在处理过程中都占用一定内存,但是~!~,如果没个用户使用映射的时间不一样,那么对于fclose就可有可无,因为反正用户使用映射完了传送数据给用户了,打开的文档就自动关闭,是把?######回复 <a href=""http://my.oschina.net/kog7"" class=""referer"" target=""_blank"">@kog-7 : 而unset,不一定是用来销毁数组的。 也可以用来销毁数组元素的。比如unset( $arr['a'] ); 这样就是纯粹的数组函数了。 关于PHP事件,不知道可不可以这样称呼, PHP只有一种事件,就是请求事件,就是说只有客户端请求它才会响应并执行。 当然如果你在服务器设置了计划任务那就另当别论了。 以上都是我的个人观点。经验之谈。 不一定正确。######回复 <a href=""http://my.oschina.net/kog7"" class=""referer"" target=""_blank"">@kog-7 : fclose你可能现在看不出作用。 但是大项目的时候,资源优化要做的很全面的。 一个用户读一个文件是1M,1000个用户同时读就是1G,并且占用1000个I/O资源,用完就手动fclose,而不是等到程序结束,这样就能在同一时刻减少I/O占用率( 有时你看到fclose靠近文件末尾,但那里有时并不代表程序结束。特别是面向对象程序设计 )。######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 就是点击,或者某个状态生成了激活某处功能。######<div class=""ref""> 引用来自“kog-7”的答案 我可以用js操作vba修改我本地的office文档,这是怎么回事 百度了一下 : Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。 关键是你能修改别的文档吗? ###### 引用来自“kog-7”的答案 意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?  。。呃,关键不在于内存的占用。 而在于I/O的占用。 内存很便宜,但是I/O资源有限,你要知道像百度谷歌这样的大网站,每秒钟都会有几千上万的用户在同时操作。而且一个请求不是一秒就可以完成的。 虽说现在有什么负载均衡的技术,不过算下来,每时段的用户请求也不是小数目 。fclose要养成习惯。数据库也是一样。 遇到大项目就不易出问题。 你说的映射,或者副本,应该可以理解成C语言里的指针。 你可以想象一下,如果某个用户上传了一个100G的文件,如果要删除这个文件,是不是要把它载入内存? 我想不可能吧。  读取也是一样, 通过指针去读取数据流而已。 而不用把整个文件放入内存。 并且单个用户的内存占用是有限制的。所以fclose是省I/O。 ######如果没经过内存的,再要引用他,就要指定相关已被传输的文档,然后找起!!!是不? (限制字数,我分开回答)######同时我理解的js和html也如此,也是向文档请求,然后文档把其代码复制张贴到内存。。。这样子我觉得要容易理解一些,也很容易解释为什么你操作的js是不会反应到本来的js文档中的。。。。同时对于跨内容的传递,比如你说的100g的文档,我理解的是,让这个100g移动的命令是在内存中的,但是命令只是要求其从a文档移动到b文档,不经过内存。。。同时,如果有那种要经过内存的数据,就可以直接引用其值######我说的副本,理解是,比如服务器上有个PHP文档,我在浏览器请求这个php,那么这个php就把其代码复制张贴到内存中运行(所以这个副本跟前面的php就没有关系了),然后内存的代码运行得出一些数据。。######呵呵,不知道I/O是什么东西,都是自学的,这些没看到,读书的时候工科,所以c什么指针的不重要都在睡觉。######  所谓I/O就是输入输出。通俗说,就是硬盘的数据通道。你fopen一次,就占用一个通道(直到程序执行结束或fclose)。硬盘的I/O发展远没有容量发展的快。 所以硬盘容量可以十几个TB但是I/O还是差不多。  你说的副本这个原理,我也说不清楚,我也是自学的。 C语言也只是了解了一下而已。 不论PHP JS HTML都是载入内存来执行的。 但是会不会一个用户载入一个PHP我就不敢肯定了。 不过有一点可以肯定, 你在服务器修改程序,新的请求会得到新的程序执行的结果 。 而不需要重启PHP服务,这应该能证明你说的副本吧。 然后html不算编程语言,是标记语言,你不能说一个html文件是一个程序吧,程序的结果是可变的,纯html 是固定的。js不能操作文档不是因为它被载入内存。 PHP也被载入内存的,任何程序都要载入内存去执行。 关键在于js寄存的浏览器,没有给js操作权限。 js被包裹起来了。 只能通过浏览器去操作cookie之类的有严格限定的文件。 而php的解释器是拥有文件操作权限的。 当然只是有服务器的文件操作权限。 客户端的东西是不能操作的。 至少光凭它自己是不能的。 同样的,js也是不能操作服务器上的东西的。 就算是读取服务器的文件,也是要经过apache之类 的服务器软件来读取的。 js本身只是给服务器发个话。 服务器给不给返回,还是看服务器心情的。 很多东西个人理解会有偏差,我建议你有不理解的地方就查查文档。 比我这种业余的码农更权威。 ######还有就是不管i/O和内存,都是开始说的一个用户占用部分的东西,如果多个用户不是同时解析,那么,,就可以说成是fclose这个可以不写,当然写了最好######额,问下,你什么行业啊,以前学什么专业。。? 专业的书籍我看了一些,但是一两本书说的很少,同时国内的书确实不好,国外的书翻译的又老火。###### 我就是一个业余的爱好者而已。没学过什么专业,也不在什么行业。 纯兴趣。 当然以后就难说了。 老实说,我是最近一年才学的编程。 但是计算基础方面的东西积累了很多年,也有一定的了解了。 你叫我买书来看我真看不下去。 我的方法是,先看视频。 对一门语言有大概了解,然后把文档上的每一条都拿 来琢磨透,然后开发小项目。 当然我也没能吞下文档。 所以才成为业余的。 另外上面这个问题 如果多个用户不是同时请求或者用户很少,自然不需要fclose了。 不过也有可能程序结束没有关闭I/O连接导致进程关闭失败造成僵尸进程, 浪费了资源。也难说的。 ######呵呵,你让我想起了有,不要问我从哪里来,我不也不知道去哪里,我不属于任何地方,未来一切皆有可能的某部电影~~~~###### @kog-7 这是褒奖吗。。。。 ######回复 @Infinity : 改xml的php,写在上面,感觉用了很多重复的话######回复 @業餘碼農 : 那好多人都去提鞋了~我只是好奇好奇,你要是提鞋的,我就是给别人檫菊花的~!~######。。。。要是有个人对自己的身份工作支支吾吾遮遮掩掩,要么他是个特工黑客要么他就是个提鞋的。你觉得我像不像特工呢?######回复 @業餘碼農 : 呵呵,搞那么多标签干嘛嘛,你就是你,我只想了解你是干嘛的。######回复 @kog-7 : 。。。。。。。。。。。。农二代工一代码后代。######就是这个改xml,感觉写多了<?php header("Content-type: text/html; charset=utf-8"); print '<style> body{ background:rgba(223,238,231,0.9); } .error{color:rgb(182,69,69);font-size:60%;} .iput { border:1px solid black;      height:10%; background:rgb(223,238,231); font-family:"Microsoft YaHei",微软雅黑,helvetica; } #word0u { margin-left:2%; float:left; margin-top:5%; font-family:"Microsoft YaHei",微软雅黑,helvetica; } #input0u { list-style-type:none; float:left; margin-top:5%; } </style>'; print "<script> function closef() {window.parent.document.getElementById('screen').style.display='none';} </script>"; print '<body><button  style="cursor:pointer;border:1px;right:0px;top:0px;font-family:arial;font-weight:bolder;position:absolute" onclick="closef()">X</button>  '; $pro=true; if($_SERVER['REQUEST_METHOD']=="POST") { $pro=false;    if(empty($_POST['user'])||empty($_POST['pw'])||empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','请输入用户名和密码').' </span>';}    if(strlen($_POST['user'])>15)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','用户名要小于5位数').' </span>';}    if(strlen($_POST['pw'])<5)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','密码要大于5位数').' </span>';}    if(empty($_POST['pw'])!=empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','两次密码输入不一样').' </span>';}  $xmluser=new DOMDocument;  $xmluser->load('euser.xml');  $users=$xmluser->getElementsByTagName('user'); for($i=0;$i<$users->length;$i++) { if($users->item($i)->childNodes->item(0)->nodeValue==$_POST['user']) { $pro=true; print '<p class="error">'.iconv('gb2312','utf-8','有人用了这个用户名').'</p>';; break; } } } if(!$pro) { date_default_timezone_set('Asia/Shanghai');  $log= $xmluser->createElement('log');  $user= $xmluser->createElement('user');  $pw= $xmluser->createElement('pw');  $time=$xmluser->createElement('time'); $usert=$xmluser->createTextNode($_POST['user']); $pwt=$xmluser->createTextNode($_POST['pw']); $da=date("Y-m-d"); $timet=$xmluser->createTextNode($da); $user->appendChild($usert); $pw->appendChild($pwt); $time->appendChild($timet); $log->appendChild($user); $log->appendChild($pw); $log->appendChild($time); $xmluser->documentElement->appendChild($log); $xmluser->save('euser.xml'); print "<h2 style='font-family:微软雅黑,helvetica'>".iconv('gb2312','utf-8','欢迎').$_POST['user']." ".$da." ".iconv('gb2312','utf-8','您已注册')."</h2>"; $uu=$_POST['user']; $pp=$_POST['pw']; print "<script> window.parent.document.getElementById('user').innerHTML='hello<br>$uu'; window.parent.document.getElementById('login').style.display='none'; window.parent.document.getElementById('logon').style.display='none'; window.parent.document.getElementById('cookss').style.display='none'; window.parent.document.getElementById('clears').style.display='inherit'; window.parent.document.getElementById('chat').src='example1.html'; document.cookie='koguser=$uu'; </script></body>"; } else { print "<p style='font-family:arial;font-weight:bold;font-size:150%;letter-spacing:5px;margin-left:auto;margin-right:auto;width:70%;height:10%;text-align:center;margin-top:2%'>welcome</p>"; $_POST=array(); print  "<form action='elog.php' method='post'><ul id='word0u'><li>".iconv('gb2312','utf-8','用户名')."</li><br><li>" .iconv('gb2312','utf-8','密码')."</li><br><li>" .iconv('gb2312','utf-8','再次确认密码')."</li></ul> <ul id='input0u'><li><input class='iput' type='text' name='user' size='20'/></li><br> <li><input class='iput' type='password' name='pw' size='20'/></li><br> <li><input class='iput' type='password' name='pw2' size='20'/></li></ul><div><input style='border:2px solid black;clear:left;font-family:helvetica;background:rgb(223,238,231);margin-left:42%;margin-top:3%;font-size:18px;width:100px;text-align:center' type='submit' value=".iconv('gb2312','utf-8','注册')."></div></form></body>"; } ?> ###### 引用来自“Infinity”的评论首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。 谢谢~"

montos 2020-06-04 13:24:13 0 浏览量 回答数 0

回答

回2楼啊里新人的帖子 在日常的业务开发中,常见使用到索引的地方大概有两类: 第一类.做业务约束需求,比如需要保证表中每行的单个字段或者某几个组合字段是唯一的,则可以在表中创建唯一索引; 比如:需要保证test表中插入user_id字段的值不能出现重复,则在设计表的时候,就可以在表中user_id字段上创建一个唯一索引: CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `user_id` int(11) NOT NULL,   `gmt_create` datetime DEFAULT NULL,   PRIMARY KEY (`id`),   UNIQUE KEY `uk_userid` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 第二类.提高SQL语句执行速度,可以根据SQL语句的查询条件在表中创建合适的索引,以此来提升SQL语句的执行速度; 此过程好比是去图书找一本书,最慢的方法就是从图书馆的每一层楼每一个书架一本本的找过去;快捷一点的方法就是先通过图书检索来确认这一本书在几楼那个书架上,然后直接去找就可以了;当然创建这个索引也需要有一定的代价,需要存储空间来存放,需要在数据行插入,更新,删除的时候维护索引: 例如: CREATE TABLE `test_record` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `user_id` int(11) NOT NULL,   `gmt_create` datetime DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5635996 DEFAULT CHARSET=utf8 该表有500w的记录,我需要查询20:00后插入的记录有多少条记录: mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00'; +----------+ | count(*) | +----------+ |        1 | +----------+ 1 row in set (1.31 sec) 可以看到查询耗费了1.31秒返回了1行记录,如果我们在gmt_create字段上添加索引: mysql> alter table test_record add index ind_gmt_create(gmt_create); Query OK, 0 rows affected (21.87 sec) Records: 0  Duplicates: 0  Warnings: 0 mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00'; +----------+ | count(*) | +----------+ |        1 | +----------+ 1 row in set (0.01 sec) 查询只消耗了0.01秒中就返回了记录. 总的来说,为SQL语句(select,update,delete)创建必要的索引是必须的,这样虽然有一定的性能和空间消耗,但是是值得,尤其是在大并发的请求下,大量的数据被扫描造成系统IO和CPU资源消耗完,进而导致整个数据库不可服务. ------------------------- 怎么学好数据库是一个比较大题目,数据库不仅仅是写SQL那么简单,即使知道了SQL怎么写,还需要很清楚的知道这条SQL他大概扫描了多少数据,返回多少数据,是否需要创建索引。至于SQL优化是一个比较专业的技术活,但是可以通过学习是可以掌握的,你可以把一条sql从执行不出来优化到瞬间完成执行,这个过程的成就感是信心满满的。学习的方法可以有以下一些过程:1、自己查资料,包括书本,在线文档,google,别人的总结等等,试图自己解决2、多做实验,证明自己的想法以及判断3、如果实在不行,再去论坛问,或者问朋友4、如果问题解决了,把该问题的整个解决方法记录下来,以备后来的需要5、多关注别人的问题,或许以后自己就遇到了,并总是试图去多帮助别人6、习惯从多个方面去考虑问题,并且养成良好的总结习惯 下面是一些国内顶级数据库专家学习数据库的经验分享给大家: http://www.eygle.com/archives/2005/08/ecinieoracleouo.html 其实学习任何东西都是一样,没有太多的捷径可走,必须打好了坚实的基础,才有可以在进一步学习中得到快速提高。王国维在他的《人间词话》中曾经概括了为学的三种境界,我在这里套用一下: 古今之成大事业、大学问者,罔不经过三种之境界。"昨夜西风凋碧树。独上高楼,望尽天涯路。"此第一境界也。"衣带渐宽终不悔,为伊消得人憔悴。"此第二境界也。"众里寻他千百度,蓦然回首,那人却在灯火阑珊处。"此第三境界也。 学习Oracle,这也是你必须经历的三种境界。 第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。 这里,注意一个"尽"字,在开始学习的过程中,你必须充分阅读Oracle的基础文档,概念手册、管理手册、备份恢复手册等(这些你都可以在http://tahiti.oracle.com 上找到);OCP认证的教材也值得仔细阅读。打好基础之后你才具备了进一步提升的能力,万丈高楼都是由地而起。 第二层境界是说,尽管经历挫折、打击、灰心、沮丧,也都要坚持不放弃,具备了基础知识之后,你可以对自己感兴趣或者工作中遇到的问题进行深入的思考,由浅入深从来都不是轻而易举的,甚至很多时候你会感到自己停滞不前了,但是不要动摇,学习及理解上的突破也需要时间。 第三次境界是说,经历了那么多努力以后,你会发现,那苦苦思考的问题,那百思不得其解的算法原理,原来答案就在手边,你的思路豁然开朗,宛如拨云见月。这个时候,学习对你来说,不再是个难题,也许是种享受,也许成为艺术。 所以如果你想问我如何速成,那我是没有答案的。 不经一番寒彻骨,哪得梅花扑鼻香。 当然这三种境界在实际中也许是交叉的,在不断的学习中,不断有蓦然回首的收获。 我自己在学习的过程中,经常是采用"由点及面法"。 当遇到一个问题后,一定是深入下去,穷究根本,这样你会发现,一个简单的问题也必定会带起一大片的知识点,如果你能对很多问题进行深入思考和研究,那么在深处,你会发现,这些面逐渐接合,慢慢的延伸到oracle的所有层面,逐渐的你就能融会贯通。这时候,你会主动的去尝试全面学习Oracle,扫除你的知识盲点,学习已经成为一种需要。 由实践触发的学习才最有针对性,才更能让你深入的理解书本上的知识,正所谓:" 纸上得来终觉浅,绝知此事要躬行"。实践的经验于我们是至为宝贵的。 如果说有,那么这,就是我的捷径。 想想自己,经常是"每有所获,便欣然忘食", 兴趣才是我们最好的老师。 Oracle的优化是一门学问,也是一门艺术,理解透彻了,你会知道,优化不过是在各种条件之下做出的均衡与折中。 内存、外存;CPU、IO...对这一切你都需要有充分的认识和相当的了解,管理数据库所需要的知识并不单纯。 作为一个数据库管理人员,你需要做的就是能够根据自己的知识以及经验在各种复杂情况下做出快速正确的判断。当问题出现时,你需要知道使用怎样的手段发现问题的根本;找到问题之后,你需要运用你的知识找到解决问题的方法。 这当然并不容易,举重若轻还是举轻若重,取决于你具备怎样的基础以及经验积累。 在网络上,Howard J. Rogers最近创造了一个新词组:Voodoo Tuning,用以形容那些没有及时更新自己的知识技能的所谓的Oracle技术专家。由于知识的陈旧或者理解的肤浅,他们提供的很多调整建议是错误的、容易使人误解的,甚至是荒诞的。他们提供的某些建议在有些情况下也许是正确的,如果你愿意回到Oracle5版或者6版的年代;但是这些建议在Oracle7.0,8.0 或者 Oracle8i以后往往是完全错误的。 后来基于类似问题触发了互联网内Oracle顶级高手的一系列深入讨论,TOM、Jonathan Lewis、HJR等人都参与其中,在我的网站上(www.eygle.com )上对这些内容及相关链接作了简要介绍,有兴趣的可以参考。 HJR给我们提了很好的一个提示:对你所需要调整的内容,你必须具有充分的认识,否则你做出的判断就有可能是错误的。 这也是我想给自己和大家的一个建议: 学习和研究Oracle,严谨和认真必不可少。 当然 你还需要勤奋,我所熟悉的在Oracle领域有所成就的技术人员,他们共同的特点就是勤奋。 如果你觉得掌握的东西没有别人多,那么也许就是因为,你不如别人勤奋。 要是你觉得这一切过于复杂了,那我还有一句简单的话送给大家: 不积跬步,无以至千里。学习正是在逐渐积累过程中的提高。 现在Itpub给我们提供了很好的交流场所,很多问题都可以在这里找到答案,互相讨论,互相学习。这是我们的幸运,我也因此非常感谢这个网络时代。 参考书籍: 如果是一个新人可以先买一些基本的入门书籍,比如MySQL:《 深入浅出MySQL——数据库开发、优化与管理维护 》,在进阶一点的就是《 高性能MySQL(第3版) 》 oracle的参考书籍: http://www.eygle.com/archives/2006/08/oracle_fundbook_recommand.html 最后建议不要在数据库中使用外键,让应用程序来保证。 ------------------------- Re:回 9楼(千鸟) 的帖子 我有一个问题想问问,现在在做一个与图书有关的项目,其中有一个功能是按图书书名搜索相似图书列表,问题不难,但是想优化一下,有如下问题想请教一下: 1、在图书数据库数据表的书名字段里,按图书书名进行关键字搜索,如何快速搜索相关的图书?   现在由于数据不多,直接用的like模糊查找验证功能而已; 如果数据量不大,是可以在数据库中完成搜索的,可以在搜索字段上创建索引,然后进行搜索查询: CREATE TABLE `book` (   `book_id` int(11) NOT NULL AUTO_INCREMENT,   `book_name` varchar(100) NOT NULL,   .............................   PRIMARY KEY (`book_id`),   KEY `ind_name` (`book_name`) ) ENGINE=InnoDB select book.*  from book , (select book_id from book where book_name like '%算法%')  book_search_id  where book.book_id=book_search_id.book_id; 但是当数据量变得很大后,就不在适合了,可以采用一些其他的第三方搜索技术比如sphinx; 2、如何按匹配的关键度进行快速排序?比如搜索“算法”,有一本书是《算法》,另一本书是《算法设计》,要求前者排在更前面。 现在的排序是根据数据表中的主键序号id进行的排序,没有达到想要的效果。 root@127.0.0.1 : test 15:57:12> select book_id,book_name from book_search where book_name like '%算%' order by book_name; +---------+--------------+ | book_id | book_name    | +---------+--------------+ |       2 | 算法       | |       1 | 算法设计 | ------------------------- 回 10楼(大黑豆) 的帖子 模糊查询分为半模糊和全模糊,也就是: select * from book where name like 'xxx%';(半模糊) select * from book where name like '%xxx%';(全模糊) 半模糊可以可以使用到索引,全模糊在上面场景是不能使用到索引的,但可以进行一些改进,比如: select book.*  from book , (select book_id from book where book_name like '%算法%')  book_search_id   where book.book_id=book_search_id.book_id; 注意这里book_id是主键,同时在book_name上创建了索引 上面的sql语句可以利用全索引扫描来完成优化,但是性能不会太好;特别在数据量大,请求频繁的业务场景下不要在数据库进行模糊查询; 非得使用数据库的话 ,建议不要在生产库进行查询,可以在只读节点进行查询,避免查询造成主业务数据库的资源消耗完,导致故障. 可以使用一些开源的搜索引擎技术,比如sphinx. ------------------------- 回 11楼(蓝色之鹰) 的帖子 我想问下,sql优化一般从那几个方面入手?多表之间的连接方式:Nested Loops,Hash Join 和 Sort Merge Join,是不是Hash Join最优连接? SQL优化需要了解优化器原理,索引的原理,表的存储结构,执行计划等,可以买一本书来系统的进行学习,多多实验; 不同的数据库优化器的模型不一样,比如oracle支持NL,HJ,SMJ,但是mysql只支持NL,不通的连接方式适用于不同的应用场景; NL:对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择 HJ:对于列连接是做大数据集连接时的常用方式 SMJ:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接 ------------------------- Re:回 19楼(原远) 的帖子 有个问题:分类表TQueCategory,问题表TQuestion(T-SQL) CREATE TABLE TQueCategory ( ID INT IDENTITY(1,1) PRIMARY KEY,        --问题分类ID NAME VARCHAR(20)        --问题分类名称 ) CREATE TABLE TQuestion ( ID INT IDENTITY(1,1) PRIMARY KEY,        --问题ID CateID INT NOT NULL,        --问题分类ID TITLE VARCHAR(50),        --问题标题 CONTENT VARCHAR(500)        --问题内容 ) 当前要统计某个分类下的问题数,有两种方式: 1.每次统计,在TQuestion通过CateID进行分组统计 SELECT CateID,COUNT(1) AS QueNum FROM TQuestion GROUP BY CateID WHERE 1=1 2.在TQueCategory表增加字段QueNum,用于标识该分类下的问题数量 ALTER TABLE TQueCategory ADD QueNum INT SELECT CateID,QueNum FROM TQueCategory 问:在哪种业务应用场景下采用上面哪种方式性能比较好,为什么? ############################################################################################### 方案 一 需要对 TQuestion 的 CateID字段 进行分组 ,可以在 CateID上创建一个索引,这样就可以索引扫描来完成查询; 方案 二 需要对 TQueCategory 进行扫描就可以得出结果,但是必须在问题表有插入,删除的时候维护quenum数量; 单单从SQL的性能来看, 分类表的数量应该是远远小于问题表的数量的,所以方案二的性能会比较好; 但是如果 TQuestion 的插入非常频繁的话,会带来对 TQueCategory的频繁更新,一次 TQuestion 的 insert或deleted就会带来一次 TQueCategory 的update,这个代价其实是蛮高的; 如果这个分类统计的查询不是非常频繁的话,建议还是使用方案一; 同时还可能还会其他的业务逻辑统计需求(例如: CateID +时间),这个时候在把逻辑放到 TQueCategory就不合适了。 ------------------------- 回 20楼(原远) 的帖子 经验之谈,仅供参考 使用外键在开发上确实省去了很多功夫,但是把业务逻辑交由数据库来完成,对后期的维护来说是很麻烦的事情,不利于维护. ------------------------- 回 21楼(玩站网) 的帖子 无关技术方面: 咨询一下,现在mysql新的版本,5.5.45后貌似修改了开源协议。 是否意味着今后我们商业化使用mysql将受到限制? 如果甲骨文真周到那一步,rds是否会受到影响? 一个疑惑: 为什么很少见到有人用mysql正则匹配?性能不好还是什么原因? ######################################## MySQL有商业版 和 社区版,RDS的MySQL采用开源的社区版进行改进,由专门的RDS MySQL源码团队来维护,国内TOP 10的mysql源码贡献者大部分都在RDS,包括了@丁奇 ,@彭立勋 ,@印风 等; 不在数据库中做业务计算,是保证数据库运行稳定的一个好的设计经验; 是否影响性能与你的sql的执行频率,需要参与的计算数据量相关,当然了还包括数据库所在主机的IO,cpu,内存等资源,离开了这些谈性能是没有多大意义的; ------------------------- 回 22楼(比哥) 的帖子 分页该怎么优化才行??? ######################### 可以参考这个链接,里面有很多的最佳实践,其中就包括了分页语句的优化: http://bbs.aliyun.com/read/168647.html?spm=5176.7114037.1996646101.1.celwA1&pos=1 普通写法: select  *  from t where sellerid=100 limit 100000,20 普通limit M,N的翻页写法,往往在越往后翻页的过程中速度越慢,原因 mysql会读取表中的前M+N条数据,M越大,性能就越差: 优化写法: select t1.* from  t t1,             (select id from t  sellerid=100 limit 100000,20) t2 where t1.id=t2.id; 优化后的翻页写法,先查询翻页中需要的N条数据的主键id,在根据主键id 回表查询所需要的N条数据,此过程中查询N条数据的主键ID在索引中完成 注意:需要在t表的sellerid字段上创建索引 create index ind_sellerid on t(sellerid); 案例: user_A (21:42:31): 这个sql该怎么优化,执行非常的慢: | Query   |   51 | Sending data | select id, ... from t_buyer where sellerId = 765922982 and gmt_modified >= '1970-01-01 08:00:00' and gmt_modified <= '2013-06-05 17:11:31' limit 255000, 5000 SQL改写:selectt2.* from (selectid from t_buyer where sellerId = 765922982   andgmt_modified >= '1970-01-01 08:00:00'   andgmt_modified <= '2013-06-05 17:11:31' limit255000, 5000)t1,t_buyer t2 where t1.id=t2.id index:seller_id,gmt_modified user_A(21:58:43): 好像很快啊。神奇,这个原理是啥啊。牛!!! user_A(21:59:55): 5000 rows in set (4.25 sec), 前面要90秒。 ------------------------- 回 27楼(板砖大叔) 的帖子 这里所说的索引都是普通的b-tree索引,mysql,sqlserver,oracle 的关系数据库都是默认支持的; ------------------------- 回 32楼(veeeye) 的帖子 可以详细说明一下“最后建议不要在数据库中使用外键,让应用程序来保证。 ”的原因吗?我们公司在项目中经常使用外键,用程序来保证不是相对而言更加复杂了吗? 这里的不建议使用外键,主要考虑到 : 第一.维护成本上,把一些业务逻辑交由数据库来保证,当业务需求发生改动的时候,需要同时考虑应用程序和数据库,有时候一些数据库变更或者bug,可能会导致外键的失效;同时也给数据库的管理人员带来维护的麻烦,不便于管理。 第二.性能上考虑,当大量数据写入的时候,外键肯定会带来一定的性能损耗,当出现这样的问题时候,再来改造去除外键,真的就不值得了; 最后,不在数据库中参与业务的计算(存储过程,函数,触发器,外键),是保证数据库运行稳定的一个好的最佳实践。 ------------------------- 回 33楼(优雅的固执) 的帖子 ReDBA专家门诊一期:索引与sql优化 十分想请大师分享下建立索引的经验 我平时简历索引是这样的 比如订单信息的话 建立 订单号  唯一聚集索引 其他的比如   客户编号 供应商编号 商品编号 这些建立非聚集不唯一索引   ################################################## 建立索引,需要根据你的SQL语句来进行创建,不是每一个字段都需要进行创建,也不是一个索引都不创建,,可以把你的SQL语句,应用场景发出来看看。 索引的创建确实是一个非常专业的技术活,需要掌握:表的存储方式,索引的原理,数据库的优化器,统计信息,最后还需要能够读懂数据库的执行计划,以此来判断索引是否创建正确; 所以需要进行系统的学习才能掌握,附件是我在2011年的时候的一次公开课的ppt,希望对你有帮助,同时可以把你平时遇到的索引创建的疑惑发到论坛上来,大家可以一起交流。 ------------------------- 回 30楼(几几届) 的帖子 我也是这样,简单的会,仔细写也会写出来,但是就是不知道有没有更快或者更好的 #################################################### 多写写SQL,掌握SQL优化的方法,自然这些问题不在话下了。 ------------------------- 回 40楼(小林阿小林) 的帖子 mysql如何查询需要优化的语句,比如慢查询的步奏,如何找出需要通知程序员修改或者优化的sql语句 ############################################################ 可以将mysql的慢日志打开,就可以记录执行时间超过指定阀值的慢SQL到本地文件或者数据库的slow_log表中; 在RDS中默认是打开了慢日志功能的:long_query_time=1,表示会记录执行时间>=1秒的慢sql; 如何快速找到mysql瓶颈: 简单一点的方法,可以通过监控mysql所在主机的性能(CPU,IO,load等)以及mysql本身的一些状态值(connections,thread running,qps,命中率等); RDS提供了完善的数据库监控体系,包括了CPU,IOPS,Disk,Connections,QPS,可以重点关注cpu,IO,connections,disk 4个 指标; cpu,io,connections主要体现在了性能瓶颈,disk主要体现了空间瓶颈; 有时候一条慢sql语句的频繁调用,也可能导致整个实例的cpu,io,connections达到100%;也有可能一条排序的sql语句,消耗大量的临时空间,导致实例的空间消耗完。 ------------------------- 下面是分析一个cpu 100%的案例分析:该实例的cpu已经到达100% 查看当前数据库的活动会话信息:当前数据库有较多的活跃线程在数据库中执行查看当前数据库正在执行的sql: 可以看到这条sql执行的非常缓慢:[tr=rgb(100, 204, 255)]delete from task_process where task_id='1801099' 查看这个表的索引: CREATE TABLE `task_process` (  `id` int(11) NOT NULL AUTO_INCREMENT,    ................  `task_id` int(11) NOT NULL DEFAULT '0' COMMENT '??????id',   ................  PRIMARY KEY (`id`),  KEY `index_over_task` (`is_over`,`task_id`),  KEY `index_over` (`is_over`,`is_auto`) USING BTREE,  KEY `index_process_sn` (`process_sn`,`is_over`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=32129710; 可以看到这个表有3KW的数据,但是没有task_id字段开头的索引,导致该sql语句删除需要进行全表扫描: 在我们的诊断报告中已经将该sql语句捕获到,同时给你提出该怎样进行索引的添加。 广告:诊断报告将会在1月底发布到控制台,到时候用户可以直接查看诊断建议,来完成你的数据库优化。 ------------------------- 回 45楼(dentrite) 的帖子 datetime和int都是占用数据库4个字节,所以在空间上没有什么差别;但是为了可读性,建议还是使用datetime数据类型。 ------------------------- 回 48楼(yuantel) 的帖子 麻烦把ecs_brand和ecs_goods的表结构发出来一下看看 。 ------------------------- 回 51楼(小林阿小林) 的帖子 普通的 ECS服务器上目前还没有这样的慢SQL索引建议的工具。 不过后续有IDBCloud将会集成这样的sql诊断功能,使用他来管理ECS上的数据库就可以使用这样的功能了 。

玄惭 2019-12-02 01:16:11 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅