关于成本想起的二三事

随想

第一件事

公司旁边现在有个大工地,每天都有很多土方车把工地上的建筑垃圾运到其他地方,然后会在公司附近的路上零星洒落一些碎屑。

同时呢,路边有几个五六十岁的农民工,沿着马路,用铁锹有气无力的铲着地上碎屑,茫然,无力,且又杯水车薪。这些人被称为“小工”,专门在工地上从事一些打杂的活计。

他们的存在就是施工方在向相关部门表示:我看到了,我也想了一些办法,并且实行了;虽然我没有做到最好,但是我做了。

他们就是面对成本进行妥协的产物:改进工作流程或者施工设备的成本比较高,不如专门找几个人沿着路铲碎屑。当然会有监管部门,但是鉴于国内普遍违法的现状,显然是宁愿交罚款,也不愿意去改进流程。

第二件事

最近在Github上看了一个项目,叫“任正非思想”,它收录了任正非400余篇讲话稿。其中关于人力成本部分的描述,联系到华为清退35岁以上的员工,可以看出一些很有意思的东西。

任正非出身军旅,因此很多讲话风格都很有意思,他经常用军队中的一些东西来映射公司管理中的东西。

例如将军和士兵,并不是所有士兵都想当将军。因此,对于那些想当将军的人,不定义具体的kpi,而是用末尾淘汰的方式形成挤压,从而产生和保留更多的将军;至于那些普通士兵,则要定义详细的kpi,只保留那些满足kpi的人,而当这些士兵无法满足kpi的时候,就要果断地抛弃掉。

这也是为何我国的义务兵兵役只有两年的原因,士兵是消耗品,无需考虑后续的保养问题。只需要选拔出那些想当将军的士兵即可。在庞大的人口基数下,部队总可以募集到足够的普通士兵。

所以对于普通的华为员工,只需要满足kpi即可,当公司在普通员工身上的投入产出比不够高的时候,及时裁撤掉这些人,同时及时补充新的普通员工。

这也是任正非特意强调的:不要培养员工的主人翁意识,而要多一些打工心态。这样公司在裁撤员工的时候,才不会有太多的情绪反抗。

第三件事

这件事其实和成本的关系不大,而是由第二件事联想到的。

据说,战国时的吴起,身为大将,爱兵如子。有次发现一个士兵身上长疮了,就亲口为其吮吸伤口。

那个士兵的母亲听说后,痛哭流涕。旁人很奇怪:你的儿子遇到了一个爱兵如子的将军,为何又要不开心呢?

这个母亲答道:当年吴起帮忙吮吸我老公的伤口,结果我老公用命报答了吴起。现在他又这样对待我的儿子,我想我的儿子也会为他效死命的。

反观任正非,更有一种慈不掌兵的味道。

【每日一翻】React和Vue.js2.0哪一个更好?

源自https://unsplash.com/
源自 unsplash.com
原文地址:React vs. Vue.js 2.0, which one wins?

先说什么是 React.js 和 Vue.js

React.js

React是一个用来开发用户界面的JavaScript开源库。它第一次被人所知是在2011年被Facebook用在自家的新闻流里,之后在2012年被Instagram使用。

直至今日,FacebookInstagram还在开发和维护React,并且React不光能用来开发基于浏览器的网页应用,还能用来开发手机应用。这个框架的目标就是为了在多个平台上提供快速、简单和易操作的应用。

或许你已经在这里读过这篇关于哪些最常用的 JavaScript 框架的文章。无论如何,React还不能称得上是一个全面框架,它更像是一个功能库。当你想把它作为一个框架来用的时候,你就需要添加一些第三方库来配合才行。

React长处是速度快、轻量级、跨平台以及庞大的社区。

React缺点就是必须要集成其他的第三方库工作良好,而这就导致了开发工作的复杂化。还有一个缺点就是React不像AngularVue.js那样,使用标准的HTML/CSS来开发。

*SMN with React Component Released*
SMN with React Component Released

Vue.js

Vue是一套用来构建用户界面的渐进式框架。与AngulqrReact不同的是,Vue被设计为

可以自底向上逐层应用。

这意味着开发者可以从特定页面逐步引入这个框架,这将大大降低开发的难度。

Vue.js的作者是尤雨溪,并且这个框架在中国的公司里被广泛应用。这些公司包括但不限于阿里巴巴、百度、小米等。不久之前,代码托管服务系统GitLab也切换到了Vue.js

Vue优先处理的是视图层(也就是常说的 MVC 中的 View),这简化了和其他第三方库以及现有项目的整合。

Vue整合了AngularReact的长处:速度、轻量级以及支持其他一些技术的可能性,如TypeScriptJSX。但是,Vue依然可以使用传统HTMLCSS的代码标准。这加速了网页应用的开发,使项目开发和维护变得更容易。

因此,对于某些开发者,了解前端开发的基础即可用Vue来开发或维护项目了。

当下,当一个框架没有大公司背书的时候,没有大的开发者社区会是它的一个弱点。但是,Vue的流行度每年都在提升。

到底选哪个

在项目启动之前我们应当进行详细的分析和评估,但是每个项目基于自身背景都是独一无二的。不过,总有几个关键点,可以帮助我们选择开发时使用的技术:

速度,项目开发和支持的便利度

项目开发的速度取决于当前正在使用的技术。如果已经应用了TypeScriptJSX,那么就需要相应的使用AngularReact

因此基于以上两点:当你从头开始一个项目的时候,最好选择Vue.js

趋势

VueAngularReact都很流行,在以后几年内依然会统治现代开发市场,因此选择任意一个框架都不会是个错误。但是Vue正在获取越来越多的欢迎度,并且已经超过了React。在下面的表格中,你可以看到Github上这几个框架的star数量的趋势

Frameworks’ popularity on Github
Frameworks’ popularity on Github

迁移及扩展性

假如你现在已经选择了一个框架,但是你想要切换到另一个。Vue.js将是最好的选择,因为重写AngularReact项目就意味着你要把TypeScriptJSX代码重写为传统的JavaScriptHTML

一个重要的参考点就是框架的更新频率Angular每 6 个月就会有一次重大更新;React少一些,大概每年一次;Vue则相对稳定,几年内才会有一次重大更新。

Android Studio Can't Open Existing Projects in macOS 10.15 beta

又到了今年的七(hua)夕(qian)之夜,先祝大家节日快乐。:)

最近呀,有些使用Mac开发Android的小伙伴会发现如下现象:升级macOS Catalina 10.15beta版本后,你的Android Studio既无法打开现有工程,也没办法导入工程到Android Studio了。这个问题在Android Studio 3.5 RC 2Android Studio 3.4.版本中均是百分百出现。

至今,广大网友也不知道这个锅应该是macOS的开发团队,还是Android Studio的开发团队来背了。(咱也不知道,咱也不敢问 XD

百般捣鼓之后,我试出了一个权宜办法,就是在命令行中打开现有工程

这个办法有两种方式来实现:

1. 用Android Studio自带的command-line launcher打开现有工程

命令如下:

1
$ studio "project的位置"

2. 用Mac自带的open命令来打开现有工程

命令如下:

1
2
3
$ open -a /Applications/Android\ Studio.app "project的位置"
或者是下面这种
$ open -a /Applications/Android\ Studio\ 3.5\ Preview.app "project的位置"

结语

今天的文章到这里就结束了。不过有些小伙伴会说:博主只提供了打开现有工程的办法,怎么没有说怎么解决无法导入工程的问题呀。原因就是,博主要过七夕呀,没有这么多时间来试探这个问题了。而且,当前的解决办法,应该已经可以满足一小撮遇到这个问题的小伙伴快乐的过(qiao)七(dai)夕(ma)了。如果想要追踪这个这俩问题的进度,可以关注这个问题的回复情况Android Studio: Can’t Open Existing Projects - Stack Overflow

【每日一翻】新加坡和新加坡人最被误解是什么

题图

问:新加坡和新加坡人最被误解的是什么?

答:(答主是在 2015-2018 年间在新加坡的美国人)作为一个在新加坡待了三年的美国人,我想我可以来回答这个问题。

我认为对于美国人来说,最大的误解可能是新加坡并不是中国的一部分。这听起来有些可笑,但是新加坡确实不是中国的一部分。另一个对新加坡的误解估计是新加坡的富裕状况。很多美国人觉得新加坡的经济状况应该和它的邻居们差不多。然而实际上,新加坡要比它的邻居们(马来西亚、印度尼西亚等)富裕的多,即使和西方世界的国家相比也不逞多让。新加坡是一个第一世界国家,这是毫无争议的。有些人认为新加坡人之所以这么富裕是因为高额的政府援助,但是即使有这么高的政府援助,还是有人活的朝不保夕。不过这种人会出现在任何国家,这是不可避免的,不能算是新加坡的错。

我认为另一个针对新加坡的误解应该是新加坡真的很小很小。它的国土面积只能相当于美国的一些大型城市,如旧金山和纽约。这也导致新加坡人很热爱旅行,当然这也是因为他们有钱去旅行。因为新加坡人喜爱旅行,也使得有些人不知道新加坡的具体位置。由于新加坡距离亚洲、澳大利亚以及一些岛屿城市如马尔代夫(旅游胜地!!)的航程都不超过七个小时,这就使得其他国家的人的梦幻之旅,对于新加坡人来说,只需要一个周末就够了。

总的来说,对于新加坡,大家还有很多误解和不了解,或许是因为这个国家太小了,但是这个国家的实力却不容忽视。

原文出自一个不存在的网站,内容如下:

As an American who lived in Singapore for 3 years, I think I can answer this. I think one of the most misunderstood things (for Americans) about Singapore is honestly that they’re not part of China. As humorous as it may sound, it’s true. I think another one may be Singapore’s wealth. Lots of Americans would believe that Singapore’s economic situation is similar to that of its neighbors, when that could not be farther from the truth. Singapore is an incredibly rich nation, not just by the standards of their neighbors (Malaysia and Indonesia) but by the standards of the West too. They are without a doubt a 1st world country. On the flip side, some people assume all Singaporeans are fairly wealthy because of high government assistance, however even with this huge government assistance, some Singaporeans worry about paying next months bills. Of course, this is true with all counties, so it would be inevitable and is not really Singapore’s fault. I think another thing a lot of people misunderstand is the very small size of Singapore, approximately the size of just one large US city (like San Francisco or New York), and that as a result, Singaporeans (who can afford to do so) love to travel. Finally, relating to the fact that Singaporeans love to travel, lots of people don’t understand Singapores incredible location. It is no longer than a seven hour flight to all major destinations in Asia, Australia, and island countries like the Maldives (an AMAZING place to visit), which makes traveling to places most could only dream of an easy weekend trip for Singapore residents. Overall, there is a lot misunderstood or unknown about Singapore, maybe it’s because they’re the little red dot, but the Merlion is and always will be one of the mightiest animals.****

【每日一翻】曾经有面试官问过我一个Java和Python谁更快的问题。这个问题的最佳答案是什么?这个面试官真正想问的是什么?

题图

问:曾经有面试官问过我一个JavaPython谁更快的问题。这个问题的最佳答案是什么呢?这个面试官真正想问的又是什么呢?
答:这个问题有三个答案:错误答案菜鸟的答案老鸟的答案

  • 错误答案: Python是一门比较新的语言,它很酷,每个人都在用它。而Java是一门过时的语言。因此Python更快。
  • 菜鸟的答案: Java更快。因为它有更快的VM—虚拟机,支持多线程,吧啦、吧啦、吧啦
  • 老鸟的答案:这个问题毫无意义。JavaPython是编程语言,快和慢并不适合用来形容它们,问这个问题就像问英语和德语谁更快一样。而快和慢是用来形容程序的,这两个语言都可以写出快程序和慢程序。除此之外,速度还取决于运行程序的硬件。一个跑在低性能机器上的”快速”的Java程序,会比一个跑在高性能机器上的Python程序跑得更慢。如果你有现成的程序,我们可以测量它们的性能,通过数据来比较它们的快慢。

原文出自一个不存在的网站,内容如下:

There are three answers to this question: the wrong answer, the beginner answer, and the experienced answer.
The wrong answer is: Python is a newer language that’s pretty cool and everybody’s using it and Java is old-fashioned so Python is faster.
The beginner answer is: Java is faster because it has a fast VM and multiple threads and techy, techy, techy.
The experienced answer is: Your question doesn’t make sense. Java and Python are languages. Faster or slower does not apply to them. It’s like asking which is faster, English or German? Faster or slower applies to programs. It’s possible to write fast or slow programs in either language. In addition, speed depends on the hardware that the program runs on. A “fast” Java program on a slow machine may be slower than a “slow” Python program on a fast machine. If you have specific programs in mind, we can measure their performance and see how they compare.

【每日一翻】为何中国在带领人民脱贫方面取得巨大成功的同时,依然受到西方媒体持续不断的攻击?

问:作为一个拥有14亿人口的国家,”红色”中国在带领人民脱贫方面取得了巨大成功。而这种成功是在世界上其他地方从来没有出现过的,然而中国却依然受到西方媒体持续不断的攻击,这是为什么呢?

高分答案: 我很喜欢这个问题,因为它点出了中西方文化差异中的一个关键点。西方国家不断的用详细事例来说明他们认为中国在侵犯人权方面的举动。而中国却反驳说西方国家没有看到中国大大提升了数亿人的生活质量,因此中国质疑西方世界从来没有把这件事考量进去。

当年我在中国的高中里教授辩论课的时候,也曾经看到过这种价值观的冲突。我们会教他们为辩论提供一个框架,或者一个定义、观察价值观的系统。这样会更容易比较论点并框定辩论的范围。而中国学生一定会使用功利主义框架。但是我们作为讲师,就是教授辩手如何争辩和推翻所有的价值体系,以构建他们可以用来赢得比赛的工具包。所以我借助了“电车难题”,来尝试教他们作出道义论证,问题如下:

一辆失控的电车正沿着轨道向一个岔口前进,有五个人在岔口前方的轨道上,片刻后就会被电车撞死。而你是一个和此事无关的旁观者,正目睹这一切的发生。这时你意识到,如果你拉下你旁边的开关,电车就会在叉口处开向另一个方向,然而那个方向的轨道上也有一个人,电车会把那个人撞死。基于道德你应该怎么选择,你会拉下那个开关吗?

当你拿这个问题去问中国人的时候,他们几乎百分百会选择拉下那个开关——毕竟,这样可以多救4个人。而你让这些人以”为什么不应该拉下开关“来展开辩论,他们会觉得非常困难。所以对于我的学生来说,持有这个观点展开辩论几乎算是一个不可逾越的挑战。最终导致这些学生很难在辩论赛中打败那些同样持有功利主义观点的人。

我和我的学生们持有不同的价值观,很大原因是由于我们生长的社会环境不同。在中国,法院判决的定罪率是99.99%。与美国相比,中国的暴力犯罪事件和因枪支导致的死亡事件都很少。因为中国人更推崇”宁可错杀一百,不可放过一个“。而中国的法律和伏尔泰那一套也不一样——中国人更乐于为保持一个更安全的社会付出一些其他代价。相比之下,美国举证责任很高,被告的权利也很强。

在这样两个完全相反的社会中长大,也难怪西方人和中国人之间产生误解。中国更关注整体的幸福感、生活质量,因此觉得牺牲一部人人权是可以接受的。而西方媒体却觉得这是不对的。他们会对那些会拉下开关的人说,某些行为从根本上来说就是错误的,因为整体的幸福感或社会财富在这种状况下并不重要。

原文出自一个不存在的网站,内容如下:

China has a population of 1.4 billion people. “Red” China has lifted more people out of poverty than any other system yet why is it constantly attacked in the Western media when it was extremely successful in poverty reduction?
I like this question because this argument highlights a key cultural difference among China and Western countries. Western countries constantly detail what they consider to be human rights abuses in China, while China points to the massive increase in quality of life for hundreds of millions and is incredulous about that not being taken into consideration.
I saw this same conflict in value systems when I taught debate to Chinese high school students. We would teach them to give the debate a framework, or a system of definitions, observations, and values that make it easier to compare arguments and “frame” the debate. Without fail, Chinese students used a utilitarian framework. Our job as instructors is to teach debaters how to argue for and against all value systems to build their toolkit that they can use to win rounds, so I tried to teach them to make deontological arguments. We started with the trolley problem.
A runaway trolley is speeding toward a fork in the track. Five people are in the trolley’s path, certain to be hit and killed. You, an innocent and neutral bystander, see this happening and realize that if you pull a switch right now the trolley will change to a different track with one person in the way, who will perish instead. What is the ethical choice to make? Do you pull the switch?
Ask a Chinese person and they will almost certainly tell you to pull the switch—after all, you save a net of 4 lives. If you ask them to craft an argument for why they shouldn’t pull the switch, they may have a very difficult time doing so. For my students it was almost always an insurmountable challenge to argue for the opposite viewpoint, which made it in turn very difficult for them to defeat the common utilitarian arguments they faced in debate rounds.
My students and I did not derive our different value systems out of nothing; the society in which we were raised played a huge part. In China, where the courts have a 99.93% conviction rate[1], there are very few violent crimes and gun deaths per capita compared to America. It is not considered good here that 100 guilty men go free rather than convict one innocent. In China, whose laws are not traced back to Voltaire, they would gladly pay the price of a few wrongful convictions for the reward of a safer society at large. By contrast, American burdens of proof are high and the rights of the accused are strong.
Raised in such opposite societies, it is no wonder that we can misunderstand one another. China looks at change in overall happiness, quality of life, and well being and says, “How about THAT for human rights?” The Western media criticizes them anyhow and says, as they may say to the person who would pull the lever and change the trolley, that certain acts are wrong in and of themselves and should never be performed because it is not the total life or wealth or happiness at the end that is important.

996与中国人的性情

鉴于最近热火的程序员 996 起义事件终于告一断落:各大浏览器和平台开始封杀涉事网站和代码,那我也谈谈我的看法。

百年前的西方世界有一本书:《中国人的性情》,这是那个时代的外国人了解中国的必备工具。但是百年过去了,中国人还是中国人。

那些支持 996 的一种人是所谓的老板,这些人由于屁股的原因支持 996 无可厚非,经常做的就是把压榨员工说成是奋斗精神。

另一种支持者就是所谓的打工仔,这些人中的很多人错把 996 当成了奋斗和努力。作为经过十几年打磨和调校才走下生产线的高级产品,他们不应当通过压榨自己的时间和血汗来换取金钱和自我满足感。这是对过去十几年中,投入的时间和金钱等成本的巨大浪费。当然很少有人真的思考过,自己的时间到底多值钱

提起百年前的清朝,很多人的印象中那是一个腐朽落后的时代,但是那个时候的人同样努力和奋斗

《中国人的性情》中描述过一个内阁大臣(相当于现在的政治局常委)的日常安排:

他一直在抱怨日常工作的繁忙和疲累。他告诉我,他每天凌晨两点钟就要从家里出发,3 点至 6 点要在宫里当值;身为内阁大臣,6 点至 9 点要在朝中议事;身为兵部大臣,9 点至 11 点要在兵部办公;身为刑部要员,每天 12 点至下午 2 点要在刑部例行公务;身为外务部的资深部长,每天下午 2 点至五六点要在外务部。这些就是他每天的工作安排,还不止于此,他在工作的间隙还常常要参加各种会议,为其他的部门工作。他很少能在傍晚七八点之前回家。

那这个人的结局呢:

看到上面这份日常工作安排,我们的工会会员还在为每天 8 小时工作制而奋战,有什么感想呢?据说,在那次谈话半年后,那位官员因劳累过度、心力交瘁去世了。这并不奇怪,以后类似的事情再度发生也是极有可能的。

当时的读书人同样也很努力:1889 年省考中,福建省有 9 位超过 80 岁、2 位超过 90 岁的考生;河南省有 13 位超过 80 岁、1 位超过 90 岁,全部“通过为期 9 天的严格考试,文章精练,没有暮年之气”。

但是这种努力有用吗?屁用不值。努力和奋斗是手段,而不是目的。靠着死命压榨自己并用奋斗来安慰和麻痹自己的人真的很可怜。

还有人拿着”大清自有国情在此”,我国 IT 产业相对落后,就是需要多干才能赶上这种论调的。这种人就是一个字,蠢。一个人 5 天的工作量,难道配上 10 个人,半天就能完事吗?那我配上 100 个岂不是立马赶英超美。殊不知我国 1995 年才开始实行双休日,也没见国家实力和西方的差距变得更大,反而在缩小。

很多人不知道,乾隆和美国国父华盛顿是同时代的人。

很多人也不知道,爱因斯坦是在清朝末年发表的相对论。

方向比努力更重要,个人是这样,产业也是这样。

最后提一句:程序员倡导废除996的协议网站,被程序员开发出的浏览器和平台恶意封禁。真是讽刺

使用NodeJs递归清理本地Git仓库

背景

由于常年混迹Github,所以在我电脑上有很多 clone 下的Git Repo,而这些 repo 使用中生成的临时文件占用了大量空间。粗略看了下空间占用,居然有23G。所以决定通过git clean命令把每一个仓库清理一下。但是先进入每一个仓库,然后执行上面的命令就太 low 了,于是决定写个脚本处理一下。最近 nodejs 用的多一些,因此决定用 nodejs 来处理这件事。

工作环境

我的电脑是 mac 系统,理论上这个解决方案也可以在 linux 和 win10 中的 linux 子系统中运行。

方案

解决思路

鉴于每个Git Repo的根目录中,都有一个名字叫做.git的文件夹。因此可以通过查找.git文件夹的位置,间接知道Git Repo的位置,类似下面这种:

1
2
3
/a/b/repo1/.git
/z/repo2.git
/repo3/.git

之后进入每个Git Repo,执行 git clean命令。

工具

  • NodeJs中的child_process。用于在 js 中执行unix系统的命令行程序
  • NodeJs中的path。用于处理路径
  • find命令。用于查找文件位置
  • cd命令。用于切换执行unix命令的目录位置
  • git命令。 用于执行git clean命令

步骤

1.找出所有.git文件夹的位置

通过child_process, 执行find . -type d -name .git命令,。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const process = require("child_process");

const find = process.spawn("find", ". -type d -name .git".split(" "));

find.stdout.on("data", data => {

// dirs中包含所有.git文件夹的位置
const dirs = data.toString().split(/\r?\n/));
});

find.stderr.on("data", data => {
console.log(`stderr: ${data}`);
});

find.on("close", code => {
console.log(`child process exited with code ${code}`);
});

最后得到的dirs是一个字符串数组,包含所有找到的.git文件夹的位置,类似['/a/b/repo1/.git', '/b/c/repo2/.git']

2.获得仓库位置

通过path获得.git目录所在Git Repo的路径

1
2
3
for (const i of dirs) {
const repo = path.dirname(i);
}

现在得到的repo变量中存储的就是Git Repo的路径

3.清理仓库

切换到repo目录,执行git clean -xdf 命令

1
2
3
4
5
6
7
8
9
10
11
12
const cleanRes = process.exec(
"cd " + repo + " && git clean -xdf .",
{},
(error, stdout, stderr) => {
console.log(`\nTry to clean up ${repo} by: '${cleanCommand}'`);
if (error) {
console.log(`error: ${error}`);
} else {
console.log(stdout);
}
}
);

结语

思路和解决方案都比较简单,本文仅作为记录。完整代码被我放到这里了。想要使用的同学可以把这个文件放到你要清理的文件夹下,然后用node执行即可。