拆书系列(五):《创业维艰》之为何要解雇高管

这里的 “高管” 我们也可以理解为重要项目中重要的人。

解雇”高管”,我们可以说他们表现糟糕,但是既然要解雇,说这些已经于是无补,事实上出现这种情况是因为自己很差劲,解雇高管是因为公司面试和整合系统出了问题,我们必须找出原因,才能避免以后这类事情的发生,可能的原因如下:

对高管的职责定位不清。

连自己想要什么都不知道,更别说招聘高管的标准了。很多时候,CEO们仅凭自己对高管这一职位不切实际的想法和主观感觉来进行招聘。这种错误的做法往往导致所招高管缺乏关键的、必要的才能。

招聘高管时,看中的不是对方的长处,而是对方没有弱点。

在进行群体面试时,这种做法尤为普遍。招聘小组往往在应聘者身上吹毛求疵,并不关注他是否具备你所需要的、作为一名世界一流的管理者的特质。因此,以这样的方式招来的高管也许没有明显缺点,但在你需要他大显身手时却表现平庸. 如果你招聘的人不具备你所需要的世界一流的实力,你的公司也就成不了世界一流的公司。

大和小庙偏招尚。

一直以来,风险资本家和高管招募人员给CEO们的错误建设是:要按高于招聘的原则招人。他们会说,“想想未来的3~5年,公司规模将会有多大”。如果公司规模很大,那么能招到一个有本事运作大规模公司的人,这当然再好不过。如果打算快速壮大公司规模,那么能招到一个内行的人也很有必要。但是,如果公司规模不大,而且你也没打算壮大公司规模,那么招的人只要能胜任接下来的18个月的工作即可。如果你要招的人在18月后才会崭露锋芒,那么还没等他有机会一展才华,公司就会将其拒之门外。因为公司其他员工肯定会心有不平:他有没有做出任何贡献,我们凭什么要给他优先认股权?这类问题会频频出现。 事实证明,风险资本家和高管招聘人员说的也有一定道理,他们只是从以前的失败中吸取了错误的教训而已。

对招聘职位一概而论。

世界上并没永远了不起的CEO、营销负责人或销售负责人。这名销售负责人的了不起之处仅限于在你的公司,在接下来的14~24个月之内。他的这一职责和微软公司或脸谱网(Facebook)的同一职位并不相同。不要招那种类型化的应聘者,这不是拍电影。

管理人员个的人抱负和公司目标相悖。

如果人员的个人抱负和公司目标相悖,就算他的才华再出众,公司也应该将其拒之门外。

没能令管理人员融入公司。

将新人引入公司并委以重任非常困难。其他员工很快会对其评头论足,该新人的期望也许和你不同其对工作在很大程度上也许并不明确。因此,在解雇高管之后,一定要检查并改进公司的人才招聘计划。

有关公司规模的特殊情况

解雇高管的一个相当普遍的理由是,当公司规模扩大到原来的4倍,高管的工作效率就会变低。因为在这时,管理工作就会变成全新的工作,每个人都需要重新定位自己,以适应新的工作。经营一家有着200多名员工的全球性销售公司和一个只有25人的本地销售团队大不相同。幸运的话,你雇来的25人团队的人也许会慢慢学会了管理200人的团队。如果不走运,你就要为新的工作任务另聘合适的人选。这既不是管理人员无能,也不是公司系统错误,这是现代社会的真实生活。不要试图避免这种情况,这只会让事情变得更糟。

有关公司快速扩大规模的特殊情况

如果你研发出一款非常棒的产品,市场也很需要这款产品,你就会发现,自己迫切希望公司以极大的速度发展壮大。要想成功实现这一愿望,除了聘用合适的管理人员之外,别无他法。所谓合适,是指这个人曾有令其他规模相当的公司迅速壮大的成功经验。请注意,这与直接继承一个规模很大的公司或以你自己的方式运行一个规模很大的公司完全不同。一定要确保你聘用的是有快速发展能力的管理者。此外,如果你还没有准备给他们大量的预算去发展他们的组织机构,那就不要聘用他们,让他们保持当前状态即可。经验丰富的、有快速发展能力的管理者对建设成功的创业公司来说非常重要,以至于招聘者和风险资本家往往还没有等公司准备好,就极力建议CEO们将他们招进公司。

  

拆书系列(四):《创业维艰》之如何解雇员工

如果非要让我说一件事情是可以让管理者水平有明显提升的事情,那就是学会解雇员工,今年我解雇了一个”伪工作者”,这件事我做的不够好,如果让我之前仔细研读了这本书,那么我相信结果或者说过程会有大有不同。

要想保持企业文化的延续性,留住最优秀的员工,我们要在裁员时采取了正确的方式。下面是我从本书学习到的如何解雇员工

保持头脑清晰

如果公司没能实现自己的财政计划,形势严重到了必须辞退那些不惜重金聘请而来的员工的地步,这对CEO而言,无疑是巨大的压力和沉重的负担。在这样的时刻,我们很难顾及未来,因为过去会将你压得毫无喘息之机,而这正是你必须要面对的。

当机立断

一旦决定解雇,那么必须尽快执行。如果走漏消息,就会横生枝节,麻烦不断。员工会质询管理者,公司是否要裁员。如果管理者不知情,员工就会认为他愚蠢。如果知情,他要么不得不向员工撒谎,令消息进一步走漏,要么保持沉默,令群情更加激愤。

对解雇的原因要有清晰的认识

不管是因为经营不善,还是员工绩效表现不佳,都必须实话实说。

对管理人员进行培训

整个裁员过程中最重要的一步就是培训管理团队。如果将未经培训的管理人员置于裁员这一极为尴尬的情境之中,他们大部分都会无法应对。

对管理人员的培训需遵循一条黄金法则:自己的员工要自己亲自辞退,不能将这项工作推卸给人力资源部门或某个更严厉的同事,不能像电影《在云端》中那样雇用一家外包公司来完成。

为什么这么严格?为什么不能找些强势的管理者出面,替你完成这一棘手任务?公司的声誉和管理人员的声誉都取决于你的表现

解雇时说话要果断,这是一次解雇行为,使用”我已经决定” 而不是”我认为”这样含糊不清的话。

向公司全体人员发表讲话

在执行辞退决定之前,CEO必须向公司全体人员发表讲话。CEO必须为管理者们解释辞退的合理性。如果这一点做得好,管理人员在辞退时就会更加容易。务必牢记财捷集团前CEO比尔·坎贝尔告诉我的一句话:话是说给那些留下来的人听的。这些人会非常关心你对待他们同事的方式。你辞掉的员工之中,有很多人都和留下来的人关系亲密,因此,你一定要给予他们足够的尊重。毕竟,公司还要向前发展,因此你必须把握尺度,不要过度表达歉意。

一定要让大家看见你,你一定要在公司出现

在向公司全体人员发表讲话、告诉大家许多人将被辞退之后,你也许会不愿意在公司里四处走动,和大家交谈,而更愿意去喝几杯酒。千万别这样。一定要在公司出现,一定要让大家看见你,一定要积极参与公司事务。

  

拆书系列(三):《创业维艰》之CEO必须实话实说

鼓励式管理造成的错觉

作为公司的最高管理者,我以为我能从容应对坏消息。但事实刚好相反,面对坏消息,我比任何人都紧张。让我彻夜难眠的事,工程师们却并不在意。毕竟,我是创办公司的CEO,是那个和公司息息相关的人。一旦发生可怕的差错,他们可以一走了之,我不能。因此,面对损失,员工们会更加冷静。

更愚蠢的是,我以为我唯一的职责就是为公司解决问题。如果我早就想明白这一点,我就会意识到,只有我一个人操心,根本没有任何意义。例如,担心这个产品不够完善,但实际上,编写代码修复产品的人不是我。

更好的办法是,将问题交给不仅有能力修复产品,而且对修复产品充满兴趣和动力的人。假如我们失去了预期的一笔大交易,整个公司必须搞清楚其中的原因,这样才能共同解决我们在产品、营销和销售流程中出现的各种问题。如果坚持将问题留给自己,那么问题就很难被解决。

为何要实话实说?

对公司出现的问题做透明化处理很重要,主要原因有三:

信任

没有了信任,沟通就会中断。具体来讲就是:

在人类的所有交往之中,沟通量与信任程度成反比

请考虑下述情况。如果我完全信任你,我就不需要你对自己的行为或其他举动进行解释,因为我知道,你所做的一切,无论什么,都符合我的最大利益。反之,如果我不信任你,那么再多的谈话、解释或说理对我都没有任何影响,因为我不相信你说的是真话

在公司里,这一点十分重要。随着公司的成长,沟通成了公司最大的挑战。如果员工完全信任CEO,沟通的效率就会大大提高。实话实说就是建立这种信任的关键。一名CEO在一段时间内拥有这种被信任的能力,往往是一家管理良好的公司和一家管理混乱的公司之间最大的差别。

参与解决问题的人越多越好

为了创建一个出类拔萃的技术公司,你必须雇用大量的精英人才。而不让这些精英人才参与解决公司最大、最棘手的问题完全是一种浪费。一个人,无论多么出色,他都无法解决自己不了解的问题。正如开源社区所倡导的:“只要有足够多的眼睛,就可让所有问题浮出水面。”

健康的企业文化就像过去的路由信息协议:好事不出门,坏事传千里

允许自由并公开讨论问题,公司才能迅速解决问题。企图掩盖问题只会令所有员工感到灰心。因此,CEO应该采取的做法是:建立一种奖励文化,而不是惩罚文化,对那些公开提出问题并为其找到解决办法的人予以奖励。

最后一点想法:只有经营过公司,你才会体验到那种巨大的心理压力,才不会过于乐观。作为CEO,你要勇敢面对压力,直面恐惧,实话实说。

  

拆书系列(二):《创业维艰》之创业中的挣扎

创业中的挣扎

创建公司之初,每一位企业家都怀揣着一个清晰明确的成功梦想。你会创造一个极其优越的环境,雇用最能干的人加入你的团队,你们会齐心协力,研发一款令客户满意的产品,让这个世界变得更美好。

为了使梦想成为现实,经过了无数个日夜的辛苦奋斗,你却发现,事情并没有按计划进行。从一开始,你的公司就没有跟上你所设想的步伐。你的产品出现了难以解决的各种问题,市场和你想象的大不相同,你的员工正在失去信心,有些人已经辞职。在辞职的员工中,有些人还是非常优秀的,他们的离去令剩下的人们开始怀疑继续留在公司是否明智。资金越来越少,风险投资家告诉你,由于近在眼前的欧洲经济危机,你的公司将很难筹集到资金。在一次竞争中,你输给了对手,失去了一个忠诚的客户,失去了一名极出色的员工。你的压力越来越大。究竟是哪里出问题了?你的公司为什么没有按预想的轨道运转?你真有足够的能力去实现梦想吗?当梦想变成了噩梦,你会发现,自己陷入了旋涡之中。

关于挣扎

挣扎是你想知道自己为什么要创办公司时的状态。

挣扎是人们问你为什么不退出,你却不知怎么回答时的状态。

挣扎是你的员工认为你在撒谎,而你却认为他们也许说得对的状态。

挣扎是你食之无味时的状态。

挣扎是你认为自己不应该当公司CEO时的状态,是你明知自己力不从心、明知无人能取代你时的状态,是所有人都认为你是白痴却没有人会炒你鱿鱼的状态,是自我怀疑变成自我憎恶时的状态。

挣扎是你在和别人谈话却听不到对方在说什么时的状态,因为你一直在挣扎。

挣扎是你想结束痛苦时的状态。挣扎就是痛苦。

挣扎是你去度假,想放松心情却使心情更差时的状态。

挣扎是你周围簇拥着一大群人,你却感到茕茕孑立、形影相吊时的状态。挣扎是冷酷的。

挣扎是违背承诺、粉碎梦想的地狱,是一身冷汗、五内俱焚的感觉。

挣扎不是失败,但会导致失败。如果你孱弱不堪,你更容易失败。

大多数人都不够强大。史蒂夫·乔布斯到马克·扎克伯格,所有出色的企业家都会经历挣扎,而且是苦苦挣扎,因此,人人都会挣扎。不过,这并不意味着你一定能挣扎成功。你也许会挺不过去,这就是挣扎的恼人之处。

挣扎是成就伟大的竞技场。

#如何走出挣扎

不要扛下所有责任。人们很容易想当然地认为,令自己烦恼的事情一定会令自己手下的人更加烦恼。事实恰恰相反。除了负有最大责任的人以外,没有人会把损失当回事,没有人比责任人更感同身受。当你无法分担所有负担时,你要将某些负担分担出去,找尽可能多的人来共同解决问题,即使这些问题事关企业的生死存亡。

这不是国际跳棋,而是国际象棋 科技行业往往极其复杂。底层技术只要一有变动,竞争就会发生变化,市场也会随之发生改变,而人们则会使出各种招术,以求自保。因此,就像《星际迷航》中下三维国际象棋一样,总有一步棋可走。你认为自己已经无路可走了吗?你觉得这步棋怎么样:作者凭着200万美元的后续收益以及340名员工的阵容带领公司上市,计划在下一年实现7500万美元的收益?作者走的就是这步棋。那是2001年,人们普遍认为,对一家要上市的科技公司而言,这是有史以来最糟糕的时机。走这步棋时,作者手头只剩下能维持公司运营6周的资金。天无绝人之路,总有一步棋可走。

只要坚持下去就有转机。在科技型竞争当中,明天和今天看起来完全不同。如果你能坚持到明天,也许就会发现,在今天看来似乎毫不可能的解决办法会赫然出现在眼前。不要过分苛责自己。公司身陷困境也许都是你的错,因为人是你雇来的,决定是你做的,而且接受任务时,任务的风险性你是知道的。每个人都会犯错,每位CEO都会犯无数错误。要正确评估自己,过分苛责自己于事无补。

请记住,这是区分男人和男孩的方法如果你想成就一番事业,这就是挑战。如果你不想,那你根本不应该开办公司

  

拆书系列(一):《创业维艰》之简介

做分公司已经快五年了 ,虽然离真正创业还十万八千里,但是从一开始做分公司的时候,我就以 “创始人” 的心态来做的,如果一开始”兴趣”和”冲劲”多一些,但是随着你经历的事情越来越多,越来越多经历一些你不曾想过的事情,你会发现兴趣或者冲劲和做好一个公司之间离着十万八千里,就拿最近一年公司的一些奇葩事情,让你对人性都有了更多的认识,这个时候,我发现作为一个公司的负责人,身上需要的修炼的品质太多了,这些包括心态、包容、冷静、激情、智慧、领导力等等,我面临着不小的压力,而一个负责人很多时候是孤独的,你的事情很难别人帮你或者思考,于是我开始读了不少书籍,**<<创业维艰>>这本书从标题上就让我找到了认同感,而且英文名是“The hard Thing About Hard Things”** 如何完成比难更难的事, 于是我就迫不及待的用了一个周末的时间读完了,下面就记录了我对本书的介绍和读书笔记。

作者简介

本.霍洛维茨,硅谷最早一批做互联网的,1999年与网景之父马克.安德森共同创立Loudcloud公司,在互联网泡沫时,多次带领公司起死回生,最后把公司16亿美元高价没给了惠普。后来有成立了风险投资公司,投资了Skype, Facebook,Instagram, Twitter, Pinterest, Airbnb等等知名互联网企业,被称为”硅谷最牛的50个天使投资人”之一。

艰难创业

书的第一部分讲述了作者艰难的创业,一开始加入网景,但是竞争对手是微软的IE浏览器,98年买给了AOL, 99年作者创办了Loudcloud, 融资,扩张,但是我们知道99年正是互联网泡沫时期,泡沫破灭后,难以融资,走途无路时,决定上市,但是上市后股价从6美元降到2美元,一系列努力让股价变好后,有来了911的事件,最后破产,LoudCould被卖掉,留下了Opsware软件,上市后估计跌至0.35,如果股价不能提到1美元,公司就完蛋了,作者经过了一些列的努力让股票回到了8美元,最终以14.25亿美元买给惠普赚取了第一桶金,随后作者和马克.安德森创办了风险投资公司,投资开头说了那些至今都依然闪耀万丈的互联网公司。

第一部分主要是创业故事,需要大家自己品读,下面我读书此书时记录的文中一些不错的文字。

  • 对于一家企业来说,真正的难题是什么呢?真正的难题并不是设置一个宏伟的、难以实现的、大胆的目标,而是你在没有实现宏伟目标之时不得不忍痛裁员的过程。真正的难题不是聘请出色的人才,而是这些“出色的人才”逐渐滋生一种优越感并开始提出过分的要求。真正的难题不是绘制一张组织机构图表,而是让大家在你设计好的组织结构内相互交流。真正的难题不是拥有伟大的梦想,而是你在半夜一身冷汗地惊醒时发现,梦想变成了一场噩梦.

  • 人们经常问我,我们两人在18年里更换了3家公司,却一直保持着极高的工作效率,这是怎么做到的。大多数合作关系要么过于紧张而令人难以忍受,要么紧张不足而缺乏效率。人们要么相互挑战,导致彼此交恶,要么陶醉于彼此的奉承之词而无所受益。就我和马克而言,即使是18年后的今天,他依然对我的想法吹毛求疵,让我感到烦恼,我对他亦是如此。但事实证明,这种方式对企业的发展有益无害。

  • 无论是谁,你的人生需要两类朋友。第一类是当你遇到好事时,你可以打电话与之分享喜悦的朋友。他的喜悦不是那种蒙着羡慕、嫉妒面纱的虚假喜悦,而是发自内心的真诚喜悦。第二类是当你身陷困境时,你可以打电话与之分担、向其倾诉的朋友。

  • 研发出好产品是创新者的职责,而不是客户的任务。 客户只知道根据对现有产品的体验来判断自己想要什么。

  • 在每周的员工会议上,我加入了一个名为“我现在没有做什么?”的议程。通常,在员工会议上,大量的时间都用来进行回顾、评估以及改进员工们所做的事情,如研发产品、销售产品、服务客户、聘用员工等。然而有时候,你没有做的事却是你真正应该关注的事。

  • 创业公司的CEO不应该计算成功的概率。创建公司时,你必须坚信,任何问题都有一个解决办法。而你的任务就是找出解决办法,无论这一概率是十分之九,还是千分之一,你的任务始终不变。

  • 人们总是问我:“当一名成功的CEO的秘诀是什么?”遗憾的是,根本没有秘诀。如果说存在这样一种技巧,那就是看其专心致志的能力和在无路可走时选择最佳路线的能力。与普通人相比,那些令你最想躲藏起来或干脆死掉的时刻,就是你作为一名CEO所要经历的不同于常人的东西。

  • 大多数管理书籍的重点都是如何正确地做事,不要将事情搞砸。但我的经验却是,把事情搞砸之后,如何深刻理解那些你必须要做的事。

  

前端开发系列之Webpack(四):常用高级特性

多个入口

接之前的例子,我们添加一个utils.js

let add = (a, b) => { return a + b; };

module.exports = add;   

然后修改 webpack.config.js 里的entry节点:

module.exports = {
    entry: ["./utils", "./app.js"],
    output: {
        filename: "bundle.js"
    }
}

随后,我们看一下生成的文件部分可以看到,我们可以有两个入口文件。

/***/ },
/* 1 */
/***/ function(module, exports) {

    "use strict";

    var add = function add(a, b) {
    return a + b;
    };

    module.exports = add;

/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {

    'use strict';

    __webpack_require__(3);

    var hello = __webpack_require__(8);

    document.querySelector('h2').textContent = hello("Jack");

/***/ },
/* 3 */

生成多个文件

entry: {
        utils:'./utils.js',
        main:'./main.js'
    },
    output: {
        path: './public/',
        filename: '[name].js'
    }   

这样会在 public目录下生成 utils.js 和 main.js

组织目录结构

之前的代码,整理一下目录

  1. 修改webpack.config.js

这里面解释几个部分

context: 就是切换当前目录,比如上面的例子,由于设置了context, 那么 ./utils.js 就是 ./js/utils.js

publicPath: 这个html里面引用js时要这样 /public/assets/js/main.js, 这个主要是为了给我们将来生产环境使用CDN用,虽然我们build到 build/js/main.js, 但我们html里面写/public/assets/js/main.js 依然能正常使用,是因为我们webpack-dev-server做了处理。

devServer:contentBase: 就是说开发的时候,我们的html页面从哪个目录提供。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var path=require('path');

module.exports = {
context: path.resolve('js'),
entry: {
utils:'./utils.js',
main:'./main.js'
},
output: {
path: path.resolve('build/js/'),
publicPath:'/public/assets/js/',
filename: '[name].js'
},
devServer: {
contentBase: 'views'
},
module: {
preLoaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'jshint'
}
],

loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: [
'es2015'
]
}
},
{
test: /\.less$/,
exclude: /node_modules/,
loader: 'style!css!less'
},
{
test: /\.(jpg|jpeg|png|gif)$/,
include: /images/,
loader: 'url'
}

]
},

jshint:{
"failOnHint": true,
'esnext': true,
}
};
  1. 调用webpack-dev-server 输出如下,仔细看里面的文字,就能理解上面所说。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    jacks-MacBook-Air:webpack-demo jack$ webpack-dev-server
    http://localhost:8080/webpack-dev-server/
    webpack result is served from /public/assets/js/
    content is served from views
    Hash: 0dfbecb06bf342b05978
    Version: webpack 1.13.1
    Time: 2350ms
    Asset Size Chunks Chunk Names
    main.js 23.8 kB 0 [emitted] main
    utils.js 1.5 kB 1 [emitted] utils
    chunk {0} main.js (main) 21.9 kB [rendered]
    [0] ./js/main.js 138 bytes {0} [built]
    [1] ./css/main.less 1.02 kB {0} [built]
    [2] ./~/css-loader!./~/less-loader!./css/main.less 315 bytes {0} [built]
    [3] ./~/css-loader/lib/css-base.js 1.51 kB {0} [built]
    [4] ./images/me.jpeg 11.6 kB {0} [built]
    [5] ./~/style-loader/addStyles.js 7.15 kB {0} [built]
    [6] ./js/hello.js 155 bytes {0} [built]
    chunk {1} utils.js (utils) 87 bytes [rendered]
    [0] ./js/utils.js 87 bytes {1} [built]
    webpack: bundle is now VALID.
  2. 相关内容

index.html

1
2
3
4
5
6
7
8
9
10
11
12
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Webpack demo</title>
</head>
<body>
<div id="aboutMe"></div>
<h2></h2>
<script src="/public/assets/js/main.js"></script>
</body>
</html>

main.less

1
2
3
4
5
6
7
8
9
10
11
12
13
@nice-blue: #5B83AD;
@light-blue: @nice-blue + #111;

h2 {
background: @light-blue;
color: yellow;
}

#aboutMe {
width: 200px;
height: 200px;
background: url('../images/me.jpeg');
}

main.js

1
2
3
4
5
require('../css/main.less');

var hello=require("./hello.js");

document.querySelector('h2').textContent = hello("Jack");

ES6 module

webpack也可以使用es6的模块

hello.js

1
2
3
4
5
6
7
let hello=(name)=>{
return "Hello "+ name +", Welcome to Webpack, I am webpack dev server";
};

// module.exports=hello;

export {hello};

main.js

require('../css/main.less');

// var hello=require("./hello.js");

import {hello} from "./hello.js";

document.querySelector('h2').textContent = hello("Jack");

使用插件

之前我们的js里使用css的话,是把css内容插入到页面之中的,但是我们想提出单独的css文件,这个时候我们就需要使用plugin.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var path=require('path');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
context: path.resolve('js'),
entry: {
utils:'./utils.js',
main:'./main.js'
},
output: {
path: path.resolve('build/js/'),
publicPath:'/public/assets/js/',
filename: '[name].js'
},
devServer: {
contentBase: 'views'
},
module: {
preLoaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'jshint'
}
],

loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: [
'es2015'
]
}
},
{
test: /\.less$/,
exclude: /node_modules/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
},
{
test: /\.(jpg|jpeg|png|gif)$/,
include: /images/,
loader: 'url'
}

]
},

jshint:{
"failOnHint": true,
'esnext': true,
},

plugins: [
new ExtractTextPlugin("style.css", {allChunks: false})
]
};

目录下就是生成了单独的style.css 而不是插入到页面中, 我们需要在页面中使用style.css

1
<link rel="Stylesheet" type="text/css" href="/public/assets/js/style.css"/>    

前端开发系列之Webpack(三):Preloaders

Preloaders

Preloader就是在调用loader之前需要调用的loader, 他不做任何代码的转换,只是进行检查。

JSHint

我们比较常用的一个Preloader就是JSHint, 对我们JS代码进行检查.

接之前代码:

  1. 安装jshint-loader

    1
    npm install jshint jshint-loader --save-dev
  2. 修改 webpack.config.jshint

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    module.exports = {
    entry: './main.js',
    output: {
    filename: 'bundle.js'
    },
    module: {
    preLoaders: [
    {
    test: /\.js$/,
    exclude: /node_modules/,
    loader: 'jshint'
    }
    ],

    loaders: [
    {
    test: /\.js$/,
    exclude: /node_modules/,
    loader: 'babel',
    query: {
    presets: [
    'es2015'
    ]
    }
    },
    {
    test: /\.less$/,
    exclude: /node_modules/,
    loader: 'style!css!less'
    },
    {
    test: /\.(jpg|jpeg|png|gif)$/,
    include: /images/,
    loader: 'url'
    }

    ],
    }

    };

  3. 指定JSHint使用es6.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    module: {
    preLoaders: [
    ...
    ],
    loaders: [
    ...
    ]
    },
    jshint: {
    esversion: 6
    }
  4. 删掉hello.js里的一个;号,然后重启webpack-dev-server

1
2
3
4
5
6
7
8
9
10
WARNING in ./hello.js
jshint results in errors
'let' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz). @ line 1 char 1
let hello=(name)=>{

'arrow function syntax (=>)' is only available in ES6 (use 'esversion: 6'). @ line 1 char 16
let hello=(name)=>{

Missing semicolon. @ line 3 char 2
}

前端开发系列之Webpack(二):Loaders

Loaders

Webpack最重要的特性就是Loaders,他的作用,就像Gulp或者Grunt里面的task, 它可以在生成文件之前对文件进行相应的转换。

ES6

ES6提供了很多优秀的新特性,在我的ES6+现在就用系列我写了10多篇介绍ES6的文章。

由于现在很多浏览器对ES6的支持还不太好,所以,我们需要使用转换器,webpack里就是loader来进行转换。

接上文的代码

  1. 我们先修改hello.js

    1
    2
    3
    4
    5
        let hello=(name)=>{
    return "Hello "+ name +", Welcome to Webpack, I am webpack dev server";
    };

    module.exports=hello;

由于Chrome已经支持了很多ES6的特性,所以我们打开Safari浏览器。

我们发现浏览器的console里输出

1
SyntaxError: Unexpected identifier 'hello'

说明,我们浏览器还不能支持let, 那么我们需要使用babel这个loader来进行转换,我们先把hello.js

  1. 安装babel loader

    1
    npm install babel-loader babel-core babel-preset-es2015 --save-dev
  2. 配置webpack使用babel-loader

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    module.exports = {
    entry: './main.js',
    output: {
    filename: 'bundle.js'
    },
    module: {
    loaders: [
    {
    test: /\.js$/,
    exclude: /node_modules/,
    loader: 'babel',
    query: {
    presets: ['es2015']
    }
    }
    ],
    }
    };

    loaders是一个数组,是webpack使用的loader的集合,上面的意思就是 使用babel-loader处理所有以.js后缀的文件,但是忽略node_modules下的。 query参数是指babel使用的参数。

  3. 然后我们Ctrl+C结束webpack-dev-server,然后再输入webpack-dev-server重启,这个时候我们看到safari浏览器已经渲染正常了。

CSS

webpack也可以很好的管理我们的css依赖。

我们安装

1
npm install style-loader css-loader

css-loader是加载我们的css,style-loader把读取到的css内容全部插入到页面中。

我们创建一个main.css

1
2
3
4
h2 {
background: green;
color: yellow;
}

在之前的webpack.config.js的loaders数组里添加如下

1
2
3
4
5
{
test: /\.css$/,
exclude: /node_modules/,
loader: 'style!css'
}

webpack对一个文件可以使用多个loader,顺序是从右向左,中间用!分开,这个类似于gulp里的pipe, 不过语法也太wired了。

完整的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module.exports={
entry: './main.js',
output: {
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: [
'es2015'
]
}
},
{
test: /\.css$/,
exclude: /node_modules/,
loader: 'style!css'
}
],
}
};

重启webpack-dev-server, 浏览器显示如下

less

现在很少有人使用css, 都会使用SASS, LESS之类的,那么我们把main.css改为main.less, 修改内容如下

1
2
3
4
5
6
7
@nice-blue: #5B83AD;
@light-blue: @nice-blue + #111;

h2 {
background: @light-blue;
color: yellow;
}

安装对应的loaders

1
npm install less less-loader --save-dev

修改main.js中 require(‘./main.css’)为require(‘./main.less’)

1
2
3
4
5
require('./main.less');

var hello=require("./hello.js");

document.querySelector('h2').textContent = hello("Jack");

修改webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module.exports={
entry: './main.js',
output: {
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: [
'es2015'
]
}
},
{
test: /\.less$/,
exclude: /node_modules/,
loader: 'style!css!less'
}
],
}
};

重启webpack-dev-server, 我们看到h2背景色已经变为#6c94be

url-loader

如果我们css里使用了url,或者js里require了一个image,那么我们就需要安装url-loader

1
npm install url-loader --save-dev 

修改main.less

1
2
3
4
5
6
7
8
9
10
11
12
13
@nice-blue: #5B83AD;
@light-blue: @nice-blue + #111;

h2 {
background: @light-blue;
color: yellow;
}

#aboutMe {
width: 200px;
height: 200px;
background: url('./images/me.jpeg');
}

修改index.html

1
2
3
4
5
6
7
8
9
10
11
12
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Webpack demo</title>
</head>
<body>
<div id="aboutMe"></div>
<h2></h2>
<script src="bundle.js"></script>
</body>
</html>

前端开发系列之Webpack(一):基本使用

在前端开发中使用构建技术已经是标配了,之前我已经写过了Gulp系列,在为什么需要前端构建我也已经讲了前端构建的必要性,相信不少人都使用过Grunt或者Gulp。

由于ReactJS, Angular2的火热,WebPack这个构建工具已经在社区中得到了广泛的认可,而Webpack已经成了React.js开发的标配,所以,我们有必要学习一下Webpack

Webpack 是什么?

官方网址:https://webpack.github.io/

我觉得上面的图可以较好的解释webpack做什么,通常我们的前端需要使用模块化来组织代码,那么管理依赖就是比较头痛的一件事,而Webpack把所有的assets都当做一种模块,然后通过webpack输出为我们需要的文件。

Webpack 使用

安装和使用

  1. 安装webpack

    npm install webpack -g

  1. 新建一个目录 webpack-demo, 然后创建三个文件

index.html

1
2
3
4
5
6
7
8
9
10
11
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Webpack demo</title>
</head>
<body>
<h2></h2>
<script src="bundle.js"></script>
</body>
</html>

hello.js

1
2
3
4
5
function SayHello(name) {
return "Hello "+ name +", Welcome to Webpack";
}

module.exports=SayHello;

main.js

1
2
var hello=require("./hello.js");
document.querySelector('h2').textContent = hello("Jack");

然后,在终端执行

1
webpack main.js bundle.js

下面是终端的输出:

1
2
3
4
5
6
7
8
jacks-MacBook-Air:webpack-demo jack$ webpack main.js bundle.js
Hash: 43eaa05d6fc827ebad1f
Version: webpack 1.13.1
Time: 104ms
Asset Size Chunks Chunk Names
bundle.js 1.66 kB 0 [emitted] main
[0] ./main.js 91 bytes {0} [built]
[1] ./hello.js 104 bytes {0} [built]

然后,打开index.html,我们可以看到页面输出:

1
Hello Jack, Welcome to Webpack

配置

上面可以看到,我们只需要调用简单的一个命令,传入对应的参数,webpack就能给我们build出我们需要的bundle.js, 而且可以很好的处理依赖。但是如果我们每次都用命令行传入参数,那么就比较麻烦,webpack给我们提供了配置的方式

webpack默认的配置文件是webpack.config.js,所以我们就在根目录下创建一个webpack.config.js, 内容如下:

1
2
3
4
5
6
module.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
}
};

然后我们在控制台输入

1
webpack

打开页面我们看到之前一样的结果。

Webpack 开发服务器

现在,我们修改文件,就需要到命令行去敲webpack命令,并且刷新浏览器,而webpack-dev-server这个包为我们自动做了这些事,首先安装webpack-dev-server

npm install webpack-dev-server -g

然后,我们输入

1
webpack-dev-server

我们打开浏览器,输入 http://localhost:8080/webpack-dev-server/index.html

随后,我们修改hello.js为如下

1
2
3
4
5
function SayHello(name) {
return "Hello "+ name +", Welcome to Webpack, I am webpack dev server";
}

module.exports=SayHello;

我们看到页面自动刷新,内容也跟着变了

管理沉思录系列(四):我们企业文化杂谈

企业文化这个话题太大,有很多学者,企业家谈论这个话题,每个人都有不同的想法,我在这方面没有什么经验,但是想基于自己目前的认知来谈谈对公司文化的感受和想法。

什么是企业文化

先看一下百度百科的定义:

企业文化,或称组织文化(Corporate Culture或Organizational Culture),是一个组织由其价值观、信念、仪式、符号、处事方式等组成的其特有的文化形象。

职工文化,也称企业职员文化,是与企业文化相对应的文化形态,职工文化以职工为本,是一种素质文化,企业文化以企业为本,是一种管理文化。

企业文化是在一定的条件下,企业生产经营和管理活动中所创造的具有该企业特色的精神财富和物质形态。它包括文化观念、价值观念、企业精神、道德规范、行为准则、历史传统、企业制度、文化环境、企业产品等。其中价值观是企业文化的核心。

企业文化是企业的灵魂,是推动企业发展的不竭动力。它包含着非常丰富的内容,其核心是企业的精神和价值观。这里的价值观不是泛指企业管理中的各种文化现象,而是企业或企业中的员工在从事经营活动中所秉持的价值观念。

反正上面的定义我是记不住,那么什么是企业文化呢? 随着这几年的不断的认识,我对企业文化有了一些自己的看法。

每个企业都有自己的企业文化

其实一个企业不管怎么样,他都有自己的企业文化,很多时候大家觉得自己所在的公司没有企业文化,其实我想说“没有文化不也是公司的企业文化吗?”,所以说不管你有没有提出“口号”,这个公司都会自发的形成一种文化,只不过这种文化大部分时候都不是你想要的。比如,人员充满抱怨,做事得过且过,这不也是一种“文化”吗?

团队活动是一种文化吗?

原来,我一直认为举行团队活动就是一种文化,比如爬山,打球,聚餐等,但是后来我觉得这个还不能算是企业文化,这个只能算是一种活动,他能够提升团队的凝聚力,因为爬山、打球、聚餐这样的事情哪个公司都可以举办。

我所认为的企业文化

我个人觉得,企业文化是一种能够让你实现目标,让你公司能够提供更好的产品或者服务的东西。

企业文化的作用

企业文化重要吗?我认为企业文化很重要,企业文化主要有一下的作用:

  1. 弘扬公司的价值观,促进公司的发展,实现公司的目标
  2. 聚集有助于实现公司目标的员工
  3. 使员工乐意为公司的发展贡献自己的汗水

如果一个企业没有企业文化,那么每个人都会有自己的文化,这个文化很难统一,这样很难一起做出优秀的产品或者提供优秀的服务。

我们的企业文化

我觉得企业文化,很难在公司刚成立的时候就建立,而是一个不断发展和完善的,应该是从员工日常工作中提炼出来的。通过这个可以影响现有或者以后新加入的人。

那我们分公司来说,一开始我一直想建立的是一种敏捷的文化,但是敏捷包含的东西太多,经过几年的实践,我发现很多新加入进来的人不知道什么是敏捷,甚至有些老员工对敏捷的理解也比较浅, 那么把敏捷作为公司的企业文化,操作起来有一定的困难。

Quality & Productivity

我们发现,要想有竞争力,我们必须要在两个方面突出 “高质和高效 (Quality & Productivity)”, 在我们专注这两个方向来建设我们的企业文化的时候,我们很多的一些好的做事方式就出来了,比如,为了高质和高效,我们采用敏捷的开发过程,我们对质量的追求就需要我们正确理解需求,减少bug, 使用测试驱动开发等。我们对效率的追求,就让我们必须学习新的技术,持续集成,使用Git、多使用快捷键等,另外高质和高效不只是针对个人,而是针对团队,那么久要求我们有较好的团队文化,比如不要团队内部人身攻击,讨论问题不要假大空:”Show me the code”.

Responsibility & Passionate

高质和高效让我们掌握了做事的方法和标准,知道了我们的目标,但是,后来我们发现光有这是不够的,如果没有责任心,光有方法或者标杆是不容易达到我们定义的标杆的,而一旦责任心下降,质量和效率都下降,即使我们使用再优秀的开发过程和开发工具。那么我们文化里就需要强调责任心,我们每个人都要有责任心,对团队负责任,对自己负责任,对客户负责任,对公司负责任。拿我们做项目来说,不是别人安排你做啥你做啥,而是你要把软件/项目做好,需要啥就做啥,比如,有的人就是看到了装作没看见就是很不负责任,所以,我们需要鉴别一个人是不是有责任心。

Responsibility 责任心

在这里面,我想说个误区,有的人觉得,钱给的越多,责任心越大,我觉得这是一个伪定义,第一,钱多少才算是多呢?第二,如果一个人的责任心根据钱的多少来计算的话,那么管理者永远都要陷入这个里面。

事实证明,钱涨一点,短期有一定的激励,最多多做一点事,但是责任心还是没有变化的。通过我的观察,那些拿1万块的人很认真负责的人,在他们拿一千块钱的时候也很认真负责。我并不是说,我们需要克扣员工的工资,我们仍然需要给员工一份相对满意的薪水,我只是说一个人的责任心不会随着钱的变化而变化,换句话说,有责任心的人一定会把接手的任何东西都尽力,如果觉得钱少,他会提出钱少,或者换一份工作而不是消极怠工或者是降低产出。

我们公司曾经辞退一个“装睡不醒”的没有责任心的人,我曾经多次花力气想叫醒他,希望他能够有点责任心,但是事实证明 你永远无法叫醒一个装睡的人

Passionate 激情

这个是我们今年才加进来的,公司项目的稳定,不少人长期做一个项目,时间长了就有点“皮”了,现有项目觉得“轻车熟路”,因此没有学习和进步的激情,其实这个世界变化很快,尤其是科技技术行业,变化和创新日新月异,新技术层出不穷,而且这些新的东西真的是进步,极大提高生产力或者服务水平,拿软件行业来说,移动的飞速发展,让原来的传统软件向移动端转移,Cloud技术的发展和成熟,极大的提高了我们的运维,大大加快的发布和升级的周期,大大节省了成本。

如果我们不保持学习的激情,我们很难提供高质和高效的服务,而我们发现那些有激情的人能够保持对新东西的关注,而且对新东西学习,新方法或者新事物投入一定的时间,这个为公司未来的业务发展做出贡献。

另外,激情可以让公司充满活力,热烈的讨论,对生活的激情比如喜欢跑步,对技术的热情,经常学习或者分享能够让公司生气勃勃,这样的公司,让任何进入公司的人不会感觉死气沉沉,感觉这个公司充满活力,充满阳光。

总结

企业文化是一种能够让你实现目标,让你公司能够提供更好的产品或者服务的东西

企业文化很重要

我们的企业文化是“高质,高效,责任,激情” (Quality, Productivity, Responsibility, Passionate)