今天我们应该如何做技术招聘?

转自36kr

这个世界上有两种人,程序员和非程序员;这个世界上有两种招聘,技术招聘和非技术招聘。

终有一天,技术招聘会从招聘中分离出来,成为一个独立的行业。因为平时招聘用的那些招数用在程序员身上半点作用没有。不信你去招聘网站发个启事,一周后看看收件箱,除了荒废了四年以为PHP是P2P高级版本的大学生和把你公司所有职位全都投一遍的灌篮手,还能有什么?还有要给你公司做午饭的?喂喂,58同城可不算招聘站。

如果你想找到好的程序员,那么你需要理解他们的想法先。

优秀的程序员不需要找工作

是的,都是工作找他们。他们每天接的电话里除了快递父母蓝朋友,最多的就是猎头了。这就是为什么你在招聘网站上找不到他们——连猎头他们都不鸟,你还想他们去招聘网站上看你那千篇一律的职位说明?技术招聘已经是一个完完全全的卖方市场,收起“老子花钱雇你”的那份高傲,把心态摆正吧,这年头硅谷的程序员都有经纪人了亲。

钱很重要,但更重要的是成长和空间

越是优秀的程序员,越能意识到自己的局限,越是渴求一个能得到快速成长的机会。或者是操纵成百上千台服务器的快感;或者是能独当一面、将自己的伟大想法付诸实现的空间;或者是能抛开一切深入系统内核的潜心修行;或者是千万在线数亿PV而纹丝不动的成就。他们不怕挑战,他们怕没有挑战。钱当然越多越好,但是在成长空间面前,那只是个Bonus。

OK,只有明白了这些,你才能做好技术招聘,下边是一些具体建议:

别指望他们来找你,到程序员在的地方去找他们

技术社区是程序员扎堆的地方,国内的论坛可以找对应的招聘版面,发布点招聘启事;去Github和Stack Overflow搜索你要招聘的职位用到的技术关键字,把相关用户里边最好的人找出来,试着联系他们。如果是比较底层的技术方向,邮件列表也是充满潜在目标的地方。

请把招聘启事写具体

别直接用HR给你的职位说明书格式,把职位具体化。就像介绍一个妹子,是端庄优雅的大家闺秀,还是清新可人的小家碧玉,要把特点写清楚,千万别就四个字:女的活的。你们公司用什么框架开发,集群的规模有多大?职位的挑战是什么,最近计划尝试什么新技术?把吸引人的地方突出出来。常见问题直接写上,不要等人问,如果一定要让人问,留几个技术上的悬念,只给来面试的人解答。

好好介绍你自己和团队的环境

如果你是招聘职位的直接主管,请详细的介绍你自己。没有人愿意跟随一个中庸无能的主管,这个时候不需要低调,把你那些Github上被人fork了成百上千次的项目列出来;把你那个积累多年的技术博客贴上。一个视野开阔、思维活跃、技术过硬、为人靠谱的直接上级可以打消求职同学很多方面的顾虑;而一个每天下午不允许开会的团队,会吸引很多习惯深度思考的程序员。

如果你不会技术,那么把你们团队里边会技术的牛人写上。

善用微博

别光留个邮箱,留下你的微博。要知道你面对的是非主动求职者,微博能更好的展现你的能力和风格,说不定在浏览你微博的时候,他就被一个细节打动了呢?就算没有,你也能多一个粉丝嘛。

从长远的角度讲,用好微博意义重大。平时看到的技术资料,别光放到书签里边藏着,试着多分享出去。学习新技术时遇到的坑、吃过的苦要总结下来,同时共享给大家。分享的时候别忘了提醒大家关注你的微博。这些天然形成的弱关系是你不可多得的财富,当你需要招人的时候,往往能带来意外的惊喜。顺便说下,我的微博ID是@Easy :D

做活动要投其所好

现在招聘肯定是要发微博求转发的,送奖品也已经是常规了。这里给点奖品选择的建议,如果资金充足,尽量搞点新发布的国内花钱买不到的东西,比如Google Glass。当然up手环、树莓派之类Geek向的东西也会受欢迎。如果要高性价比,那就送技术书吧,根据我们的观察,送书的转发率能比送抱枕雨伞充电宝之类小礼品高出去2倍。选点最新的、程序员们都还没来得及买的书;最好不是针对单一语言的,因为Java程序员很少会对《PHP高级编程》表现出兴趣。

学会使用新工具和新社区

随着技术招聘变得越来越重要,国内外也开始涌现出了很多专门针对此领域的工具。

我特别看好的是Developer Auction(developerauction.com)。它是一个程序员“拍卖”平台:程序员提交自己的简历申请加入,然后选择好自己喜欢的几家公司同时进行在线面试;最后程序员可以在给出offer的公司中选择自己最满意的。但它不对国内开放,同时企业还是要缴纳一笔费用给Developer Auction的,这对招聘方来讲不算是好消息。

于是五一假期我和几个朋友一起做了一个微信公众号应用,叫做快简历(kuaijianli)。

它和Developer Auction很类似,但将面试流程保留在了线下:程序员可以同时选择多家公司的主管,在线发送自己的简历;而收到简历的主管们要赶紧联系到求职者,安排面试并说服他们加入自己公司。这样实际上是一种变相的竞拍,求职的程序员只需要做选择题而不再是判断题。

对于招聘的主管来讲,只要发布一次职位需求,就可以源源不断的收到简历,而这场永不停息的拍卖会是完全免费的。我们上周刚刚开放了技术主管的申请,招人的同学不妨加微信试试。

如果你需要找不是领工资的程序员,而是一起创业的技术合伙人,那么可以试试专门定位于此的缘创派社区(ycpai.com),除了可以在线交流外,他们每个月在车库咖啡还有一次线下的活动,可以很真实的接触到很多有创业意愿的程序员。

良好的源代码控制管理十戒

转自IT瘾投稿

我还没有见过比源码版本控制这样跨任意编程语言更基本的工具。 这是我们用过的最基本的工具,是很多开发团队的生命线。 那么,为什么我们经常会用错呢? 为什么一些真正的核心,版本控制系统的基础往往知之甚少?

我总结了10个实践 或“戒律” – 这通常是发生故障或错误理解的开始, 是与版本控制产品和编程语言无关的。 我会从Subversion和.NET挑选一些例子,但它们广泛适用于其他技术。

  1. 如果还在使用VSS,马上停手

平心而论,在1995年VSS曾是一个伟大的工具。  不过因为有了像Subversion甚至分布式的如Git和Mercurial工具变得黯然失色。 很多年前微软已经明确表明废弃它了!

由于一系列的重大缺陷,VSS曾受到广泛的几乎一致的鄙视, 俗称为微软的源代码破坏系统 。

  2. 如果源代码没有处在版本控制,那等于还没有

每天重复此咒语 – “进步的唯一标准是工作代码处在源代码控制中”。 直到你的成果出现在源代码控制里 – 变成源控制库中的项目 – 否则它根本不存在。

当然,你已经把代码做好在本地计算机上的某个地方,但,对其他人来说这不是真的做好了,对吗? 他们不能拿到你的版本,他们不能合并他们的修改,你无法部署它(除非你部署出错 ),一旦发生硬盘损坏你将永久丢失这些文件。

你要保持除非提交否则根本还没有的心态,一大堆的其他良好的运作因为没有提交开始陷入困境。 你应将任务分解成更小的单位,这样你可以原子地提交。 您应频繁地整合,保证自己不受本地硬件故障的影响。

但更重要的是(至少对你的团队领导来说),你证明你实际做了东西。 燃尽图曲线下降或分解列举任务列表是很棒的,但他们真的顺畅吗? 除非这些与工作源码控制中的工作代码关联上,他们才意味着完成。

  3. 尽早提交,频繁提交,越快越好

继续上一点,只有这样,才能避免“幽灵代码” -那些只有你可以在你本地计算机上能看到的代码-要尽快地尽早地频繁提交到VCS版本控制系统里 。 上面提到的是应尽早和经常的完成提交,但其中有几点可以使你的工作方式有意义:

1,每个提交的修订版能给你一个回退的位置。如果你完全搞砸了,你想回滚一个小时的变化还是一个星期的吗?

2,合并噩梦的风险不会显着增加。合并从来就没有乐趣。 当你几天没提交代码时,你突然发现到你已经与其他人的变化有50个冲突,你肯定不开心。

3,它会强迫你将功能隔离在分散的工作单元。比方说,你已经有了一个3人天功能需实现。 通常,因为他们想试图整个地构成一个逻辑单元直到这段时间结束才提交。 当然,像这样大的一个任务不可避免地由小规模,分散的功能组成,频繁提交迫使你识别这些原子小任务,然后逐一地完成它们提交给VCS。

当你以这种方式工作时,你的提交历史形成一个有规律的模式,每天多次提交。 当然,并不总是保持这样不变的模式,有时我们停止开发和重构进入测试阶段,或任何其他中断正常的开发周期的活动。

然而,当我看到一个独特的 – 甚至整个项目,在一个正常的开发周期,有整天甚至很多天什么没提交,我很担心。 我很担心是因为根据之前提到的,没有可衡量的工作已经完成,但我也很担心,因为这通常意味着出问题了。 这意味着,开发像“沸腾的海洋”那样进行(例如,试图一次做所有事情),或根本没有任何价值的事情在发生,因为在所有的人都阻塞在一个问题上。 无论哪种方式都是错的,源代码控制系统正打了个大红色警告。

  4. 在提交之前,请务必检查您所做的更改

提交代码到源代码控制系统是很容易的 – 太容易了!无论如何,你总算了结了变更和提交了文件。 “在项目的根目录有一个变更地方 – 快 – 提交了!”

可能会发生一件或两件事情:首先,人们在不经意间上传了一大堆的垃圾文件到存储库中。 请看类似下面的窗口,点击“全选”和确定 – 库不应该被某些文件如调试Debug文件夹和其他垃圾污染了。

其次,提交文件经常不检查他们实际上已经改变什么。 例如在本地开发一次性修改的配置或项目定义文件,这使得它很容易在不经意间被放到资料库,原本不打算提交的,当然,他们很可能被其他开发者获取。 你真的能记住你改变了这个配置文件中的东西吗?

解决方法很简单: 在提交之前你必须检查每一个变化 。 这听上去很容易,可使用很多版本系统实现的“忽略”功能,在很大程度上缓解“无意中提交文件”问题。 你不想提交Thumbs.db文件,只要忽略它,还有 你可能不想要提交的每一个变更文件!

你经常想知道文件哪个地方修改了,为什么又提交Web.config文件?你可以使用VCS的文件比较Diff功能。

啊,我现在想起来,我想减少最大无效密码尝试从5下降至3。 哦,我玩了一个假的登录页面,我绝对不希望提交到库中。

  5. 记得提交时编写提交信息日志,

有了提交日志信息,我可以理解你的提交信息并可通过你的代码试图追踪一个错误。

提交信息的整体思路是解释为什么你提交代码,每次你改变代码,肯定是有原因的。 也许是出了故障, 也许顾客不喜欢配色方案。 也许你只需要调整build配置。 不管它是什么,它是有原因的,你需要在你提交后留下它。

为什么要写日志呢? 根据上下文的不同有几个不同的原因, 例如,使用“责备”功能,或其他类似的功能,它暴露了谁改变了什么以及意图 。 我不记得我在18个月前对这个项目中的Web.config改了什么,为什么我修改应用程序设置,因为我留下了不错的提交信息,这一切都变得非常简单:

同样地,随着时间的推移变化,无论我是否希望看到的一个文件全部历史记录,如下图,我只是想看看昨天整个团队完成了什么,如有记录描述性的意见,意味着不需要采取更仔细的研究,就能了解这是怎么回事。

最后,提交的信息是绝对无价的,当涉及到跟踪错误。 例如,想知道什么打断了持续集成环境。 当然,我的例子是明显而易见的,但有一点是,如果没有这个信息,这将是个棘手的问题。

进一步考虑一下,这里有一些提交信息的反模式:

1.有些事情。

2.它的工作原理!

3.修正了一些该死的错误

4.修复

5.修正一个小错误…

6.更新

7.错字

8.修订1024!

我是从Stack Overflow上问题挑选出来的——你曾经编写的最糟糕的提交信息是什么。 他们没有告诉你代码中实际发生了什么,他们是垃圾信息。

关于提交信息的最后一件事, 来自同一作者的随后提交的信息不应该是相同的 。 原因很简单:你正在提交的原因与上一个版本不同。 你的代码与先前的版本是在一个不同的状态,如果你提交的信息是准确和完整的,应该在逻辑上是不相同的。 此外,如果是相同的(也许有一个合法的边缘情况下),日志变乱了,没有办法辨别两次提交之间的差异。

  6. 您必须自己提交更改 – 不能委派

这听起来很奇怪的,因为,它发生过,我见过不止一次,最近一次就在上周。 这里的情况是源代码控制库被放置在控制台机器上。 由于种种原因,该团队将其视为隔离,完美的代码纯净环境。 为了维持这个神圣的状态,代码提交之前需经过小组评审并(推断)调整和改进后才能被首席开发人员提交。

似乎这种模式是很有道理的。 但极少提交,多个开发人员团队只有一个作者,如果长时间没有提交的任何人一旦离开了即无可避免地将造成冲突混乱, 这样非常危险。

有两个重要的事情错在这里:第一源代码控制并不意味着是无暇的,无问题的原始代码;第二没有贯穿整个开发周期。 源代码库是团队整合频繁的地方,当出错时可回滚,团队工作围绕的一个共同的基础。 在整个过程中并不一定是完美的,但它必须(尝试)在应用程序生命周期中的达成发布状态。

另外,从开发者的角度来看, 这种模式是根本没有源代码控制!这意味着没有和同行集成代码,没有回滚,没有日志,什么都没有! 你只是坐在那里,在你的本地写代码,等待未来的任意点手工传给老板。

7. 数据库版本控制不是可选的

这是每个人都应该知道的,但很多时候,他们就是由于“很难”而没有做控制。 问题是,许多(大多数?)的应用程序没有数据库将无法运行。 如果你没有版本控制数据库,那么最终是一个不完整的应用程序。

大多数VCS系统的工作原理是在文件系统上的简单地版本化文件。 例如典型的应用程序文件,如HTML页面,图片,CSS,项目配置文件和其他位于文件系统中的分散成小单元的文件。 问题是,这不是关系型数据库的工作方式。 相反,你面对的是这些大的数据文件和日志文件,其中包括一大堆不同的对象和数据。 当涉及到版本控制是相当混乱的。

数据库版本有一些可用的工具,如来自Red Gate的非常优秀的SQL源代码控制工具。 去年我写了这个详细的文章——用Red Gate起舞你的SQL源代码控制世界,所以我不会再深入的细节,我只想说,现在数据库版本控制很容易!

说实话,如果现在你没有版本控制那么在开发中你的数据库你正背着一个很大的风险。 进行更改时,没有一个单一的事实来源,没有回滚位置以及不容易和团队协作。

8. 编译输出不应加入源代码控制

注意:构建项目自动生成的任何结果不应该提交到源代码控制中。 对于的.NET人们,意味着几乎所有在“bin”和“obj”的文件夹的文件,这通常会是的.dll和.pdb文件。

为什么呢? 因为如果你这样做,你的同事会恨你。 这意味着,每一次他们从版本库更新了变化,则直接用你的覆盖了他们自己的编译输出。 这将是一个合并的噩梦,而且可能打断下次重新编译进程。 然后一旦他们同样这样做重新编译和重新提交,整个该死的问题以相反的方向被重复,这个时候你是在接收端。

当然,另一个问题是,它只是浪费版本控制机的磁盘,浪费了带宽和额外的延迟,这需要每次到发送它在网络上,并且浪费你每次不可避免的处理冲突的时间。

于是,我们又回到了“忽略”的模式,前面提到的。 只要是“bin”和“obj”路径设置为忽略,一切都变得非常,非常简单。

事实上,我甚至写了pre-commit钩子在VCS服务器上执行,只要是这样的内容,绝不会到放进源代码控制。

9. 没有人在乎你的个人用户设置

说实话,我觉得很常见地人们甚至不知道他们提交了自己的个人设置到源代码控制。 这里的问题是,许多工具会产生用于管理自己个人的,局部的配置。 这些只适用你,其他人通常会有所不同。 如果你把它们放到VCS,突然间,你都覆盖对方的个人设置。

例如我在用户文件中启用方案分析,对我来说很好,我喜欢它,其他人却不。通常情况下,因为他们得到的是老龄化,极便宜的PC,但我却不。 问题的关键是,我不应该强迫其他人用我的设置 。

.suo文件同样,里面没有漂亮的XML,该文件记录的东西二进制,如解决方案资源管理器状态,发布设置和其他你不想去强迫其他人的东西。

  10. 依赖关系也需要放进源码库

当一个应用程序需要外部依赖才能成功地构建和运行, 把他们放到源代码控制里。问题是,人们倾向于在自己的小环境用他们自己的设置和本地依赖并使得一切工作好,然后提交一切到源代码控制里,甩手并认为是很酷。 然而,等到任何没有相同本地依赖可用的其他人更新后,一切都灾难性地失败了。

我曾参与过一个项目工程假设NUnit在机器上,但这个时候,情况并非如此。 幸运的是伟大的NuGet解放我出来,但事情并不总是那么幸运, 当你开始发现缺少依赖时总是需要一番查找摆弄。 在某些情况下,他们没有公开可用,要试图跟踪这将是是彻头彻尾的痛苦。

我曾碰到这种情况,我从代码库里检出一个项目,去运行它,发现缺少组件位于“C:\ Program Files……”路径。 我花了几小时试图追查谁最后成功运行它,然后组装起来,把它放在项目里一个“库”文件夹中,传到VCS。

当然,如果你工作在任何类型的持续集成环境中,你的构建服务器要安装这些库。 道格·拉思伯恩最近他写了有关源代码控制里的第三方工具 。

那么大家帮个忙,从第1天开始确保应用程序的构建和运行所需的一切都在VCS。

总结

说实话,这些事情都不难,真的都很基本:尽早并频繁提交,知道你正在提交什么,什么应该在VCS里,解释你的提交,并确保你自己亲自提交,不要忘了数据库,别忘记依赖。 但请忘记VSS。

Manually Install Kernel extensions on OSX

If you insist on doing it the command-line way, here’s how: First, copy the kext file to /System/Library/Extensions. Then, open the Terminal app (located in OS X under Applications->Utilities) and type:

cd /System/Library/Extensions

For those unfamiliar with command line, this just changes the directory that Terminal is working on to /System/Library/Extensions. Then type:

sudo chmod -R 755 name.kext
sudo chown -R root:wheel name.kext

Replace “name.kext” with the name of the kext you’re installing. This fixes the kext’s permissions (basically what System Utilities does in Multibeast). If you’re running Mac OS X Lion, this is all you need to do. If you’re still running Snow Leopard, you also need to clear the kernel cache. Type in this:
sudo rm -R Extensions.kextcache
sudo rm -R Extensions.mkext

Uninstall HUAWEI 3G MobileConnect Driver From OSX

需要删除以下目录和文件:

/Library/Receipts/HWportDetect_driver.pkg(Mac OS X 10.5)
/Library/Receipts/MobileConnectDriver.pkg(Mac OS X 10.5)
/Library/StartupItems/HWPortDetect
/Library/StartupItems/HWNetMgr
/Library/Modem Scripts/HUAWEI Mobile Connect – 3G Modem

/System/Library/Extensions.mkext(Mac OS X 10.5)
/System/Library/Extensions/HuaweiDataCardDriver.kext
/System/Library/Extensions/USBExpressCardCantWake_ Huawei.kext
/System/Library/Modem Scripts/HUAWEI Mobile Connect – 3G Modem
/System/Library/Modem Scripts/HUAWEI Mobile.ccl(Mac OS X 10.5)

以上目录可能会根据OS版本不同略有变化。

关于员工打卡

转摘自知乎阅读

1. 打卡第一定律:凡是打卡,就一定会有代打卡。


人类的智力,很大程度上用来探索如何利用各种规则,以及,钻各种规则的空子,无论是自然规律,还是人为定出的规章制度。

引用匿名用户分享:某知名网络视频公司内,某团队所有人的卡都在一个实习生手中。
如果这还不算什么,看看这个:

昨天参加了个大学同学聚会,饭局在下午六点开始,有一位同学说在加班,按规定晚上九点才能下班,我们就以为他估计赶不上了。然后他竟然准时来了!我们问他请假了么? 他说:没请假,把公司的打卡机带来了,待会儿九点的时候在饭店找个插座就可以打卡下班。by 糗事百科

你可以用指纹或人脸识别、或者杀一儆百之类的,但是,直率的说,我觉得这些都没有太大的意义。

打卡的副作用也很多。常常发现的问题是,员工前一天工作的太晚,或者就是习惯晚上工作,或者家住的远,或者…总之有各种情况,一刀切的打卡,看起来大家都公平,其实不公平,少数人犯错,多数人被惩罚,不得不接受统一、僵化的管理。

2. 重新定义问题:打卡的目标是什么?

我们在做事时常常会陷入误区,分不清什么是目标,什么是任务,经常迷失在如何将任务做好上,而忘掉了原本的目标是什么。我写过一篇文章,这里有一幅很能说明问题的漫画: 乌鸦喝水:由目标到任务http://t.cn/zjZbPLp

如果我们重新定义问题,为什么要打卡?企业原本的目标是什么?(初心?…)是为了企业的工作能够正常运转,是为了确保团队的工作效率。在这种背景下,打卡一定是个好的方式么?甚至再进一步,企业在多大程度上、多大的粒度上,依靠制度去解决问题?

3. 从X理论到Y理论

X理论和Y理论是管理学中的基本理论,描述了人们的工作源动力。X理论认为人们具有消极的工作源动力,如果没有强制的管束,人们就会逃避工作。Y理论认为只要给与机会和气氛,人们会喜欢工作,渴望发挥才能。X理论将人视作机器,而Y理论则更强调人的主观作用。现在,越来越多的企业管理适合以Y理论而非X理论为基础,特别是那些对员工的创造力要求高的企业。

福特汽车生产线通过各种规则和制度确保高度的效率,在工业时代取得了很好的效果,工人们一丝不苟,按部就班。但是,这样的生产线在多大程度上利用了人类特有的智慧(而非简单判断和机械劳动呢)。富士康的生产线相信大家已经早有耳闻。所以现在富士康越来越多的推广机器人,发现也能工作… 在这里人和机器人起到的作用是相同的。

这适合所有类型的企业么?有些时候,一个完美的制度设计本身就是一件困难甚至难以完成的事。

海底捞是个好例子。海底捞的每个服务员都有给客人加菜或免单的权力,这里就有一个问题,如何防止服务员滥用权力?流程和制度在这里很难设计,得需要多细、多全面的条文啊。海底捞的做法是依赖基层管理者的能力,信任他们的判断,通过人的经验和智力很容易识别问题。一个服务员第一次有问题、第二次、第三次,很容易就会被看出来,因为这些基层管理者自己已经端了好多年盘子了,太了解这份工作是怎么回事。别把人当机器来用。

很多时候,当我们设计出一个制度,就必然会有很多漏洞,为了堵住这些漏洞,又不得不殃及更多的人。其实不用怕有人会钻空子,一个钻空子的人,必然会在很多地方暴露出问题,只有有一个好的管理团队,你可以很快识别出这些人,然后有针对性的处理,不应该影响到其他人舒服的状态。

4. 一线管理者负责制

对于有条件的企业,可以推行一线管理者负责制,由最基层的经理来实施细节管理。减少整个公司一刀切的方式,一刀切的制度很多时候是管理层偷懒。在制度的大框架内,更多的靠人、靠基层的管理团队去协作,而非弄几个条文规定了事。基层的团队负责人应该知道有人昨天工作晚了,或者有特殊情况,所以晚到。或者,如果有人频繁的出状况,也能够去直接解决,而不是通过 HR 系统的考核。

一个企业的执行力是否够强大,不是看是否拥有完善的写在纸面上的规章制度,这些都是死的。真正的灵魂是一个健壮的管理团队,从高层到最小单元的基层。这样的核心支撑起了企业的整个管理机制。在这个基础之上,再去创建大的规则,去让这个体系正常运转,又留下足够的灵活空间。

这种管理方式其实和现在的移动互联网开发模式是类似的。传统的软件开发,总是先做概要设计、详细设计,写出一堆文档,做着做着,就发现这些文档都只是为了领导而写,为了写而写。移动互联网强调的是快速推进,信任高素质开发者和技术管理者的能力,在基层团队中实现效率最大化。当然规范、架构设计仍然是存在的,只不过是控制好了一个合理和有效的粒度。

5. 从创业公司到大企业

我们公司不打卡,依然保持着很快的节奏。我们有制度,但是不死板,也避免完全依靠制度。任何时候如果我们想指望弄出一套类似法律体系的东西来判断事情时,我们就知道这一定是错的。我们不希望因为少数人的错误来惩罚多数人。如果有人工作有问题,第一次、第二次、… 总是会被看到,或者在别的方面暴露出问题来,这时候再单独解决。而不是给所有人套上一个枷锁。

再举一个大企业的例子:IBM 在全球有四十多万员工,其他部门我了解不多,但是研发部门不用打卡。是的,每个人都得有个卡,但那单纯就是用来刷门的。你平时工作如何,由一线经理来掌握。

动辄看到国内一些创业团队都在以各种先进设备来打卡,真让我眼镜跌了下来~

6. 你算的越清楚,员工算的就更清楚

很多企业的管理者喜欢算的很清楚,希望通过控制几点上班、几点下班,来从数字上得到满足。而员工,或者说是团队成员,每个人都有自己的思想,没有人是傻瓜。你计较的越清楚,大家就计较的越清楚。打卡考勤扣工资是吧?那我辛苦加班的时候你怎么不说?我业余时间紧急处理公司的工作的时间你怎么不算?你可以不说,你可以不算,大家为什么要那么努力工作呢?都打打马虎你也没辙。继续考评?继续有漏洞?……

以前我见过一个例子:有一名员工春节从家里回来上班,买不到车票,迟回来了两天。因为有制度,不按时回来就要罚钱,所以按照制度,罚了工资。然后,这名员工就辞职了。她说:我平时为了做好工作周六周日晚上都可能要加班,领导没有看到眼里,现在我不过晚回来两天,就要罚钱。「不是钱的问题,是被伤害了」。这样对公司损失其实很大,有经验又能干的员工走掉了,再培养人的潜在成本很高,而且周围的人都看在眼里。

所以我们公司现在春节会直接放两周假,让大家好好休息。只要是正当理由的请假,提交申请后都不会有问题,也不会扣工资。当你真心实意的对待大家,不要只盯着眼前,这样迸发出的创造力会更大。一个企业的目标永远是「成功」,而不是管人。

OSX重装后需要的设置(SSD)

1,首先对于ssd装在硬盘位置的同学,我推荐把mbp自带的硬盘移动突发感应器关闭。

这是针对传统机械硬盘的一项保护功能,机器在监测到剧烈晃动或突发性落地时,会将硬盘的磁头缩回安全位置来保护硬盘不产生坏道

而对不怕震不怕摔不怕晃的SSD来说,这个功能是多余的,所以将它关闭

在终端窗口执行以下代码

sudo pmset -a sms 0

2,对于在移动硬盘设置了Time Machine的同学,我推荐把Time Machine的本地备份功能关闭。

Time Machine的本地备份好像是从10.7开始才增加的新功能,具体的作用是在未接入Time Machine的移动硬盘时,将备份存储在本地硬盘上,等你接入了移动硬盘后,系统会自动的将本地备份的内容,传输到作为Time Machine的移动硬盘上。

这功能其实不错,但对于空间宝贵的SSD来说,我个人推荐关闭。

在终端窗口执行以下代码

sudo tmutil disablelocal

3,许多同学都为自己的mbp升级了8gb,甚至16gb的内存。

而OS X默认的合盖休眠方式,是混合睡眠,合上盖子之后,仅为内存供电,这样在掀开盖子的时候可以迅速的恢复。

而一旦电池没电之后,系统会自动的将内存里的内容写入硬盘上的一个睡眠缓存文件里,下次开机时,会看见类似iPhone恢复时的进度条,读取硬盘缓存文件里的内容,来恢复你合盖之前的桌面。

那么这个缓存文件的大小,和你内存的大小是一样的,例如你有8gb内存,那么缓存文件就是8gb,16gb内存,缓存文件就是16gb。

这对于64gb或128gb的ssd来说,占用的空间实在不小,那么我个人建议关闭设置为内存休眠。

但是一旦电池没电,系统将丢失所有未保存的数据。不过一般来说,mbp的电池都不会用到没电的那一刻。。

在终端窗口按顺序执行以下代码

sudo pmset -a hibernatemode 0
sudo rm /var/vm/sleepimage*

4、开启第三方ssd的trim功能

ssd的trim这项功能的重要性,我在这里就不多说了,对于apple原厂的ssd,os x的trim默认就是打开的,例如air,rmbp

而我们自己改装的第三方ssd,trim都是默认关闭的,如何开启?请看下面。

对于10.7和10.8的os x

在终端窗口按顺序执行以下代码

sudo cp /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS IOAHCIBlockStorage /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage.original

这一步是备份你的硬盘kext文件

sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00{1,20})[^\x00]{9}(\x00{1,20}\x51)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage

这一步是开启Trim支持,默认仅支持Apple自家的ssd,这一步命令将限制破除,支持所有第三方的ssd。

sudo kextcache -system-prelinked-kernel
sudo kextcache -system-caches

上面两条命令是清除系统内核缓存

按顺序执行完以上步骤后重启你的mbp就ok了。

对于10.8.1的os x,把上面的第二步换成下面的命令就可以了

sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00).{9}(\x00\x4D)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage

Mac OSX Mountain Lion 的全局环境变量, For all GUI apps and Spotlight

以前osx的全局变量可以通过~/.MacOSX/envrironment.plist文件来设置,现在Mountain lion后就不行了。现在的文件换成/etc/launchd.conf 可以使用一下方法来设置:

1) Open a terminal prompt

2) Type sudo vi /etc/launchd.conf (note: this file might not yet exist)

3) Put contents like the following into the file


# Set environment variables here so they are available globally to all apps 
# (and Terminal), including those launched via Spotlight. 
# 
# After editing this file run the following command from the terminal to update 
# environment variables globally without needing to reboot. 
# NOTE: You will still need to restart the relevant application (including # Terminal) to pick up the changes! # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl 
# 
# See http://www.digitaledgesw.com/node/31 
# and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/ 
# # Note that you must hardcode the paths below, don't use enviroment variables. 
# You also need to surround multiple values in quotes, see MAVEN_OPTS example below. 
#
setenv JAVA_VERSION 1.6 
setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home 
setenv GROOVY_HOME /Applications/Dev/groovy 
setenv GRAILS_HOME /Applications/Dev/grails 
setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp 
setenv JRUBY_HOME /Applications/Dev/jruby 
setenv ANT_HOME /Applications/Dev/apache-ant setenv ANT_OPTS -Xmx512M setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m" 
setenv M2_HOME /Applications/Dev/apache-maven 
setenv JMETER_HOME /Applications/Dev/jakarta-jmeter

4) Save your changes in VI and reboot your Mac. Or use the grep/xargs command show in the code comment above.

如果不想手动修改文件,则可以使用

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

来进行修改。

Howto fix this: ssh daemon asks for a password

今天折腾Git的升级,一下子把gitolite和gitlab都升级到了最新的。也遇到了不少问题,其中一个比较头疼的就是还和gitolite和gitlab都没有关系,是ssh的问题,后来在gitolite的文档中找到了很详细的处理办法,摘录在此。

appendix 1: ssh daemon asks for a password

NOTE: This section should be useful to anyone trying to get password-less access working. It is not necessarily specific to gitolite, so keep that in mind if the wording feels a little more general than you were expecting.

You have generated a keypair on your workstation (ssh-keygen) and copied the public part of it (~/.ssh/id_rsa.pub, by default) to the server.

On the server you have appended this file to ~/.ssh/authorized_keys. Or you ran something, like the gitolite setupstep during a gitolite install, which should have done that for you.

You now expect to log in without having to type in a password, but when you try, you are being asked for a password.

This is a quick checklist:

  • Make sure you’re being asked for a password and not a passphrase. Do not confuse or mistake a prompt saying Enter passphrase for key '/home/sitaram/.ssh/id_rsa': for a password prompt from the remote server!

    When you create an ssh keypair using ssh-keygen, you have the option of protecting it with a passphrase. When you subsequently use that keypair to access a remote host, your local ssh client needs to unlock the corresponding private key, and ssh will probably ask for the passphrase you set when you created the keypair.

    You have two choices to avoid this prompt every time you try to use the private key. The first is to create keypairswithout a passphrase (just hit enter when prompted for one). Be sure to add a passphrase later, once everything is working, using ssh-keygen -p.

    The second is to use ssh-agent (or keychain, which in turn uses ssh-agent) or something like that to manage your keys. Other than discussing one more potential trouble-spot with ssh-agent (see below), further discussion of ssh-agent/keychain is out of scope of this document.

  • Ssh is very sensitive to permissions. An extremely conservative setup is given below, but be sure to do this on both the client and the server:
    cd $HOME chmod go-rwx . chmod -R go-rwx .ssh 
  • Actually, every component of the path to ~/.ssh/authorized_keys all the way upto the root directory must be at leastchmod go-w. So be sure to check / and /home also.
  • While you’re doing this, make sure the owner and group info for each of these components are correct. ls -ald ~ ~/.ssh ~/.ssh/authorized_keys will tell you what they are.
  • You may also want to check /etc/ssh/sshd_config to see if the “git” user is allowed to login at all. For example, if that file contains an AllowUsers config entry, then only users mentioned in that line are allowed to log in!
  • While you’re in there, check that file does NOT have a setting for AuthorizedKeysFile. See man sshd_config for details. This setting is a show stopper for gitolite to use ssh.
  • Some OSs/distributions require that the “git” user should have a password and/or not be a locked account. You may want to check that as well.
  • If your server is running SELinux, and you install gitolite to /var/gitolite or another location unsupported by default SELinux policies, then SELinux will prevent sshd from reading .ssh/authorized_keys. Consider installing gitolite to/var/lib/gitolite, which is a supported location by default SELinux policies.
  • If all that fails, log onto the server as root, cd /var/log, and look for a file called auth.log or secure or some such name. Look inside this file for messages matching the approximate time of your last attempt to login, to see if they tell you what is the problem.

Add trusted files and directories in Global Security Settings panel

在开发Flex应用的时候,烦人的SecurityError 2148可以通过Adobe的官网页面来添加本地硬盘Trusted Path以屏蔽

google “Global Security Settings panel” 一般来说第一条就是这个设置面板,地址是

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html