精华内容
下载资源
问答
  • 人物画像

    万次阅读 2016-10-30 20:00:15
    talkingdata工程师分享人物画像的笔记;作为一个数据公司,通过提供sdk给各个行业来获取用户终端数据,地理信息,app信息等来推测一个用户画像,是一个非常具有价值的操作,可以给商家带来财富

    人物画像

    From TalkingData 王鹏

    1. 什么是画像
    2. 画像的用处
    3. 如何进行用户画像
    4. 画像应用中的难点

    1. 什么是画像

    ​ profile,从不同角度来表示一个人;角度可以是事实和抽象的,自然属性,性别,年龄;社会属性:职业、社交特征;财富:高收入人群,是否有固定资产;家庭情况:结婚,是否已经有孩子;购物习惯:网购 vs 逛商场;位置特征:哪个城市生活;或者是一些行为习惯。

    1. 人口属性:性别,年龄
    2. 资产状况:房产,收入
    3. 兴趣特征:阅读咨询,运动健康等
    4. 消费特征:网上、线下消费类别等特征
    5. 位置特征:常驻城市,职住距离等
    6. 设备属性:所使用终端的特性

    2. 画像的用处

    ​ 解决业务问题;拓展新用户;获得一个新订单;获取新用户,要知道自己产品定位的用户画像;用户画像是帮助企业明确目标客群的重要手段之一;将有类似画像特征的人群转化成自己的用户;

    ​ 例子��:打车公司:有需要且有车的用户 vs 有需要但没车的用户 结果发现 前者 的 广告触达率比较高;映射出: 习惯了车反而离不开车

    • 如何准确的了解现有用户

    • 如何在茫茫人海中通过广告营销获取类似画像特征的新用户。

      逻辑上有些相悖:了解现有用户的画像,需要的是少量、画像特征覆盖度全面的无倾斜的精准样本,这样更能精确的定位产品的用户。而通过画像结果做广告营销获取新用户,在一定程度上需要的是大量的相似样本;量的大小和精准度的不同决定了后续画像模型在应用设计中的不同。

    标签:表达人的基本属性,兴趣爱好,行为偏好等某一个维度的数据标示。一种相关性很强的关键字,可以简洁的描述和分类人群。不同的行业,不同的应用场景,同样的标签名称可能代表不同的含义,也决定了不同的模型设计和数据处理方式。

    ​ 例子:卖男装筛选“男性”,“网络购物” 这两个标签进行投放,效果并不理想;

    “性别”有多种维度

    • 真实性别
    • 网络购物特征男女
    • 性取向男女

    3. 如何进行用户画像

    取决于业务目标(需要什么样的画像标签)和有什么样的原材料(有什么类型的数据源),基于这样才能确定使用什么样的模型设计和数据计算处理方式。

    1. 征信场景,想知道这个人的真实性别:

      在没有全量真实数据的情况下,可以采取如下的方法来处理:选取少量真实样本,使用这些真实样本追加一些特征因子,使用looklike算法进行样本扩展,将该少数样本特征扩展到大量或者全量数据。当然,这些数据的准确率取决于样本的均衡程度和算法的质量。

    2. 网络购物的电商场景

      考虑将来该网络账户实体是否会购买男装的角度,需要的是“男装购买倾向”的标签,可以基于所有账户实体以往购买记录来计算处理该标签。

    3. 同性交友app定义的男性

      “男性同志”标签,考虑通过安装了类似同志交友的app人群或者以同志人群经常出现的聚集地进行计算处理。

    使用这些不同源的数据,计算处理业务需要的标签:

    1. 数据抽取:从不同数据源抽取要计算标签的数据原材料
    2. 数据标准化:针对抽取的数据将其清洗为标准格式,将其中的错误数据和无效数据剔除。
    3. 数据打通:不同来源的数据有不同的主键和属性,比如有设备的WiFi信息,又有设备的poi信息,就可以通过WiFi将设备终端和poi(point of information)建立起关联。
    4. 模型设计:针对不同的数据内容和业务目标设计不同的规则和算法进行模型的构建,并使用小样本数据进行模型的可靠性验证
    5. 标签计算:在模型可靠性验证的基础上,部署生产运营环境来进行标签计算。

    例子:大学生标签

    没有每个大学生的入学信息和证件信息,我们如何操作呢。

    1. 进行业务分析,发现大学生的行为特征:在大学校园内活动比较多,将全国2000多所高校的位置找到,根据移动终端设备的位置信息来筛选“大学生人群”;
    2. 使用一些特殊的app,比如考研类,四六级,课程表等这类特殊app,可以通过app进行“大学生”人群的筛选。

    如何不用算法,就只用规则,我们想找精确的“大学生”人群,可以将位置和app行为两个特征叠加使用;

    如果我们想要扩展样本进行大规模广告投放,可以考虑含位置、app行为任意一个特征的人群,同时还可以通过算法类似lookalike的扩展样本学习。

    用户画像和标签设计中的一些难点

    1. 如何定义画像主体?如何唯一标识一个实体?

      真实世界每个人都是一个实体,但是虚拟世界他可能就变身为多个,比如人可能有一个身份id, 但是可能有多个手机号,多个终端设备ID,那就对应了多个移动终端的使用行为,将这些ID的特征拼接起来才能代表完整的画像。一对多的情况。

      多对一的情况:ipad的使用。孩子用来玩游戏,父亲查邮件,母亲用来购物。只要通过标签能够筛选出来想寻找的受众群体就可以。

    2. 如何打通不同源的数据?

      pc端,移动端,tv端的行为信息,如何将这些信息关联起来,在于将这些终端的唯一标识ID打通。TalkingData的IDMapping能力已经实现了跨设备ID的关联映射。所以要解决不同源ID的打通只要接入一家类似TalkingData的数据即可。

    FAQ

    1. 常用算法

      Linear Regression 线性回归

      Logistic Regression 二分类

      multi-class logistic regression 多分类逻辑回归

      Fregata(Non-parametric Algorithms)

      Random Decision Tree 随机决策树

      Random Decision Hashing 随机决策哈希

    2. 评估画像的好坏

      小样本的真实验证

      在实际的case中迭代验证

      外部标签的交叉验证,比如“已婚”标签的,不可能是”18岁以下”人群。

    3. 标签的存储

      hdfs,vertica, hbase。标签的追溯,取决于你的标签的生命周期,有的标签就是最新的,有的是每周每月加工的,有的是时间衰减迭代的。

    4. 样本的准确性

      大数据本身不存在所谓的正确性,是用来验证人的先验知识/经验的一种工具,这个里面应该考虑的不止是准确性的问题,而是如何能更好的提高你认为的准确率的问题,大数据由于题量大,需要的是数量、时间等多维的迭代,维度的扩展。

    展开全文
  • 水浒人物画像谱(天罡).doc
  • 水浒人物画像谱(天罡).doc
  • 它是一个3D的视差人物画像,并且人物的头和眼睛可以跟随鼠标移动,如果在移动设备上的话,用手指移动屏幕也可以实现这个效果。更加厉害的是,这个人物画像在加载时是一幅素描画像,但是会逐渐变成油画的效果,你们...
  • 人物画像及“七步人物角色法”

    万次阅读 2017-10-16 11:55:28
    人物画像的主要目的是分析人物行为,最终为每个人物打上标签,以及该标签的权重 1.标签是对用户的社会属性、生活习惯、消费行为等进行进一步的抽象, 通过简单规则算法或者大数据技术对用户行为习惯的分析提取, ...

    人物画像的主要目的是分析人物行为,最终为每个人物打上标签,以及该标签的权重

       1.标签是对用户的社会属性、生活习惯、消费行为等进行进一步的抽象, 通过简单规则算法或者大数据技术对用户行为习惯的分析提取, 以及对用户简单直接的特征描述即用户标签, 标签的目的使我们简单、直观的了解用户的某些特征。
       2.权重代表指数,即目标在这以标签上的侧重值人物画像的核心在于给人物“打标签”,每一个标签通常是人为规定的特征标识,用高度精炼的特征描述一类人
    

    进行人物画像最重要的是数据,对于数据我们分为以下几类

     1.人物数据
        静态数据:人物相对固定的数据,例如身份证号,姓名,年龄,求学经历等
        动态数据:人物的行为操作的记录,出于对象主观意识进行的选择
     2.被选择对象数据:用于记录可供人物对象选择操作的对象(即主谓宾中的宾语)的特征的属性
        主观数据:被选择对象的固有属性
        客观数据:被选择对象的客观印象、分类等
     3.when/where数据
        用于记录何时、何地(或通过何种途径)获得的该数据,用于标识此条数据的重要程度
     4.人物厌恶数据
        用于记录人物对象明确表示厌恶或禁止的数据
    

    用户画像的步骤——“七步人物角色法”

    1. 发现并确认模型因子 典型用户集群的行为变量集合(例:活动[频率和工作量] 态度[如何看待 生活必须?提高效率?消遣娱乐打发时间?] 能力[受教育和培训程度 自我学习能力] 技能[在什么领域使用的产品 有哪些使用技巧和特殊技能])
    2. 访谈目标用户 将访谈对象和行为变量一一对应,定位到某个范围的精确点(20%重价格 20%重功能 60%重品牌 其中A用户就是这60%的大多数) 将用户进行四象限分类,不同类型的用户看重的产品侧重点和比例不同
    3. 识别行为模式在多个行为变量上看到相同的用户群体→同一类用户群体的显著行为模式若模式有效,那行为变量和用户角色就有逻辑关系/因果关系(爱听音乐的人会购买高质量耳机)
    4. 确认用户特征和目标 用户特征:从数据出发,综合考虑细节,描述潜在使用环境、使用场景和当前产品的不足、用户不满等(对一两个典型形象进行刻画,可视化人物角色,如姓名 年龄 特征)目标:初级目标——有用 体验目标 人生目标【生活目标 隐形目标[自我实现] 炫耀】
    5. 检查完整性和重复(检查人物和行为模式的对应关系 是否存在重要缺漏 是否缺少重要的典型人物 是否缺少重要的行为模式 确保人物角色和行为模式的独特性和差异性)
    6. 描述典型场景下用户的行为(表述模型:虚拟事件和用户的反应 介绍用户角色,简略勾画关注点、兴趣爱好以及工作生活中与产品的直接关系) 传达情感化信息 同理心感受用户  
    7. 指定用户类型(对所有用户角色进行优先级排序→首要设计对象)【典型用户、次要用户、补充用户、负面人物角色即非目标用户】

    【描述方法:关键词法 列表法 卡片法】
      1、 关键词法——将用户特质标签化,用关键词记录用户的信息、喜好、态度、行为等
      优:直观简单、便于归类统计、赋予关键词权重(大/小标签)→不同的人物角色合集
      缺:缺乏逻辑关联性,无法逻辑的表达出用户角色和行为的关系,易出现缺漏和重复,不能建立起行为和人物的关系。
      2、 列表法——最常用的描述方法,但不易在用户与用户之间进行横向比较,较难对用户角色排序,较难分清主要和次要角色
      3、 卡片法——将用户标签写出来,让团队成员进行横向/纵向排序
      项目需求迅速达成一致
      让团队形成UCD的思路和流程 将用户模型和用户画像引入产品设计的方方面面
      避免用户画像的以下错误:
      1. 典型用户≠用户细分 (给用户建模,更关注用户如何看待和使用产品、如何与产品互动,是一个较连续的过程)
      2. 典型用户≠平均用户(在社会科学中,人群特征按正态分布 经济统计学中的“二八定律” 20%的人占有80%的社会财富 取中位数!) 应关注典型用户或使用户典型
      3. 典型用户不是只有一个(类)【受欢迎的典型用户和不受欢迎的典型用户 与产品目标的相符度】
      4. 典型用户不是真实用户(重点关注一群用户需要什么、喜欢什么)
      5. 除了典型用户还有其他人物角色

    展开全文
  • 人物画像软件

    2014-02-09 11:50:14
    解压密码:www.jz5u.com 有十余款模板供选择,家用。
  • 人物画像————圆球转动效果

    千次阅读 2018-07-20 15:31:10
    前言: <!doctype html> <html> <head> <meta http-equiv="content-type"...人物画像</title> <meta name=

    前言:

    <!doctype html>
    <html>
    
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    		<title>人物画像</title>
    		<meta name="author" content="hongru.chen" />
    		<style type="text/css">
    			html {
    				overflow: hidden
    			}
    			
    			body,
    			.screen {
    				overflow: hidden;
    				width: 500px;
    				height: 500px;
    				position: absolute;
    				margin: 0;
    				padding: 0;
    				border: 1px solid red;
    			}
    			
    			#screen {
    				left: 0;
    				top: 0;
    				zoom: 1;
    			}
    			
    			#screen a {
    				position: absolute;
    				font-size: 12px;
    				overflow: hidden;
    				padding: 1px 2px;
    				font-weight: bold;
    			}
    			
    			#screen a:hover {
    				border: 1px solid #ccc;
    				background: #666
    			}
    		</style>
    		
    		
    		<script src="jquery.min.js"></script>
    		<script type="text/javascript">
    			var tt="";
    			var BeautifullMath = function() {
    				var obj = [],
    					xm = 0,
    					ym = 0,
    					axe = 0,
    					aye = 0,
    					parts = 50,
    					scr, aArr, txe, tye, nw, nh;
    				var colorArr = ['black', 'blue', 'red', 'green', 'yellow'];
    				var addEvent = function(o, e, f) {
    					window.addEventListener ? o.addEventListener(e, f, false) : o.attachEvent('on' + e, function() {
    						f.call(o)
    					})
    				}
    				var resize = function() {
    					nw = scr.offsetWidth * .5;
    					nh = scr.offsetHeight * .5;
    				}
    				var init = function(id, f) {
    					scr = document.getElementById(id);
    					aArr = document.getElementsByTagName('a');
    					
    //					function fun(e){
    //						e = e || window.event;
    //						xm = e.clientX;
    //						ym = e.clientY;
    //					}
    					addEvent(document, 'mousemove', function(e) {
    //						fun(e);
    //						console.log(e.target)
    						console.log(e.target.tagName)
    						if(e.target.tagName == "A"){
    							return false;
    							clearInterval(tt);
    						}
    						e = e || window.event;
    						xm = e.clientX;
    						ym = e.clientY;
    						
    					});
    					resize();
    					addEvent(window, 'resize', resize);
    					__init(f);
    					tt = setInterval(run, 10);
    				}
    				var __init = function(f) {
    					for(var i = 0; i < aArr.length; i++) {
    						var o = {};
    						o.p = aArr[i];
    						o.p.style.color = colorArr[Math.round(Math.random() * 4)];
    						var r = i / parts,
    							j, a, b;
    						j = i % parts;
    //						a = Math.floor(j) / 200 + (Math.floor(j / 2) % 10) / 5 * Math.PI * 2;
    						a = Math.floor(j) / 50 + (Math.floor(j / 2) % 10) / 5 * Math.PI * 2;
    						b = Math.acos(-0.9 + (j % 4) * 0.6);
    						r = !!f ? f(r) : r - r * r + .5;
    						var sbr = Math.sin(b) * r;
    						o.x = Math.sin(a) * sbr;
    						o.y = Math.cos(a) * sbr;
    						o.z = Math.cos(b) * r;
    						obj.push(o);
    						o.transform = function() {
    							var ax = .02 * txe,
    								ay = .02 * tye,
    								cx = Math.cos(ax),
    								sx = Math.sin(ax),
    								cy = Math.cos(ay),
    								sy = Math.sin(ay);
    							//rotation
    							var z = this.y * sx + this.z * cx;
    							this.y = this.y * cx + this.z * -sx;
    							this.z = this.x * -sy + z * cy;
    							this.x = this.x * cy + z * sy;
    							//3d
    							var scale = 1.3 / (1 + this.z),
    								x = this.x * scale * nh + nw - scale * 2,
    								y = this.y * scale * nh + nh - scale * 2;
    							//set style
    							var p = this.p.style;
    							if(x >= 0 && y >= 0 && x < nw * 2 && y < nh * 2) {
    								var c = Math.round(256 + (-this.z * 256));
    								p.left = Math.round(x) + 'px';
    								p.top = Math.round(y) + 'px';
    								p.fontSize = Math.round(14 * scale) + 'px';
    //								p.fontSize = (Math.random()*50 +scale)  + 'px';
    								p.zIndex = 200 + Math.floor(-this.z * 100);
    								p.opacity = .6 - this.z;
    								p.filter = 'alpha(opacity=' + 100 * (.6 - this.z) + ')';
    							} else p.width = "0px";
    						}
    					}
    				}
    				//run function 
    				var run = function() {
    					var se = 1 / nh;
    					txe = (ym - axe) * se;
    					tye = (xm - aye) * se;
    					axe += txe;
    					aye += tye;
    					
    					/* ---- anim particles ---- */
    					for(var i = 0, o; o = obj[i]; i++) o.transform();
    				}
    				return {
    					init: init
    				}
    			}();
    			onload = function() {
    				BeautifullMath.init('screen', function(r) {
    					return .4;
    				});
    			}
    		</script>
    	</head>
    
    	<body>
    		<div id="screen" class="screen">
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    		</div>
    	</body>
    
    </html>

     

    2020/09/22扩展,自动匀速旋转


    1、去掉鼠标移入效果

    2、修改滚动方向

     

    <!doctype html>
    <html>
     
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    		<title>人物画像</title>
    		<meta name="author" content="hongru.chen" />
    		<style type="text/css">
    			html {
    				overflow: hidden
    			}
    			
    			body,
    			.screen {
    				overflow: hidden;
    				width: 500px;
    				height: 500px;
    				position: absolute;
    				margin: 0;
    				padding: 0;
    				border: 1px solid red;
    			}
    			
    			#screen {
    				left: 0;
    				top: 0;
    				zoom: 1;
    			}
    			
    			#screen a {
    				position: absolute;
    				font-size: 12px;
    				overflow: hidden;
    				padding: 1px 2px;
    				font-weight: bold;
    			}
    			
    			#screen a:hover {
    				border: 1px solid #ccc;
    				background: #666
    			}
    		</style>
    		
    		
    		<script src="jquery.min.js"></script>
    		<script type="text/javascript">
    			var tt="";
    			var BeautifullMath = function() {
    				var obj = [],
    					xm = 0,
    					ym = 0,
    					axe = 0,
    					aye = 0,
    					parts = 50,
    					scr, aArr, txe, tye, nw, nh;
    				var colorArr = ['black', 'blue', 'red', 'green', 'yellow'];
    				var addEvent = function(o, e, f) {
    					window.addEventListener ? o.addEventListener(e, f, false) : o.attachEvent('on' + e, function() {
    						f.call(o)
    					})
    				}
    				var resize = function() {
    					nw = scr.offsetWidth * .5;
    					nh = scr.offsetHeight * .5;
    				}
    				var init = function(id, f) {
    					scr = document.getElementById(id);
    					aArr = document.getElementsByTagName('a');
    					
    //					function fun(e){
    //						e = e || window.event;
    //						xm = e.clientX;
    //						ym = e.clientY;
    //					}
    //					addEvent(document, 'mousemove', function(e) {
    //						fun(e);
    //						console.log(e.target)
    //						console.log(e.target.tagName)
    //						if(e.target.tagName == "A"){
    //							return false;
    //							clearInterval(tt);
    //						}
    //						e = e || window.event;
    //						xm = e.clientX;
    //						ym = e.clientY;
    //						
    //					});
    					resize();
    					addEvent(window, 'resize', resize);
    					__init(f);
    					tt = setInterval(run, 10);
    				}
    				var __init = function(f) {
    					for(var i = 0; i < aArr.length; i++) {
    						var o = {};
    						o.p = aArr[i];
    						o.p.style.color = colorArr[Math.round(Math.random() * 4)];
    						var r = i / parts,
    							j, a, b;
    						j = i % parts;
    //						a = Math.floor(j) / 200 + (Math.floor(j / 2) % 10) / 5 * Math.PI * 2;
    						a = Math.floor(j) / 50 + (Math.floor(j / 2) % 10) / 5 * Math.PI * 2;
    						b = Math.acos(-0.9 + (j % 4) * 0.6);
    						r = !!f ? f(r) : r - r * r + .5;
    						var sbr = Math.sin(b) * r;
    						o.x = Math.sin(a) * sbr;
    						o.y = Math.cos(a) * sbr;
    						o.z = Math.cos(b) * r;
    						obj.push(o);
    						o.transform = function() {
    							var ax = .02 * txe,
    								ay = .02 * tye,
    								cx = Math.cos(ax),
    								sx = Math.sin(ax),
    								cy = Math.cos(ay),
    								sy = Math.sin(ay);
    							//rotation
    							var z = this.y * sx + this.z * cx;
    							this.y = this.y * cx + this.z * -sx;
    							this.z = this.x * -sy + z * cy;
    							this.x = this.x * cy + z * sy;
    							//3d
    							var scale = 1.3 / (1 + this.z),
    								x = this.x * scale * nh + nw - scale * 2,
    								y = this.y * scale * nh + nh - scale * 2;
    							//set style
    							var p = this.p.style;
    							if(x >= 0 && y >= 0 && x < nw * 2 && y < nh * 2) {
    								var c = Math.round(256 + (-this.z * 256));
    								p.left = Math.round(x) + 'px';
    								p.top = Math.round(y) + 'px';
    								p.fontSize = Math.round(14 * scale) + 'px';
    //								p.fontSize = (Math.random()*50 +scale)  + 'px';
    								p.zIndex = 200 + Math.floor(-this.z * 100);
    								p.opacity = .6 - this.z;
    								p.filter = 'alpha(opacity=' + 100 * (.6 - this.z) + ')';
    							} else p.width = "0px";
    						}
    					}
    				}
    				//run function 
    				var run = function() {
    					var se = 1 / nh;
    					
    //					axe=100//绝对值越大,速度越快
    //					aye=100//绝对值越大,速度越快
    					
    					axe=-100//绝对值越大,速度越快
    					aye=-100//绝对值越大,速度越快
    					
    					
    					txe = (ym - axe) * se;
    					tye = (xm - aye) * se;
    					axe += txe;
    					aye += tye;
    					
    					/* ---- anim particles ---- */
    					for(var i = 0, o; o = obj[i]; i++) o.transform();
    				}
    				return {
    					init: init
    				}
    			}();
    			onload = function() {
    				BeautifullMath.init('screen', function(r) {
    					return .4;
    				});
    			}
    		</script>
    	</head>
     
    	<body>
    		<div id="screen" class="screen">
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    			<a href="http://www.cnblogs.com/hongru/">老腊肉666</a>
    		</div>
    	</body>
     
    </html>

    效果:

    展开全文
  • C写的提取HZK16中汉字字模及简单人物画像
  • 这一期,我们补充来说明一下DBA的人物画像。   DBA的段位 真正厉害的DBA,他们犹如定海神针一样的作用。 (普通人眼中:DBA平常好像没啥事情干,浪费钱) 给你们讲一个扁鹊的故事,你们就知道其真正的作用。...

     

    上一期,我们对DBA这个岗位做了一些非常基础的阐述

    岗位怎么招第一期:DBA的解说

    这一期,我们补充来说明一下DBA的人物画像。

     

    DBA的段位

    真正厉害的DBA,他们犹如定海神针一样的作用。

    (普通人眼中:DBA平常好像没啥事情干,浪费钱)

    给你们讲一个扁鹊的故事,你们就知道其真正的作用。

    春秋战国时,扁鹊曾到魏国替魏文王诊断病情。

     

    优秀的DBA,就像扁鹊大哥一样,让整个系统在没有出现问题之前就把问题给解决了,让你觉得系统一直稳定无故障。

     

    其实公司是否有一个强力DBA,对从事技术研发相关工作的程序员或者架构师非常重要。

     

    DBA的等级,其实没有分得那么严格。

    一般可以简单分成3个等级,初级、中级和高级。

    初级的DBA一般都是兼职的,他们往往同时是程序员。初级的DBA简历,一般都写得超级棒的,比如参与了各种与数据库相关的工作之类的。

    然而,他们实际的工作是:

    1、第三方供应商已经安装并配置好数据库,他们只做监控的工作,处理一些简单的小问题,有大事就立马找第三方。

    2、他们喜欢使用图形化数据库管理工具,终端式的处理能力不强(类似于,在软件上点一点按钮,就可以完成工作)

     

    中级的DBA,他们涉及的工作就会多很多(其中,中级和高级在技术上差别不大,差距在于其他方面的能力)。

    数据库安装、配置、管理

    数据库权限及安全管理

    监控及性能调优

    备份及恢复

    解决一般性问题

     

    高级DBA,国内非常少。技术能力上,可能和中级DBA相差不大。主要差别在于技术的广度和经验的多少。

    高级DBA,可能会通晓多种大型数据库,且知道不同数据库在不同环境下的优势和劣势,并能够做出最适合的决策。

     

    当然,对于HR来说,这种分类实际上我们是非常难对人才的能力做判断,我们有时候只会通过一些相关的证书来判断。

    (告诉你,其实证书有时候并不是特别重要,有些培训都可以获得证书的)

    那么,HR应该从哪些角度来判断DBA的段位呢?

    其中有一句万金油的问法:如果你招一个DBA,你会从哪些角度或问哪些问题来判断这个人的技术能力。

    为了加深各位HR对DBA关键能力的印象,我们接下来一一拆解。

     

    HR可以从以下几个方面判断DBA的段位

     

    1.熟悉至少一种数据库的应用

    目前市场上有多种数据库之间的实现是有差异的,相关技巧不一定可以通用。一般DBA都会有一个擅长的数据库类型,例如:Oracle/Mysql/Mongodb等。

    无需询问,看简历即可

    包括:安装部署、执行计划、主要算法、参数调整、防灾备份、常见错误修复等

    2.熟悉至少一种数据库主要算法(重点关注)

    以执行计划为例:它实际上是数据库服务器在执行SQL语句时,会准备多套方案,最后选择消耗资源最小的那个方案,整个过程就是执行计划。(作为HR,是不是看不懂?)

    通俗点讲,我们打开高德地图,起点设置为体育中心B出口,目的地设为广州南站。这里,高德一般会提示给到你几条导航选择:最短时间,最短距离,躲避拥堵、高速优先等。

    这个过程,就类似于数据库操作的执行计划,而获得每一条线路的细节,就相当于查询算法的工作。

    执行计划一般有3种:

    全表扫描、索引扫描(索引扫描、索引范围扫描、索引快速全扫描、索引跳跃式扫描、索引降序式扫描)、ROWID扫描

    作为HR,不用强迫自己去理解这些概念,略有点难度。

    建议可以这么问:

    1、常用的执行计划有哪些类别?如果他答得上来,说明理论基础还可以,至少他背下来了嘛。

    2、不同的执行计划,有什么不一样?可否用通俗的语言来描述一下?

    3、在具体的项目中,哪些时候你会使用全表招描、哪些时候你用索引扫描、哪些时候你用ROWID扫描?你的判断依据是什么?(这个问题,一般放在1和2问题的后面,避免候选人通过问题的题干,了解答题逻辑)

    3、如何不借用第三方工具,查看sql的执行计划?

    4、在具体的执行计划中,你最常用的几种查找算法是什么?他们的区别是什么样的?(有三种,Nested Loops, Merge Joins和Hash Joins)

    3.熟悉影响数据库性能的参数 如MySQL中的my.ini中各种参数的含义、影响及调优方法。Oracle中SGA/PGA如何分配调整及调优等等。

    如果有兴趣的,可以问这些问题:

    1、Mysql的存储引擎有哪些类别,分别有什么区别?(MYISAM读性能好,InnoDB大容量数据处理)至少说明5点不同。

    公共参数配置:

    2、一般默认的最大连接数是多少?一般建议是多少?(151,80%)

    3、默认缓存数是多少?建议是多少?(2M,16M)

    MYISAM参数配置:

    索引缓存大小设置建议是?(物理内存的30-40%)

    读操作缓冲区大小默认是多少,建议是多少(128K,16M或32M)

    InnoDB参数配置:

    索引缓存设置建议是?(物理内存的60-70%)

    缓冲池的实例数一般推荐是多少个?(4或8个)

     

    Oracle的SGA和PGA也是参数配置的作用,只是叫法不同。

    SGA:System Global Area是Oracle 实例的基本组成部分,在实例启动时分配

    系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区

    PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存

     

    不用理解其到底是什么意思,只要知道这些参数设置得好,可以保证整个系统运转是否正常,比如卡机啊之类的,可能跟这块的工作会有关系。

    一般的数据是:

    对于OLTP系统,SGA占数据库使用总内存的80%,PGA占数据库使用内存的20%

    对于OLAP(DSS)系统,对于密集大查询的系统,PGA可以占到数据库使用总内存的70%

    这里同样可以问到你的面试者,如何设置基础参数,为什么要这么设置。

    关于OLTP和OLAP,之前分享过3次。

     

    以上这种内容一般是死记型的,面试者不一定记得住,也不能体现得出真实能力。

    建议通过笔记或者上机测试。

    当然如果你实在是要问的话,建议在每一个问题后面加上为什么要做这样的参数设置。

     

    4.熟悉至少一种数据库的SQL调优(重点关注) 因为数据库采用的算法并不一定相同,所以SQL调优的方式也不相同。

    SQL调优主要是提高数据库的性能和稳定。简言之,又快又稳。

     

    1、sql调整最关注的是什么?(读性能和IO量)

    2、你应该有对sql调优的一些常见方法做总结吧,你自己有哪些原则来提高查询效率?

    无论哪种优化,最需要坚持的原则是:避免无计划的全表扫描

     

    5.熟悉常见的防灾备份方法(重点关注)

    数据库的防灾备份,是保证系统是否能够稳定使用的重大前提。一般要求都是7*24小时。因此,DBA能够完成这部分工作,也是技术的一个重要评估标准。

    建议可以这么问:

    1、Mysql的复制原理及流程(可以给一张纸,让面试者画出来,并用一个生活例子来类比出来)

    2、备份有几种方式,说明不同的备份方法的异同?(热、温、冷,二进制日志备份,四种。一般用前三者多,业务影响从低到高排列,备份恢复成本从高到低排列、一致性1为组织后一致,前2和3者为完全一致)

    3、分布式数据的优缺点?(抗灾,高并发,受网络影响,总体成本高,扩展性强)

     

     

    6.熟悉数据库设计范式 范式不是万能的,但不懂是不行的。虽然生产中不可能完全采用范式设计,但是要知道不符合哪种范式会带来什么问题,这样才能在制造数据冗余的同时保证数据的一致性。

    基本都会,无需询问。

     

    7.熟悉数据库设计基本原则(重点关注) 为了提高效能,数据库设计中有一些常用的优化原则,需要了解其利弊,在设计中考虑正反两方面的影响,权衡利弊,设计优化的数据库模式。

    基本都会,不需询问。

    之前做过3次分享,可以回听我的分享。

     

    1.熟悉Linux/Unix操作系统的管理。 目前市场上绝大部分的数据库服务器是跑在Linux系统下的。对于DBA来说,熟悉Linux都是必备的。Solaris/FreeBSD等Unix系列的系统也有不少市场,尤其是Solaris被Oracle收购之后,更可能得到重视。

    这个部分是必备技能,高级DBA就没有必要问到这部分了。

    如果你要招初级的DBA,建议可以这么问:

    1、你使用Linux系统管理的操作频率最高的操作有哪些?

    2、怎么查看系统进程?

    3、如何发现进程死锁,需要关掉进程,有哪些方法?(kill pid /-9 kill pid)

    仅限初级DBA使用,如果有需要,回头我再整理一份技术的清单。但个人认为对于HR来说,这种问题基本上交给笔试就好了,高级DBA基本上搞得定这些的。

     

    2.了解网络模型和配置(重点关注)。 当DBA完全不懂网络,分布式、集群没有网络是跑不起来的,碰上大型应用,基本上就准备宕机了。这里主要和负载均衡有关,主流的负载均衡器有LVS/HAProxy/Nginx。

    建议可以这么问:

    1、你们公司服务器是否一主多从的结构?

    2、你们多从使用的负载均衡器是什么类型的?

    3、你还接触过哪些负载均衡器,这几种均衡器有什么区别?应用领域有什么不同吗?

    注意要按顺序来问,同时建议让面试者以通俗的例子来向HR解释。

    4.了解硬件体系结构。 数据库的问题并不一定是软件问题,也可能是硬件和网络的问题,了解硬件的体系结构,不仅可能帮助排错,也能正确的估算数据库的承受能力和硬件需求。

    4.了解硬件体系结构。 数据库的问题并不一定是软件问题,也可能是硬件和网络的问题,了解硬件的体系结构,不仅可能帮助排错,也能正确的估算数据库的承受能力和硬件需求。

     

    5.熟悉至少一种Linux脚本语言。 包括Perl/Shell/Python等,运维过程中少不了一些重复的操作,这些操作如果有脚本的帮助,将大大提高DBA的工作效率。

    Shell是必备的,Perl或Python可以二选一。

    如果你使用的是mac电脑,打开终端。

    标红色的,就是所谓的shell。

    实际上,是把我们原来通过鼠标双击打开文件,换成ls和cd。

    1.团队协作能力(重点关注) 特别是DBA,这个岗位实际上工作的伙伴除了开发工程师之外,甚至还有各方领导和销售端的同事,团队协作能力特别重要。工作中不可能一个人能单挑所有问题,总是需要合作的,跟团队的每个人处好关系,能完成自己的任务,并且能协同整个团队去解决问题,才能发挥自己的效能和整个团队的效能。

     

    2.正确的分析能力(重点关注)

    遇到问题或者拿到一个新的技术,如何去分析其问题所在或分析其原理,需要正确方法。能在排除其他因素干扰的情况下,分析问题,这是一种能力否则容易出现某些因素会干扰判断,得出错误的结论。

    这一点基本上和人的逻辑思维能力有关系。

    3.严谨负责的态度(重点关注)

    网上很多博文或者有些书中的结论,可能是翻译错误可能是作者疏漏,要抱着怀疑的态度去看书和博文,所述一定要经过自己证实、分析才能下结论,不可以光看就认为是正确的。没严谨的态度用正确的方法去分析,结果就看表面现象以为是正确的,可能很久都不能更正。

    这一点,可以通过考量人才的细心来判断。

     

    综合能力方面,相信HR可以通过常见的面试手段,可以做基本的判断。

    欢迎各位发出自己想要了解的岗位

    也许下一期,就是你的疑问

    让我们一起成为最懂技术的HR

     

    切记:

    我们是HR

    即使面试者回答的内容,听不懂也没关系

    我们关注的是他是否能够答得上来

     

    ———— / END / ————

    展开全文
  • 创建人物角色不知道怎样提取用户信息? 产品人员不知道怎样找到用户需求中的痛点? 产品人员不知道怎样把自己变成小白,把自己融入用户的场景中? 利用移情图可以帮到你怎样让自己变成小白,怎样站在用户的角度看...
  • 对于加工处理后的用户行为数据,利用开源的机器学习分类器包,调用封装好的各种数据函数,神经网络、支持向量机、贝叶斯等对数据进行聚类、分类和预测,根据第一步设计的用户画像标签体系,对访问平台的用户计算行为...
  • 今天正式进入开发阶段,上午是由项目带队老师线上进行java培训,学习java在开发中用到的基础知识。下午项目老师潘老师带领我们小组进行线下会议,主要讲解两块内容,一块是基本的框架,每个小组之间该如何分工合作,...
  • 今天终于将已做好的数据进行了汇总,并发现了许多问题。 因为YouTube的反爬策略过于严格,李想同学的进度受阻,我们在反复讨论并且尝试无果后,我将世界日报的爬取工作交给了他,来丰富我们的数据种类。...
  • 明天是暑期实训线下部分的最后一天,本来计划需要中期进度汇报,但因为学校搬迁的原因暂时取消。 我将公司后面所给的三个国外新闻网站分配给大家。因为我们马上就要回家,回家后无法进行线下交流,所以在大家回家...
  • 今天是周一
  • 今天是线上实训的第一天,组内成员的线上打卡遇到一些问题。 如:钉钉外勤打卡需要将手机里的虚拟定位和梯子全部删掉,部分同学因此遇到一些困难。还有一些同学经过回家又经历一个周末没有打卡导致上班迟到。...
  • 今天遇到数据类型不一致的问题,为了使数据格式一致便于展示,前端同学向我反映,需要将数据类型统一。 于是我去与后端的python组进行协商,将数据类型改为int,并且有些加入汉字的数字我也为他们想办法解决了,...
  • 目前为止的话数据采集爬虫已经基本写好了,还在一步步完善数据集,然后前端界面的属性展示在根据目前的数据库设计进行更改,并完成了相应的图标可视化展示。 因为指导人员想要具体效果展示,我之前让python组的同学...
  • 今日上午的主要工作是对已学习知识的熟悉和运用,Java组开始尝试vue的使用,目前还没有遇到太多困难。 中午对python组的进度以及知识掌握情况做了大致的统计,下午由公司的技术人员来为我们培训。...
  • 上午我申请了腾讯会议进行线上培训,下午申请了教室线下答疑,今日工作重点主要有 python分组细化——数据的爬取、解析、入库 共计划爬取六个网站,国内国外各三个。不同网站的布局不同,这就使得数据爬取的逻辑不...
  • 今日九时举行过项目实训开营仪式后,我们来到教室讨论项目实训议题。 自我介绍后,我们首先针对对本题目的理解进行了讨论,然后根据每个人不同的擅长领域进行了分工,本项目主要利用python和Java语言。...
  • 对爬取的B站up主信息进行画像分析 package com.sddx.system.domain; public class Bilibili { //up主ID private int uid; //名字 private String name; //性别 private String sex; //生日 private String ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,943
精华内容 1,577
关键字:

人物画像