关于“以结果为导向”的管理方式的碎碎语

先申明:我反驳“以结果为导向”的某些理由,并不代表我认为管理应该不制定目标,管理不应该有结果。 前些天与朋友聊天,聊到管理。虽然两人所处不同行业,他是保险业,我是软件开发,当聊到管理的“以结果为导向”。我的话匣就打开了。 后来,我总感觉自己思路还不够清晰,就总结此文。 首先,我们需要统一对“以结果为导向”这个概念的理解。要不,我们的讨论可能就不在同一个频道上。 我听过的最多的,对于“以结果为导向”的理解就是:我只管结果,不管你中间过程怎么做。 这个“我”,是当事人。这里的假设是,这个“我”是一个管理者。 但是,为什么呢?只管理结果,不管过程呢?我得到的理由是: 人多了,会管不过来 作为“领导”(很多人常常把领导和管理两个概念混淆),下属当然要完成领导指派的“结果”,否则,我要你做什么? 我们要鼓励员工的主人翁精神 微管理会束缚员工的创造性 我不知道, 上述的有没有统一大家的理解。但我还是要尝试接着逐一讨论。 人多了,会管不过来 对于“人多了,会管不过”这个观点,我听到的阐述是: 当你手下只有3个人的时候,你当然可以管得过来,你可以很容易知道他们上班时间里有没有干与工作不相关的事情,甚至知道他们什么时候去厕所了。 但是当你做到事业部经理时,管理4个部门,每个部门都有100个人的时候,你怎么管。 这些支言片语中,我粗鲁地认为这些言语包含以下几点假设: 管理中,“监督”工作占很大的比例 管理一个3人团队和管理4个100人部门使用的是同一套管理方式 管不过来,是因为人多 我的个人观点: 以上几点假设之间相关的,因为如果管理400人时和管理3人时的方法一样,管不过来,当然是因为人多。同时,人数不是决定管理方法的唯一因素,还有你的团队成员职能结构组成等等。 我是领导,我只管结果 我擅自将“作为领导,下属当然要完成领导指派的‘结果’,否则,我要你做什么?”这句长句抽象成:我是领导,我只管结果。这个“结果”的同义词是目标,也被称为KPI。 首先,我们得承认,某些“领导”有这个权利那样做。 接着,我从这个观点中看到以下几点假设: 下属足够做得好,怎么样都能完成我(领导)定好的“结果” 领导的工作就是“管结果” 领导定好的“KPI”就是正确的 我的观点: 定好KPI是一种能力。如果一个没有定好KPI能力的领导说他只管结果,下面的员工就只能呵呵了。 管理是有级别的,过程终究是要管理的,只不过,不同的级别,管理的过程不一样。一线项目经理手下可能有前端、后端,如果他只管结果,不管,前后端是如何协作的,他是怎么知道他们团队的工作效率的?如果连自己的团队的工作效率都评估不了,我要这个项目经理做什么?😜 所以,并不是每种“领导”都有权利说“只管结果” 我们要鼓励员工的主人翁精神 这句话的假设是: 管理过程了,就是不鼓励员工的主人翁精神 只管结果,员工才会有主人翁精神 微管理会束缚员工的创造性 这句话的假设是: 只管结果,不管过程就不是微管理了 管过程就是微管理,那么,又引申出来假设:管过程会束缚员工的创造性 微管理会束缚员工的创造性 思考这些理由背后的假设是否成立 反驳一个人的观点时,一个有效的方法就是找到他的观点背后的“假设”。所以,我尝试去找到那些理由背后的假设。因为如果假设不成立,他的理由当然也就不成立了。 以上的“假设”在不同的公司环境,结果可能不一样。比如管理中,“监督”工作占很大的比例,在软件行业,管理活动中,“监督”所占的比例当然没有劳动力密集型工厂里的管理所占比例大。不过,说回来,软件行业也有劳动力密集型的。 软件行业的过程管理 说到底,一线软件开发团队当然需要过程管理,要不,你没办法评估它的开发效率。 当然,有些人就会反驳,你制定一个目标,如果他完成了,那么不是说明效率可以吗? 我的回答是:你的假设是完成目标等于效率高,你仔细想想,这两者是等于关系吗? 但是管理到什么程度算“微”,我目前没有想到好的度量方法。不过,过去一年中,我发现使用“看板”来进行微管理,效果不错。既能管理结果(软件产品),也能管理过程(团队成员协作)。本文的目的不在讨论软件行业如何进行过程管理,所以,就不深入讨论了。 小结 倡导“以结果导向”的管理方式的人,本质上是在倡导宏观管理。其实,倡导宏观管理,就是在假设宏观管理和微观管理是两个矛盾的东西。但是,我不认为这个假设是正确的,因为我们的目标是管理好一家公司以实现盈利,总之就是要管理好,为了实现这个目标,需要进行宏观管理时,就进行宏观管理,需要进行微观管理时,就进行微观管理。我们不能因“宏观”和“微观”的概念之分而忘记管理的初心。 上述观点纯属个人理解,不一定正确。欢迎讨论。 扩展阅读:平庸的领导忙着无数小事,卓越的领导从来只管大事

2017-01-20 · 1 min · 55 words · 翟志军 Jack Zhai

一个热词推荐的简单实现

为什么想做这个东西 一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章:Redis 与搜索热词推荐,然而只写了思路。所以,就是想自己实现一个。 先上个效果图,再聊: P.S. 按四年前,要写这样的前端效果,对于我这个后台开发,还是挺困难的。而现在,简单的学了下Vue.js,再加上同事的小小指点,就搞定了。😂 热词推荐的本质 假如你预先就知道了用户输入:s、sz、shen、深这些字时,就是想搜“深圳”,那是不是说,我们只要提前将这些字放到一个Map结构中,将用户的输入想像出一个key,value就是“深圳”。 说到底,热词推荐的本质就是一个大大的Map。难点就在于如何更新这个Map,以至于让用户觉得“智能”,或觉得我们在给他们做“推荐”。 这个Map,常常被人称为“索引”。其实使用“索引” 这个名词也更准确一些。Map中的Key是不能重复的。但是我们数据结构是要求可重复的,为什么呢?因为,在系统中,s、sh、shen、深等等这些都是key,而它们对应的value,可能相同,又可能不同。举个例子: hotword:0>zrevrange s 0 10 1) 鼠蛟 2) 鼠场乡 3) 鳝鱼 4) 鳝溪校区 5) 鳝溪农场 6) 鳝溪 7) 骚子营社区 8) 骚子营 9) 驷马镇 10) 驷马桥街道 11) 驷马桥 hotword:0>zrevrange sh 0 10 1) 鼠蛟 2) 鼠场乡 3) 鳝鱼 4) 鳝溪校区 5) 鳝溪农场 6) 鳝溪 7) 首院胡同 8) 首阳镇 9) 首阳山镇 10) 首阳山 11) 首钢试验厂 仔细看到其中的不同了吗?同时,这里还有一个问题,那就是当用户输入s时,出现了10个value,我们如何给这些value如何排序呢? 为了与排序模型解耦,我们为每个value都给出一个分数score。score越大,越排前面。最终索引结构就变成了这样子: P.S. 这些score之所以都为0,是因为数据问题。 总的来说,关于热词推荐,我们需要解决以下问题: 如何存储索引的数据? ...

2016-12-31 · 2 min · 260 words · 翟志军 Jack Zhai

似乎百分之七十的人都理解错了KPI

关键绩效指标(英语:Key Performance Indicators,简称KPI),又称主要绩效指标、重要绩效指标、绩效评核指标等,是指衡量一个管理工作成效最重要的指标,是一项数据化管理的工具,必须是客观、可衡量的绩效指标。这个名词往往用于财政、一般行政事务的衡量。是将公司、员工、事务在某时期表现量化与质化的一种指标。可协助将优化组织表现,并规划愿景。 KPI是指衡量一个管理工作成效的最重要指标。注意,是管理工作成效。实现中,管理工作当然由管理者来做,也就是管理者是拿来KPI来管理自己的工作成效。同时,KPI也要选择最重要的指标,而不是什么都选 ,因为并不是每项KPI都能体现管理工作成效。 光看这个定义,似乎很多公司都把KPI理解成:“员工完成了管理者安排的工作” == “管理者的管理工作有成效”!而且,只止于此。 翻看历史你就理解我说的了:宋太宗“雄韬武略”遥控指挥军队差点全军覆没! 作为管理者宋太宗的管理工作成效应该是打赢仗,而不是军队有没有按照他的“阵图”来行军。(我又甩锅了。呵呵) 光看KPI是没有问题的,谁都想知道自己的工作成效如何,尤其作为管理者。 但,KPI的选择并没有那么简单。根据自己对KPI的理解,管理者为自己找KPI时必须做到: 管理者必须理解KPI的目标:衡量自己的管理工作成效。 管理者必须理解公司的业务目标是什么,避免为了KPI而KPI。 管理者必须知道业务指标是什么?比如500万的销售额 管理者必须知道执行哪些管理工作才能帮助实现业务指标,如果不知道,那么就需要做实验,再验证! 管理者必须知道自己有没有100%执行相应的管理工作 定义个KPI都这么难,所以,管理者不好当啊。你也看到了,我一句也没有提下属的KPI。因为下属的KPI是需要管理者与其下属共同制定的。下属对自己的管理成效本质上就是很多公司希望的“自我管理”。而自我管理的成效是没有办法量化的,作为管理者,也只能看下属的自我管理后的表象。 看到这里,相信还是有很多人疑惑,到底怎么做KPI啊。 首先申明,KPI不是制定出来的,而是找出来的。因为指标本来就存在了,问题只是你选择什么指标作为管理成效的KPI。它是一个名词,不是动词。(想起人们常常开的玩笑:你今天被KPI了吗?) 那如何找KPI呢?我的回答是:你清晰地知道你的业务目标,以及如何达到,你就自然而然地知道你的KPI有哪些了。 小结 KPI是一个名词,不是一个动词。管理者的管理成效不等于员工的100%执行。KPI本质上是自我管理,不是上级对下级的工作安排。工作如何安排,不在本文讨论范围。 抱怨KPI是没有用的,现实世界中,KPI在企业中会与企业的其它因素起化学反应,远没有本文说的那么简单。 最后,两个思考题: “如果新浪要求自己员工每天要发2条以上微博” 这条能成为新浪员工的KPI吗? “主导XXX系统(或模块)开发” 这条能成为你的KPI吗? 请停留思考,然后再看:SMART原则。

2016-12-21 · 1 min · 30 words · 翟志军 Jack Zhai

反馈机制在企业中的作用?

进入ThoughtWork后,每天都会有人向你提反馈。比如站会,你这样说会更好;你代码这样写也许会更好;你这段时间英语进步得非常快……这些反馈中,有对你优点反馈,也会对你的缺点进行反馈。 这个过程,我才发现自己以前很多没有发现的不足,某些固化的思维方式,我的视野也一下开了好多。 后来,离开了ThoughtWorks。我尝试将反馈机制带入到自己的团队。怎么尝试呢? 首先,你需要让团队成员达成共识:只有成长,我们的生活才更美好,而反馈就是在帮助对方成长。当然人们对于“美好”的理解不同,有些人觉得有钱就是美好,有些人觉得得真正学到东西就是美好。这些都无所谓。因为成长了,这些美好都会有。 接着,从自己做起。每天尝试给团队成员反馈。只要找到合适的时机及时给予反馈。举例子: 一个成员写代码时,不加思索的就上个大大的if-else,这种情况,最好马上指出,同时告诉他背后的原因。但是现实中,有时,我们需要考虑多一些,比如这个成员是不是超级要面子的,这个成员是不是团队受尊重的老员工。这时就要考虑沟通方式了。 团队中两个成员因为某件事情吵了起来。而这件事,也不是特别大的事情,也没有吵多久。这时,你就要看他们是不是还气在头。合适的时机是等他们的气消了后,再分别给他们反馈。 然后,争取每隔一段时间就每一位成员进行一次一对一沟通。沟通的内容包括生活和工作,主要是了解他们对当前工作的看法,生活上有什么需要帮忙,学习上有没有遇到困难,工作上有什么不顺心……这个过程其实是成员向你反馈: 工作安排得合理不合理? 与同事相处是否舒服? 有没有学习的焦虑? …… 《创业维艰》这本书专门有一节谈“一对一的沟通”,有兴趣的朋友可以看看。 最后,引导并指导团队成员相互之间进行反馈。 话说这里了。那反馈机制在企业中到底起到了什么作用?我不知道专业的管理行家如何回答。但是,我自己的理解是这样的: 马斯洛的需求理论,反馈能满足马斯洛的需求理论中的的安全需求(你可以和他一对一沟通)、归属需求(Leader是把他当一个团队成员来对待的)、尊重需求(尊重了他)。 人天生就是通过反馈来成长,就像小孩通过你他的反馈来调整自己的行为。而如果团队成员得到了成长,就刚好可以满足了他的“自我实现”需求。 需求得到了满足,在其中工作,当然就会快乐。 有人就会说了,员工在工作中能否找到快乐,那是员工的事。这个观点即对,也不对。快乐的确是每一个人的。但是员工毕竟是人,不是机器。 不快乐的工作,同样可以完成机械的活,像珠三角大批的工厂工人。而创造性的工作,如软件开发,做产品,不是机械完成就好了的,也不是能通过机械地堆人就能完成的。 同时,反馈带给员工的成长,会正反馈到工作中,员工工作效率高了(学习新的技术、知道更多的解决方案),我们软件开发速度及开发质量会不会提高呢? 小结 我个人认为,以上只是“反馈机制”给企业带来表面利益,它给企业的是更深层次的东西:企业相互学习、相互帮助的文化。不是说企业有了“反馈机制”就有了文化,而是说企业文化就是由这些道不清说不明的东西,通过时间一点点积累起来的。 以上是个人习得的,希望能和大家交流。

2016-12-10 · 1 min · 24 words · 翟志军 Jack Zhai

模仿京东使用Openresty+Redis做读服务

看了开涛的Nginx+Lua开发教程,很是感兴趣。所以,自己也把环境搭建起来玩。 跟开涛的不同,我使用Vagrant + Ansible来搭建(不要问我为什么不使用Docker)。这样,所有的人只要两条命令就可以搭建好了,而不需要手工一条命令一条命令打。 所谓使用Openresty来做读服务,是指Openresty直接从数据源读数据,然后渲染输出,而不经过应用服务器,比如Tomcat服务器。Openresty 是一个基于Nginx和LuaJIT的动态Web开发平台。我不知道京东是否是直接使用Openresty还是自己编译Nginx + Lua。反正,我直接使用Openresty。 本次文章就是根据开涛的教程,实现使用lua-resty-template 做模块引擎,使用Redis做数据源。我把Openresty和Redis都安装在同一台机器上,以方便做实验,当然,如果你想装在不同的服务器,只需要修改下配置就好了。以下是架构: 搭建的步骤: 安装Openresty及其相关的Openresty module: lua-resty-template、lua-resty-redis 安装Redis,启动Redis 配置Openresty,启动Openresty 写页面逻辑代码 整个步骤我都写成了Ansible自动化配置脚本。所以,你已经不需要自己搭建。所有的代码都托管在:http://git.oschina.net/zacker330/openresty-lab 。 启动方法 启动前,你必须安装Vagrant 和 Ansible 2.0+。 git clone https://git.oschina.net/zacker330/openresty-lab.git cd openresty-lab vagrant up ansible-playbook ./ansible/playbook.yml -i ./ansible/inventory -u vagrant -k >> 输入ssh密码 `vagrant` PS. ansible-playbook需要通过ssh登录上目标机器来执行我们的任务。 接下来,我们解释下代码。 Openresty的配置如下: ## 省去了一些不重要的nginx配置 http { default_type application/octet-stream; ## 省去了一些不重要的nginx配置 ## 初始化所需要对象 init_by_lua ' require "resty.core" redis = require "resty.redis" template = require "resty.template" template.caching(false); -- you may remove this on production '; server{ listen 80; server_name 192.168.8.10; charset utf-8; ## 指定 模块路径 set $template_root "/usr/local/openresty/nginx/html/templates"; location ~ \.lsp$ { default_type text/html; content_by_lua 'template.render(ngx.var.uri)'; ## 访问index.lsp,将使用index.lsp模板 } } } 页面逻辑代码 index.lsp: {% raw %} ...

2016-10-15 · 2 min · 271 words · 翟志军 Jack Zhai

商业模式与产品设计有什么关系?以媒体公司为例

大概一年前,我做了产品负责人——负责产品的所有。其中一项最重要的工作:产品设计。 产品设计是以前我从来没有做过的。怎么办呢?除了,在网上了解别人怎么做外,自己还找了一些书来看,比如《谷歌和亚马逊如何做产品》,《启示录——打造用户喜爱的产品》,张小龙的文章,张小龙推荐的《乌合之众》……从这些书中,的确学到一些产品设计上有用的东西,但始终都是隔靴挠痒,不得其法。 而后,想到公司终究是要赚钱的,我们做产品的意义大部分就是为赚钱。而看到的文章或书,鲜有谈论产品设计时,如何赚更多钱的问题。在现实中,我表达出这样的困惑,但是常常得到的答案就是,你先做好产品再想这个问题好吧;产品都没做好,就想着怎么赚钱…… 商业模式是什么? 我无力反驳,也没有人给我指导,自己又想不通(时间也不允许),就只能找书来看了。关于如何赚钱的书,抽象一些就是“商业模式”的问题,就找到了《商业模式全史》。 而这本书首先给我们讲了什么是商业: 把采购或生产出的价值提供给他人,以换取同等的价值 而商业模式: 这些要素的组合就是商业模式 我从中总结出: 产品设计的过程,始终需要想清楚,你的产品提供给用户什么价值?是通过采购的,还是生产出的? 我想到开源中国的友商,像开发者头条、掘金,属于通过生产(用户生产内容)为用户提供高质量的内容,像凤凰网这类综合传统媒体则是官方生产内容,都是生产出的。 采购的例子,可以是类似简书、CSDN的签约作者,从这些作者采购高质量的内容。 媒体公司到底怎么赚钱,广告还是付费内容? 可,还是老问题?我们怎么以换取同等价值——赚钱?我们为什么要免费为广大用户采购和生产高质量内容呢?想想以前人们想要高质量的内容都要自己掏钱买杂志的。 《商业模式全史》说到90年代发起的一个商业模式:广告模式,来自美国的哥伦比亚广播公司。免费播出节目,然后吸引广告主投放广告。是不是想起央视?还有早上地铁上免费但但满是小广告的报纸? 最近两年出了一种传统广告模式的变种:百度百家的广告分成稿酬模式。也就是百度的广告赚钱了会和作者分成。(思考题:知乎应该算是高质量的内容社区,为什么他们现在还没有大量投放广告?) 这下,我终于明白了。开源中国社区本质上和广播公司一样,也是一家媒体公司。 媒体公司除了靠广告赚钱,还可以像《男人装》、罗胖的得到APP那样做付费内容赚钱。 媒体公司的两种商业模式: 广告模式 付费内容 那你到底采用广告模式还是付费内容呢?要看你的用户群体和你的内容价值。我自己画了图,以方便大家理解。 而内容价值这个容易产生歧义,我解释下: 用户对内容的渴望度和稀缺度决定了内容的价值。用户对内容的渴望度和内容的稀缺度同时高,内容的价值才会高。 这里举个例子:1953年创办的《花花公子》杂志。2016年开始在找买家了。我猜其中一个原因是不是因为人们对其内容的渴望度降低,而是稀缺性变低了。不是么,路边摊随随便都可以买到满足欲望的片子。 说回正题,商业模式也会有创新,将来说不定又会出现第三种商业模式。 用户体验为王,就可以赚钱? 很多人说产品时,上来就说:用户体验为王,用户爽了,我们自然就会赚钱。 其实,不说商业模式,只说用户体验,就是耍流氓。去过中国政%府办事的人都会吐槽政%府办事效率低(用户体验差),但是你没有办法啊,吐槽后还是必须和他们打交道。政府有垄断性资源,人家根本不需要考虑用户体验。 内容为王 最最后,你会发现,所有的媒体公司的赚钱方式都是围绕内容,不论你使用哪种商业模式,亦或两者结合。互联网只不过是渠道。知乎不是也出Kindle格式的付费书吗? 那么,我们在做产品设计,甚至运营时,都应该从内容本身出发,比如你这套积分系统的设计是否有利于网站得到更多优质内容、你的运营策略是否有利于留住那些生产高质量内容的人等等。甚至,我们的设计师也可以根据这点来考虑button放在哪个位置更吸引人生产高质量内容。 好,现在我们总结出第二个关键点: 媒体产品都是围绕内容来做,不论什么商业模式。 问题是什么? 好了,最后,回到我们的问题:商业模式与产品设计有什么关系? 我的回答: 产品必须根据现有或将来的商业模式来设计,否则产品只是功能的堆砌。 我能想像到有人会反驳我:你看Facebook一开始时不也没有谈商业模式吗? 我想说,一开始时,你可能是凭自己的兴趣爱好来做产品,可能是为了解决自己的小问题。但是当你成立了一家公司时,你不得不考虑如何养活一家公司时,你不可能不考虑商业模式了——如何赚钱。 小结 这些都是自己个人的总结,不一定对,希望好心人斧正帮助我成长。谢谢。

2016-09-15 · 1 min · 43 words · 翟志军 Jack Zhai

如何在半小时搭建一个简单的日志分析平台?

人们常常说数据如金,可是,能被利用起的数据,才是“金”。而互联网的数据,常常以日志的媒介的形式存在,并需要从中提取其中的"数据"。 从这些数据中,我们可以做用户画像(每个用户都点了什么广告,对哪些开源技术感兴趣),安全审计,安全防护(如果1小时内登录请求数到达一定值就报警),业务数据统计(如开源中国每天的博客数是多少,可视化编辑格式和markdown格式各占比例是多少)等等。 之所以能做这些,是因为用户的所有的行为,都将被记录在nginx日志中或其它web服务器的日志中。日志分析要做的就是将这些日志进行结构化,方便我们的业务人员快速查询。日志分析平台要做的就是这些。 说完这些,你是不是觉得日志分析平台很难做,需要十人的团队加班几个月才能完成? 自从有了Elasticsearch、Logstash、Kibana,俗称ELK,小公司也可以很轻松地做日志分析了。说白了,1天几G的日志,ELK完全可以吃得消。就像标题说的,只需要1个人半小时就可以搭建好了。前提是你已经熟悉了Ansible。下文也假设你已经熟悉Anbile,如果不熟悉可以看看我的另一篇文章:Puppet,Chef,Ansible的共性 本文目的就是教你如何在搭建一个日志分析平台的雏形。有了这个雏形,你可以慢慢迭代出更强大,更适合你业务的日志分析平台。同时,提供可执行的源代码:OSC-AdCenter 简单日志分析架构图 我做了简化,架构图中的每个组件都可以分别放到不同的机器。这里简单介绍下这些你组件: your app:你的应用,我们的源码中,把这个给省略了 Openresty:基于Nginx的Web开发平台,你可以想像它基于Nginx做了很多扩展,类似淘宝的Tengine。为什么我们不直接使用Nginx呢?因为在Openresty上,我们可以做更多事情。 Logstash:日志收集,结构化数据后,push到Elasticsearch中,基于JRuby。可使用其它日志收集工具替代,比如Beats Elasticsearch:分布式搜索引擎,基于Lucene Kibana:用于可视化数据,基于NodeJs 日志分析平台开发所需要工具 Ansible 2.0+:简单的自动化配置工具,运维工具。关于自动化配置还有什么好说的呢? Vagrant:操作系统虚拟化工具,开发时使用。如果没有听过,Docker总听过吧。这家伙就和Docker完全类似的功能,也早于Docker出现。 一个简单的支持yml格式高亮的文本编辑器,比如Atom 自行下载JDK8:jdk-8u66-linux-x64.tar.gz放到项目路径:provision/roles/jdk8/files/jdk-8u66-linux-x64.tar.gz P.S. 抱歉这个的确需要你自己下。 什么?不用写代码吗?的确不用需要写。如果你要扩展这个雏形就会需要写一些脚本。 启动一台服务器 因为我们需要在本地开发好以后,再部署到生产环境,所以,我们需要一台服务器用来做实验。用Vagrant可以在你的开发机上虚拟化一台。clone 下 OSC-AdCenter后,进入项目目录执行:Vagrant up 文件Vagrantfile有描述这台机器的配置: Vagrant.configure(2) do |config| ANSIBLE_RAW_SSH_ARGS = [] machine_box = "trusty-server-cloudimg-amd64-vagrant-disk1" machine_box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box" config.vm.define "oscadcenter" do |machine| machine.vm.box = machine_box machine.vm.box_url = machine_box_url machine.vm.hostname = "oscadcenter" machine.vm.network "private_network", ip: "192.168.4.10" ##指定这台机器的IP,只能宿主机能访问 machine.vm.provider "virtualbox" do |node| node.name = "oscadcenter" node.memory = 4048 node.cpus = 2 end end end 更多关于Vagrantfile:https://www.vagrantup.com/docs/vagrantfile/ Vagrant机器的默认账号密码都是: vagrant,所以你可以使用ssh [email protected]登录这台机器。也可以使用vagrant命令登录,在Vagrantfile所在目录下执行:vagrant ssh oscadcenter。 部署日志分析平台 在你的开发机上,安装好ansible: 服务器准备好了,我们只需要一条命令就可以部署OSC-AdCenter了: ansible-playbook ./provision/playbook.yml -i ./provision/inventory -u vagrant -k 然后输入ssh登录密码:vagrant。 简单说明: ansible-playbook是ansible的一个命令 ./provision/playbook.yml是描述你的服务器配置的文本,你可以想像成所有的部署脚本都写在这个文件中 ./provision/inventory是服务器在playbook在的host与ip的映射表,比如playbook中这么写: ...

2016-09-10 · 1 min · 179 words · 翟志军 Jack Zhai

关于自动化配置还有什么好说的呢?

最近我们团队正在将生产环境的配置进行自动化。简单地说就是使生产环境在任何地方都可以快速的搭建起来,比如程序员在自己的机器上,公司内部的机器上,还有云上。 本文就是想阐明为什么要自动化配置。 进行配置自动化的这个过程,我发现,问题不在于程序员懂不懂Ansible、Chef、Puppet这些自动化配置工具的使用。 问题在于对“配置”本身的理解。我甚至发现还有运维人员也不能理解为什么要将配置自动化。 配置是什么? 很多人都将搭建Tomcat、Nginx这类脚本理解成一个个“任务”。这类脚本还不能被称为“配置”。 而这类Tomcat、Nginx的安装脚本大概是这样: apt-get install build-essential apt-get install libtool cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.34 ./configure make make install ..... 脚本来自:http://www.nginx.cn/install 运行这类脚本时,大脑里的概念是:我要“安装”Tomcat、Nginx。这类脚本被当成“动词”存在。也就是说在面对一台机器时,我们的思维方式是:我要写一个if来判断Tomcat是不是已经安装,如果没有安装,就是执行apt-get install,blabla…… 但是,现实的自动化配置工具Ansible、Chef、Puppet告诉我们,自动化配置的脚本更应当充当机器环境的状态的描述文档。也就是面对机器时,我们应该使用“形容”词。什么意思呢?来几个配置体会下: Ansible: # ./ansible-nginx/tasks/install_nginx.yml # 使用这个7-0.el7版本的yum包 - name: NGINX | Installing NGINX repo rpm yum: name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 当前机器的nginx的状态应该是最新版本 - name: NGINX | Installing NGINX yum: name: nginx state: latest # 当前机器的nginx service的状态应该是已经启动的。至于如何确保nginx这个service是如何启动的,我们不需要关心。 - name: NGINX | Starting NGINX service: name: nginx state: started 配置来自:https://www.nginx.com/blog/installing-nginx-nginx-plus-ansible/ ...

2016-08-12 · 1 min · 119 words · 翟志军 Jack Zhai

老翟书摘:《50大管理难题解决方案》

初做管理,想快速成长,而不想只依赖磨时间来带动“管理”的能力成长。所以,找到此书。 我期望从这本书中弄清楚的是管理过程中,到底会遇到哪些难题,以及别人解决这些难题的思路是什么样的。很幸运,这本书没有辜负我。 以下是书摘: 管理者,是不可能花大量时间去查阅几百本书之后再下决定 商业界却比以往任何时候都要复杂和扑朔迷离,管理者需要在更短的时间内对不同的观点和建议做出判断。但是他们通常工作繁忙,日程紧张,不可能花大量时间去查阅几百本书之后再下决定,他们需要的是马上就能帮助解决问题的答案或思路。 管理者,每天都有各种问题等着做决策,不论是自己的还是别人提出的。而且,还会面对有不少问题是之前从来没有想过的,也需要做决策。 这里并不是在抱怨做管理需要不停地做决策,心累。而是要说明,1. 管理者需要有一些原则来指导决策;2. 管理者平时就需要多思考,必须提前对自己提问,而不是等到问题出现再去考虑;3. 管理者必须有能力对问题进行抽象、分类。 其实我们自己在写代码时,也会不停地做决策。这个类要怎样的命名,这段逻辑到底要不要抽出来等等。编程时的决策大多已经有前人总结出来,只要你多学习前人经验+自己勤思考,基本上也就能成为合格的程序员了。但是管理不一样。很多问题,是必须你即时做决策的,比如员工当面向你提出离职,没有时间留给你查资料后做决定。那么如何才能更即时地做出更正确的决策呢?这个没有答案的问题,我自己是这样看的:很多能力是可以通过练习的方式习得的,在你还没有成为管理者的时候,应该向你的管理者学习如何管理并对其管理方式进行抽象。当然,我不是说你不学编程了就一心只学编程。就像我自己学开车,我不是一开始就找个驾校,而是抓住很一次坐车的机会,向司机学习,同时看着司机开车,自己在大脑里预演自己应该如何开车。 管理难题的分类 书中是对管理难题这样分类: 员工层面的难题 团队层面的难题 来自外界的难题 冲突带来的难题 变革中难题 权力、政治和影响力带来的难题 涉及自己的难题 其实,这和你自己当前所在岗位有关。如果你只是一个小小的PM,通常你只会遇到员工和团队层面的难题,涉及自己的难题除外。但是这并不妨碍你,看到公司中有变革中难题时,向那些真正遇到这方面问题的人学习。我想这就是这个分类,对我们这些小PM最大的益处。我甚至从上几家公司学习如何劝一名员工不离职。 员工层面的难题 最常见的管理难题通常与团队中个人的需求相关,这些个人需求之所以会变成管理难题,原因在于管理者宁愿解决和工作任务相关的问题,也不愿处理一些有关自我认知或照顾他人感受的问题。 成功的管理者既能意识到这些问题,也有能力解决它们。不管是个人缺乏动力、缺乏信心或者是个人能力不足,这些都是团队或组织沉重的负担。 每位管理者还必须有能力与员工就棘手的问题进行交流,不管是员工出现了个人变动,或者他们需要得到企业的关注,还是他们做了不可接受或进行了破坏性的行为,你都必须能够开启那些具有挑战性的交流,或者当问题反映到你这里时,你要能够对其做出积极的回应。 员工层面可能会遇到的难题: 缺乏动力 缺乏信心 能力不足 虽优秀但“难伺候” 授权与放手 …. 相信每个管理者都遇到过千奇百怪的,比如员工的家人说做IT不好,然后这个员工最离职了。 遇到员工层面的难题,如何分析呢?我个人从书中总结出的: 出问题是团队新成员,还是老员工?出问题前是这个人是怎样的:有没职位上的变动,能力能否胜任当前工作,有没有新人加入,他和其他团队成员的关系怎么样等等;企业环境是怎样的:公司最近出了什么政策,公司的薪资水平是否有调整等 但是这些毕竟是你自己猜想。所以,处理员工层面的问题(其实也适用于处理每个层面的问题)最重要的事情就是:沟通,沟通,沟通! 团队层面的难题 如何有效管理团队并让团队发挥最大功效是管理者要应对的最大也是最常见的管理难题 很多人将发挥最大功效等同于压榨。我个人想法是大家对于发挥最大功效的理解不同。在体力工作年代,产出的物件越多,就是量越大功效越大。但是知识工作则不同,知识工作不是量越大,功效越大。因为你根本无法度量“知识”这个东西,多大量才算大功效呢?一个月生产了10个ERP软件就算功效大?真实场景是一个月只需要生产一个ERP,然后由销售卖出10个。 对于知识工作,是否是压榨?取决于自己是否在做重复工作。比如你工作3年了,每年做的工作都是一样的,那么,你就是自己压榨自己!你不学习,你就不能胜任新工作,毕竟学习是自己的事。 反过来,作为技术管理者,我们应该思考,什么才是技术团队的最大功效? 权力、政治和影响力带来的难题 在企业生活中,所有东西都带有政治色彩,这是因为总是有公开的或隐藏的组织意图与公开或隐藏的个人意图交叉在一起。这些意图通常并非一心为公,更多的是为了一己私利,队员们追求的是对自己、自己所属团队或部门有利的意图,而非无私地追求企业、企业的客户和顾客有利的意图。 刚毕业时感受不到这些“权力”、“政治”带来的难题,但是随着年龄增长,慢慢就发现真的就是那样:即使两个人公司也会存在政治。 带来的思考是“政治”这个东西在什么环境是好的,什么环境是坏的?如果无法消除这种“私心”,那么如何把企业的利益和员工的利益相结合呢?这本书没有回答。但是另一本书叫《联盟》的书,也许能给我们答案。 总结 整本书最关键的是带给我们一种解决问题的思维方式。书中没有直接说明这点。什么思维方式呢?当我们面对管理上的难题时,可以这样思考: 首先,想一想 确定行动思路 想什么呢? 想清楚问题到底是什么? 事实有哪些? 理清相关者背后的利益关系 听取当事人的想法 如何确定行动思路?这点,书中倒是没有很好的抽象,只是告诉你怎样做。也许这方面就真的依赖于经验了。 在“涉及自己的难题”这一章开头: 管理者面临的一些最大挑战实际上并不是和其他人相关或者与技巧和能力方面的要求相关。这些有形的挑战他们往往都能处理好。对很多管理者来说,最大的挑战是更加无形的,通常都与自我意识有关。有些挑战看起来似乎是直接针对你个人的,并不是以职业身份发起,而是以个人的名义发起的,对于这样高度私人化的难题,你该怎样做出最佳回应? 自我意识有助于你应对那些针对你个人本身的难题,因为它让你清楚地明白自己是谁以及在做什么。如果你了解自己,就知道什么是重要的,知道自己喜欢怎样工作以及怎样和别人打交道,知道自己作为个体的优势以及哪些方面还有待改善。 唯有自己真正强大了,难题也就不存在了。 思考题 公司有些福利政策,但这些政策依赖于个人自觉。如果出现了不自觉的情况,你如何管理?比如灵活的上下班机制,起初是考虑到大家如果真有事或住得远,可以晚到一会。但是慢慢会变成了每天必须晚到。如果你是管理者,你觉得这类问题是问题吗?为什么? 题外话 有时我会和别人讨论这些管理问题。但常常得到的回答却是:你不知道“不在其位,不谋其政”吗? 想必看这篇文章其中一部分读者也会这么想。我的个人观点是:机会都是交给那些随时准备着的人的,在做好你当前工作的同时,多思考一些,等机会来的时候,你就不会失去机会。 老翟书摘说明 书摘内容完全来自原书,如果原书的作者或出版商觉得我侵权了。请通过开源中国 @翟志军 联系我。 老翟书摘旨在通过一种书摘的方式让大家花最少的时间了解一本书,从而决定要不要继续读下去。书摘的每一本书都是本人亲自读过并理解的。

2016-07-20 · 1 min · 69 words · 翟志军 Jack Zhai

性别字段存储时应该使用的字符串,还是数字?

在我和同事结对时,发现数据库中多个表中,分别都会有gender这个字段。比如A表,B表,C表。这三个表中,gender字段都是int类型。但是同一性别,在各个表中的值是不同的。比如A表中,1代表男,在B表中却代表了女,在C表中代表未知。 我突然意识到这背后存在更大的问题。从而引发我对“性别字段存储时应该使用的字符串,还是数字?”这个问题思考。也许已经有前辈思考过这个问题并写在某本书的某页,如果有,请告知。谢谢。 0代表女,1代表男 首先,你可能会问,对于这样的问题还用想吗?不是都使用数字吗?0代表女,1代表男。 其实,淘宝就是这么做的: html代码是这样的: 这时,我会问如果这个用户没有填写性别信息呢?那你可能将原来的实现改成0代表空,1代表男,2代表女。我提醒你,当你开发的是一个大型网站时,你要将原来的“0代表女”改成“0代表空”,不会那么容易。历史数据要处理。你还需要修改所有用到0,1的代码,即使你使用的是常量代替而不是魔法数字,也不会容易到哪里去。 有经验的程序员 是的,有经验的程序员写代码时,一开始就会想到这个问题,所以一开始就设计“0代表空,1代表男,2代表女”。从前端到后端都统一使用数字。比如: class User{ final static int GENDER_NULL = 0 final static int GENDER_MALE = 1 final static int GENDER_FEMALE = 2 int gender } class UserController{ void saveUser(int gender) } <div>gender: #if($user.gender == 1)男#elseif($user.gender == 2)女 blabla….</div> 当然前端这样写有些难看,那我们使用宏来代替,比如<div>#displayGender($user.gender)</div>。这里我想留一个疑问:如果想国际化呢?你的displayGender怎么实现的? 实习生来了 某天公司招来了一个实习生要实现一个活动申请表页面。领导觉得这个功能应该不难,所以就将这个任务分配给他。他为了表现自己,哐啷哐啷很快就写完了,还得到了领导的表扬。但实习生根本没有参照前面有经验的程序员的写法(有时不是他的问题,可能是没有人告诉他需要参照某个功能的写法来实现)。有意识一些的实习生还知道将gender的值写成常量,没有意识的,可能你只有去到前端页面看源码才能知道0, 1分别代表什么。 class ActivityApply{ final static int GENDER_MALE = 0 final static int GENDER_FEMALE = 1 int gender } 如果他没有参照前面有经验程序员的写法,我不确定他是否会重用那个前端宏。所以,讲到这里,你应该明白,有时你设计好的“重用”,并不一定会被重用。为什么呢?:P ...

2016-04-15 · 1 min · 187 words · 翟志军 Jack Zhai