技术交流

技术交流

如何利用代码审查提升你的代码质量?

技术交流lanqiao 发表了文章 • 0 个评论 • 754 次浏览 • 2018-11-27 14:14 • 来自相关话题

代码审查会减缓自己代码的进度,但也是一个提升自己代码,并向其他聪明、经验丰富的工程师学习的机会。那么怎么才能充分利用这个机会呢?   尽量让你的代码变动出现在第一轮审查中,只有轻微的评论。如果你的代码审查通常需要多轮的意见,这些技巧 ...查看全部
代码审查会减缓自己代码的进度,但也是一个提升自己代码,并向其他聪明、经验丰富的工程师学习的机会。那么怎么才能充分利用这个机会呢?
 
尽量让你的代码变动出现在第一轮审查中,只有轻微的评论。如果你的代码审查通常需要多轮的意见,这些技巧可以节省你的时间。
 
有效的利用你的代码审查者的时间,这是一种有限的资源。如果他们发现了那种你自己很容易就能发现的问题,这会降低你的团队的整体工作效率。
 在你的代码进行审查之前:
 
重新评估你的代码:不要像以前测试时一样随便把评审代码送去审查。至少要重新从整体上思考一遍。尤其是如果当天时间已经晚了,看看第二天早上是否会有更好的想法。虽然这样可能会拖慢个人代码的变化,这将从长期上带来更大的平均吞吐量。
 
考虑做一次非正式的设计探讨:如果你有不确定的事,和审查者面对面交流,或提前提出异议并要求一次整体设计上的“预审”。
 
自行审查更改:试着从一个什么都不知道的人的角度,尽可能严格的看自己的代码。你的代码审查工具会比IDE更能给你根本上的不同看法。这将很容易的为你免去一次往返。
 
使差异容易理解:一下子出现的多种改变让代码更难审查。当你自行审查,寻找能减少差异的简单更改。例如,保证重要的重构或格式变化。
不要隐藏提交消息中的重要信息:把它也放在代码中。之后阅读代码的人是不可能看提交的消息的。
 当你处理代码审查意见:
 
处理完重要意见后,重新评估你的代码:退一步并用真正全新的眼光去看代码。一旦完成了一组更改,你会发现,这些更改经常会带来额外的改进。正如任何的重构,它可能需要几个步骤来达到最佳设计。
 
弄明白审查者做出的每一个注释:如果你不明白注释背后的原因,不要仅是修改代码——去找审查者弄清楚,以便自己能学习新的东西。
 
回复审查者在代码上的问题:不只是回复——让代码更容易理解(例如,提高一个变量名、更改一个布尔值等等)——或添加注释。以免之后其他人也会有同样的问题。
 
作者:潇潇和她的第二人格
链接:http://www.jianshu.com/p/d6d2256a5362
來源:简书

好与坏的程序员:如何评价程序员的水平才算客观?

技术交流lanqiao 发表了文章 • 0 个评论 • 504 次浏览 • 2018-11-27 14:11 • 来自相关话题

  1.有感于知乎上的一篇关于程序员的讨论。让我突然之间心有戚戚然的感觉。最近一段时间有点江郎才尽的感觉,写不了大的主题,就写点小东西吧。     我们从知乎上面引用的这段小故事开始: 魏文王问扁鹊家 ...查看全部
 
1.有感于知乎上的一篇关于程序员的讨论。让我突然之间心有戚戚然的感觉。最近一段时间有点江郎才尽的感觉,写不了大的主题,就写点小东西吧。
 
 
我们从知乎上面引用的这段小故事开始:
魏文王问扁鹊家里三兄弟谁的医术最好。扁鹊回答说大哥最好,二哥次之,他自己最差。魏文王疑惑了,又问道,为什么扁鹊最有名呢?扁鹊回答说因为大哥治病的时候人没病就防止了,所以毫无名气。二哥呢,病刚起来的时候,就给治好了,大家以为只能治小病。而自己呢,能耐不够,非要到了病的很厉害了才能看出来,治起来的动静就大了。好在还不至于庸医能治好,结果大家看到每次治的都是顽疾,反而出名了。 
 
 
这发生在几千年前的对话是不是靠谱我们不知道,但是拿这话来套程序员的生态圈,真就是一套一个准。
 
2.微软某个大牛软件下面两个不同的组里各有一个大牛程序员,为了不失一般性,我们叫张三和李四吧。张三的特点颇有点大哥的风范,偶尔也充当一下二哥。写的程序严谨,测试也很严谨,几乎不犯错。组里其他同事有错的,也在出大事之前默默的修掉了。
 
李四的风格和扁鹊像,手脚麻利干活快,但是坑也很多。好在李四人聪明又手脚麻利,每次总是能够在自己或者组里其他人搞出惊天动地的大事来的时候,把坑迅速填好,救产品于危难。
 
名气来说,李四是整个产品部门从VP往下数出了名的可靠的火枪手,救火队员。领导信任不可或缺的左膀右臂。张三就默默无闻了。只有小组里面的人知道自己是高手。
说起结局来,李四很快就到了principal,张三么,一直默默无闻,很多年以后终于熬资历到了senior,然后在一次裁员中被裁掉了。
 
3.事情到这里就有点意思了。几千年前的故事,几千年后还在上演。看官可能觉得这个是特例。其实也不然。这样的故事一直在上演。
 
说说另外一个顺利上市扩张的公司的故事。我们知道但凡是初创公司里的员工,都是能够迅速的开发出差不多能用的东西的工程师的天下。但是这个东西有个度,差不多能用的东西短平快带来的副作用其实很大。弄不好就得在未来某个时候全部重写。
 
这个公司的领导层就是这样一群码农自然而然的升上来的,崇尚的就是这种做事风格。但是因为公司大了,产品不能够再到处是bug了,可是公司的test coverage又是一塌糊涂。
 
哪里都是坑。所以每次新版本的发行,都不停的延期延期又延期。
 
公司里我认识的有一个俄罗斯来的人,做事情严谨,写程序的test coverage很好,因为以前合作的关系,知道这个人的工作style,而且知道这个人是我见过的最为优秀的程序员之一。有次我偶遇聊起天来,这位一个劲的和我诉苦,苦不该去这个公司。因为公司里面所有的人崇尚的是救火队员,从未有人觉得好好写code,少出bug是重要的。
 
后来我又认识了一个罗马尼亚来的工程师,也是同一个公司。这位罗马尼亚老兄的程序我就不评价了,实在有点不堪入目。然而我看看linkedin,在此公司混的是风生水起。我再次和俄罗斯人见到的时候,俄罗斯人和我说,这个罗马尼亚人啊,就是个彻头彻尾的hacker。每次做事情,把当前的bug能修掉再说,code一塌糊涂,最后别人都得替他擦屎。但是领导们都很喜欢他啊,能迅速的修好东西让产品出去。
 
4.这事情说到这里,其实可以概括下来两句话:曲突徙薪亡恩泽,焦头烂额为上客。
一个程序员为了不出问题而做的努力,往往没有那些出了问题以后再打鸡血一样去努力解决的人获得的回报多。你说按照这个标准去判断,到底是哪里出错了呢?
 
从这一点来说,我们首先得要看看一个领导是怎么样去评价一个好或者不好的程序员的。在我的经历里面,并不是没有遇到过在意系统结构,对那些能够写出不错的程序,能够防范未然的程序员非常重视的领导。然而更多的领导其实最在乎的依然是如何能够迅速的把东西写完,迅速的发布出去。
 
基于后者的情况越来越普遍,尤其是在比如著名的亚马逊的很多产品组,领导有的是MBA或者产品经理出身的,其评价体系里面,并不会给扁鹊大哥那样的程序员太多发挥的空间。
 
我作为程序员的时候,是非常希望自己可以成为扁鹊大哥这样的牛逼的大神的。我环顾四周的时候,看到拯救公司的英雄们,各个都如同扁鹊,或者扁鹊++。这个问题我很困扰了,读到知乎上的文章,颇心有戚戚然。那么码农们,你们怎么选?
 


来自:51CTO 作者:徐飞
本文标题:好与坏的程序员:如何客观评价程序员的水平?
本文地址:https://www.oschina.net/news/87295/good-and-bad-programmer

以程序员的视角看为什么骑车忘锁会变成欠两千万

技术交流lanqiao 发表了文章 • 0 个评论 • 478 次浏览 • 2018-11-27 14:05 • 来自相关话题

话题:骑车忘锁 3天欠费2千万 竟是系统升级导致   近日,一条骑共享单车忘锁 3天欠费2千万的新闻引发了网友热议。到底这BUG谁背锅?   李先生介绍,他在秦园路一家房产中介上班,他此前注册过摩拜单车, ...查看全部
话题:骑车忘锁 3天欠费2千万 竟是系统升级导致
 
近日,一条骑共享单车忘锁 3天欠费2千万的新闻引发了网友热议。到底这BUG谁背锅?
 
李先生介绍,他在秦园路一家房产中介上班,他此前注册过摩拜单车,本月初去广西旅游时重新开始使用。24日上午,他从团结新村骑车到秦园路上班,可能忘了关锁,直到27日傍晚准备和朋友骑单车去看电影时,才发现自己试用单车23个小时,账户欠款34元。李先生随后拨通了客服电话,客服人员称出于人性化考虑,可以免除这次扣费,但要扣除李先生15分信用分。过了10多分钟后,李先生查看自己账户,发现信用分确实扣了,但账户余额没有归零,而是显示欠费2147万多元,而且尾数一直在增长。他致电客服,客服人员让他不急,称会解决此事。
 
 
7月31上午,李先生的账户数字停留在欠费21474778元。记者联系上摩拜单车相关负责人,其称系统会有不定期更新升级,极个别用户会遇到类似问题。可以拨打客服电话,app端上报故障,或者通过摩拜单车相关微博微信反馈问题,客服人员收到反馈后即刻会按照实际余额修复,用户无需担心。
 
关于这一事件,有人懂行的网友分析是程序员的锅,因为该用户的欠费数字十分接近int类型极限数字,即-2147483648至2147483647;

微信截图_20181127140004.png

 
 
程序员网友评论: 
科普一下,这个钱还真跟最大值有点关系。2147483647,如果单位是分,整数部分就是21474836元。。而这件事儿里的21474778,跟int 最大值 21474836就差58块钱。。也就是说,这个系统的钱很可能是以分为单位的 int 型值。。。至于你说钱用不用 int 存储的问题,你查查支付宝和微信的支付接口,我记得其中一个就是要的以分为单位的int型值。。而且,int能满足需求了,为啥不用呢?

讨论|使用最少的代码就是最好的程序员吗?

技术交流lanqiao 发表了文章 • 0 个评论 • 311 次浏览 • 2018-11-27 14:02 • 来自相关话题

最近在Quora看到了这样一篇文章:Do the best programmers use the fewest lines of code ? 在网上获得了16.7K的Upvote(值得阅读),这个问题与包含的回答无论是对于初入IT的学习者还是步入行业一定时 ...查看全部
最近在Quora看到了这样一篇文章:Do the best programmers use the fewest lines of code ? 在网上获得了16.7K的Upvote(值得阅读),这个问题与包含的回答无论是对于初入IT的学习者还是步入行业一定时间的老司机来说,都是值得去思考学习的。往往很多人,甚至是程序员自己都认为用最少的代码编程才是优秀的证明,但是否真的是在编程中使用的代码越少,对于程序员来说自身能力就越优秀呢?
 

1.png


2.png


微信截图_20181127135704.png

 
 
你怎么认为呢?一起来讨论吧。

如何快速掌握所有编程语言?对你没看错,是所有。

技术交流lanqiao 发表了文章 • 0 个评论 • 617 次浏览 • 2018-11-27 13:44 • 来自相关话题

本文作者:王垠  来源:51CTO技术栈 原文链接:http://developer.51cto.com/art/201708/547360.htm    很多编程初学者至今还在问,我该学习什么程序语言,怎么学习 ...查看全部
本文作者:王垠 
来源:51CTO技术栈
原文链接:http://developer.51cto.com/art/201708/547360.htm
  
很多编程初学者至今还在问,我该学习什么程序语言,怎么学习。今天,我们要讲的不是如何掌握一种程序语言,而是所有的……
 
由于我知道如何掌握“所有”的程序语言,总是感觉这种该学“一种”什么语言的问题比较低级,所以一直没来得及回复他们 。
 
可是逐渐的,我发现原来不只是小白们有这个问题,就连大公司的很多资深工程师,其实也没搞明白。
 
今天我有动力了,想来统一回答一下这个搁置已久的“初级问题”。类似的话题貌似曾经写过,然而现在我想把它重新写一遍。因为在跟很多人交流之后,我对自己头脑中的(未转化为语言的)想法,有了更精准的表达。
 
如果你存在以下的种种困惑,那么这篇文章也许会对你有所帮助:

你是编程初学者,不知道该选择什么程序语言来入门。

你是资深的程序员或者团队领导,对新出现的种种语言感到困惑,不知道该“投资”哪种语言。

你的团队为使用哪种程序语言争论不休,发生各种“宗教”斗争。

你追逐潮流采用了某种时髦的语言,结果两个月之后发现深陷泥潭,痛苦不堪……
  
程序员的岗位往往会要求熟悉某些语言,甚至某些奇葩的公司要求你“深入理解 OOP 或者 FP 设计模式”。对于在职的程序员,程序语言至今仍然是可以争得面红耳赤的宗教话题。它的宗教性之强,以至于我在批评和调侃某些语言(比如 Go 语言)的时候,有些人会本能地以为我是另外一种语言(比如 Java)的粉丝。显然我不可能是任何一种语言的粉丝,对于任何从没见过的语言,我都是直接拿起来就用,而不需要经过学习的过程。
 
看了这篇文章,也许你会明白我为什么可以达到这个效果。理解了这里面的东西,每个程序员都应该可以做到这一点。嗯,但愿吧。
 
 
重视语言特性,而不是语言
 
很多人在乎自己或者别人是否“会”某种语言,对“发明”了某种语言的人倍加崇拜,为各种语言的孰优孰劣争得面红耳赤。这些问题对于我来说都是不存在的。
 
虽然我写文章批评过不少语言的缺陷,在实际工作中我却很少跟人争论这些。如果有其他人在我身边争论,我甚至会戴上耳机,都懒得听他们说什么 ;
 
为什么呢?归根结底的原因是我重视的是“语言特性”,而不是整个的“语言”。我能用任何语言写出不错的代码,就算再糟糕的语言也差不了多少。 
 
任何一种“语言”,都是各种“语言特性”的组合。
 
打个比方吧,一个程序语言就像一台电脑。它的牌子可能叫“联想”,或者“IBM”,或者“Dell”,或者“苹果”。那么,你可以说苹果一定比 IBM 好吗?
 
你不能,你得看看它里面装的是什么型号的处理器,有多少个核,主频多少,有多少 L1 cache,L2 cache……,有多少内存和硬盘,显示器分辨率有多大,显卡是什么 GPU,网卡速度,等等各种“配置”。有时候你还得看各个组件之间的兼容性。
 
 
 
这些配置对应到程序语言里面,就是所谓“语言特性”。
 
举一些语言特性的例子:

变量定义

算术运算

for 循环语句,while 循环语句

函数定义,函数调用

递归

静态类型系统

类型推导

lambda 函数

面向对象

垃圾回收

指针算术

goto 语句
 
这些语言特性,就像你在选择一台电脑的时候,看它里面是什么配置。
选电脑的时候,没有人会说 Dell 一定是最好的,他们只会说这个型号里面装的是 Intel 的 i7 处理器,这个比 i5 的好,DDR3 的内存比 DDR2 的快这么多,SSD 比磁盘快很多,ATI 的显卡是垃圾…… 如此等等。
 
程序语言也是一样的道理。对于初学者来说,其实没必要纠结到底要先学哪一种语言,再学哪一种。
 
曾经有人给我发信问这种问题,纠结了好几个星期,结果一种语言都还没开始学。有这纠结的时间,其实都可以把他纠结过的语言全部掌握了。
 
 
初学者往往不理解,每一种语言里面必然有一套“通用”的特性。比如变量,函数,整数和浮点数运算,等等。这些是每个通用程序语言里面都必须有的,一个都不能少。
 
你只要通过“某种语言”学会了这些特性,掌握这些特性的根本概念,就能随时把这些知识应用到任何其他语言。你为此投入的时间基本不会浪费。
 
所以初学者纠结要“先学哪种语言”,这种时间花的很不值得,还不如随便挑一个语言,跳进去。
 
如果你不能用一种语言里面的基本特性写出好的代码,那你换成另外一种语言也无济于事。你会写出一样差的代码。
 
我经常看到有些人 Java 代码写得相当乱,相当糟糕,却骂 Java 不好,雄心勃勃要换用 Go 语言。
 
这些人没有明白,是否能写出好的代码在于人,而不在于语言。如果你的心中没有清晰简单的思维模型,你用任何语言表述出来都是一堆乱麻。如果你 Java 代码写得很糟糕,那么你写 Go 语言代码也会一样糟糕,甚至更差。
 
很多初学者不了解,一个高明的程序员如果开始用一种新的程序语言,他往往不是去看这个语言的大部头手册或者书籍,而是先有一个需要解决的问题。
 
手头有了问题,他可以用两分钟浏览一下这语言的手册,看看这语言大概长什么样。
然后,他直接拿起一段例子代码来开始修改捣鼓,想法把这代码改成自己正想解决的问题。在这个简短的过程中,他很快的掌握了这个语言,并用它表达出心里的想法。
 
 
在这个过程中,随着需求的出现,他可能会问这样的问题:

这个语言的“变量定义”是什么语法,需要“声明类型”吗,还是可以用“类型推导”?

它的“类型”是什么语法?是否支持“泛型”?泛型的 “variance” 如何表达?

这个语言的“函数”是什么语法,“函数调用”是什么语法,可否使用“缺省参数”?
 
 
注意到了吗?上面每一个引号里面的内容,都是一种语言特性(或者叫概念)。
 
这些概念可以存在于任何的语言里面,虽然语法可能不一样,它们的本质都是一样的。比如,有些语言的参数类型写在变量前面,有些写在后面,有些中间隔了一个冒号,有些没有。
 
这些实际问题都是随着写实际的代码,解决手头的问题,自然而然带出来的,而不是一开头就抱着语言手册看得仔仔细细。
 
因为掌握了语言特性的人都知道,自己需要的特性,在任何语言里面一定有对应的表达方式。如果没有直接的方式表达,那么一定有某种“绕过方式”。
 
如果有直接的表达方式,那么它只是语法稍微有所不同而已。所以,他是带着问题找特性,就像查字典一样,而不是被淹没于大部头的手册里面,昏昏欲睡一个月才开始写代码。
 
掌握了通用的语言特性,剩下的就只剩某些语言“特有”的特性了。
 
研究语言的人都知道,要设计出新的,好的,无害的特性,是非常困难的。所以一般说来,一种好的语言,它所特有的新特性,终究不会超过一两种。
 
如果有个语言号称自己有超过 5 种新特性,那你就得小心了,因为它们带来的有可能不是优势,而是灾难!
 
同样的道理,最好的语言研究者,往往不是某种语言的设计者,而是某种关键语言特性的设计者(或者支持者)。
 
著名的计算机科学家 Dijkstra 就是“递归”的强烈支持者。现在的语言里面都有递归,然而你可能不知道,早期的程序语言是不支持递归的。
 
直到 Dijkstra 强烈要求 Algol 60 委员会加入对递归的支持,这个局面才改变了。Tony Hoare 也是语言特性设计者。
 
他设计了几个重要的语言特性,却没有设计过任何语言。另外大家不要忘了,有个语言专家叫王垠,他是早期 union type 的支持者和实现者,也是 checked exception 特性的支持者,他在自己的博文里指出了 checked exception 和 union type 之间的关系 。
 
很多人盲目的崇拜语言设计者,只要听到有人设计(或者美其民曰“发明”)了一个语言,就热血沸腾,佩服的五体投地。
 
他们却没有理解,其实所有的程序语言,不过是像 Dell,联想一样的“组装机”。语言特性的设计者,才是像 Intel,AMD,ARM,Qualcomm 那样核心技术的创造者。
 
 
 
合理的入门语言
 
所以初学者要想事半功倍,就应该从一种“合理”的,没有明显严重问题的语言出发,掌握最关键的语言特性,然后由此把这些概念应用到其他语言。哪些是合理的入门语言呢?
我个人觉得这些语言都可以用来入门:

Scheme

C

Java

Python

JavaScript
 
 
那么相比之下,我不推荐用哪些语言入门呢?

Shell

PowerShell

AWK

Perl

PHP

Basic

Go
 
总的说来,你不应该使用所谓“脚本语言”作为入门语言,特别是那些源于早期 Unix 系统的脚本语言工具。
 
采用脚本语言学编程,一个很严重的问题就是使得学习者抓不住关键。
 
脚本语言往往把一些系统工具性质的东西(比如正则表达式,Web 概念)加入到语法里面,导致初学者为它们浪费太多时间,却没有理解编程最关键的概念:变量,函数,递归,类型……
 
不推荐 Go 语言的原因类似,虽然 Go 语言不算脚本语言,然而他的设计者显然不明白自己在干什么。所以使用 Go 语言来学编程,你不能专注于最关键,最好的语言特性。
 
 
 
掌握关键语言特性,忽略次要特性
 
为了达到我之前提到的融会贯通,一通百通的效果,初学者应该专注于语言里面最关键的特性,而不是被次要的特性分心。
这里举一些次要语言特性的例子:

C 语言的语句块,如果里面只有一条语句,可以不打花括号。

Go 语言的函数参数类型如果一样可以合并在一起写,比如 func foo(s string, x, y, z int, c bool) { ... }。

Perl 把正则表达式作为语言的一种特殊语法。

JavaScript 语句可以在某些时候省略句尾的分号。

Haskell 和 ML 等语言的 currying。
 
 
 
自己动手实现语言特性
 
在基本学会了各种语言特性,能用它们来写代码之后,下一步的进阶就是去实现它们。
只有实现了各种语言特性,你才能完全地拥有它们,成为它们的主人。否则你就只是它们的使用者,你会被语言的设计者牵着鼻子走。
有个大师说得好,完全理解一种语言最好的方法就是自己动手实现它,也就是自己写一个解释器来实现它的语义。
但我觉得这句话应该稍微修改一下:完全理解一种“语言特性”最好的方法就是自己亲自实现它。
注意我在这里把“语言”改为了“语言特性”。你并不需要实现整个语言来达到这个目的,因为我们最终使用的是语言特性。只要你自己实现了一种语言特性,你就能理解这个特性在任何语言里的实现方式和用法。
 
学习 SICP 的时候,大家都会亲自用 Scheme 实现一个面向对象系统。
用 Scheme 实现的面向对象系统,跟 Java,C++,Python 之类的语言语法相去甚远,然而它却能帮助你理解任何这些 OOP 语言里面的“面向对象”这一概念,它甚至能帮助你理解各种面向对象实现的差异。
这种效果是你直接学习 OOP 语言得不到的,因为在学习 Java,C++,Python 之类语言的时候,你只是一个用户,而用 Scheme 自己动手实现了 OO 系统之后,你成为了一个创造者。
类似的特性还包括类型推导,类型检查,惰性求值,如此等等。我实现过几乎所有的语言特性,所以任何语言在我的面前,都是可以被任意拆卸组装的玩具,而不再是凌驾于我之上的神圣。 
 
 
总结
 
写了这么多,重要的话重复三遍:语言特性,语言特性,语言特性!不管是初学者还是资深程序员,应该专注于语言特性,而不是纠结于整个的“语言品牌”。只有这样才能达到融会贯通,拿起任何语言几乎立即就会用,并且写出高质量的代码。

据说只有程序员才能看懂的时钟,你敢来挑战吗?

技术交流lanqiao 发表了文章 • 0 个评论 • 182 次浏览 • 2018-11-27 11:10 • 来自相关话题

最近发现一个据说只有程序员和数学家才能看懂的“数学钟”,也就是非常流行的下面这幅图:        用这个钟看时间,你的智 ...查看全部
最近发现一个据说只有程序员和数学家才能看懂的“数学钟”,也就是非常流行的下面这幅图:

微信截图_20181127110308.png

 
 
 
 用这个钟看时间,你的智商够用么?
快来挑战一下吧
 
答案在这里
 

640.webp_.jpg

 
据说12个全能看懂的,在学校肯定是学霸
 
 
 

程序员总工会:以后写代码要按行数收费?那我能写到马云破产!

技术交流lanqiao 发表了文章 • 0 个评论 • 67 次浏览 • 2018-11-27 11:03 • 来自相关话题

程序员总工会发布了一条消息:以后我们的代码要按行收费。客户们立即就炸了锅,按代码收费?那你程序员不是想怎么写就怎么写,我们让你们做个项目,你写个空行,写点注释什么的,谁来管?   物竞天择。有人有需求就立即有人响应。正当这些客户无所 ...查看全部
程序员总工会发布了一条消息:以后我们的代码要按行收费。客户们立即就炸了锅,按代码收费?那你程序员不是想怎么写就怎么写,我们让你们做个项目,你写个空行,写点注释什么的,谁来管?
 
物竞天择。有人有需求就立即有人响应。正当这些客户无所适从的时候,一个职业产生了:代码缩行师。客户在审查项目交付的时候会先去缩行事务所请一位缩行师。缩行师的职责就是,在保证不改变原有系统功能的前提下,将程序最大程度的缩减行数,缩行师按照缩减行数的百分之 10 收费。
 
缩行师是程序员最大的天敌。
 
缩行师也是分等级的,最低级的缩行师只能缩缩空行,挪一挪括号,一般人都能做,大抵是被程序员看不起的,往上一级就要稍微懂一点编程知识了,知道怎么把定义的变量合到一行,怎么去掉可以去掉的括号,他们已经一脚踏入了领域和空间的境界了,他们许多是程序员做不下去为了生计讨口饭吃,倘若搞好客户关系,也能活的很滋润。
 
再往上一级,这些人是缩行师界的精英,而且随时可以成为最优秀的程序员,他们把无聊的体力工作交给下边的人去做,自己则和程序员斗智斗勇,“你这个变量没必要定义”,“你这两处的功能重复了,回去重构一下”,“你这个是自己造轮子,去找别人开源写好的”。
 
他们有的曾经是最好的程序员,有的是因为忍受不了缩行师的百般挑刺,无奈转行,有的是因为满足内心找茬的欲望。他们有的是从事多年的缩行师,从学徒起一步一步坐起,扎扎实实的走到现在的地位,这个级别的缩行师是各大缩行事务所争抢的对象。
 
每个客户都以邀请到他们为荣,预约的人多了,事务所开始准备“缩号”,客户只有摇到了缩号才能有幸邀请到这些人,有的客户更是为专家缩号大打出手,于是又催生了一种叫“缩牛”的职业,不再赘述。
 
他们某种程度上已经达到了缩行师的顶峰,但还有一种传说中的存在,他们是打破规则的存在,如果你侥幸看到他们的杰作,你就会发现上面提到的都是浮云。一行,只需要一行就够了,什么工程,什么项目,只需要一行。jQuery.min.js 就是他们的杰作。
 
有一个站在巅峰的男人曾经应拉里 · 佩奇的邀请将谷歌的所有代码写成了一行,并且能完整的实现了谷歌现有的所有功能,人们甚至发现谷歌搜索快了将近 30%。后来有华尔街和硅谷的资深从业者看到这行代码后久久不能平静,对这行代码给出了 5600 亿美元的估值,当然这行代码一般人是看不完的,据说这行代码的长度可以从加州连接到 M31 星系。
 
程序员的生活变得越来越艰难,程序员联盟本身的福祉:变成了灾难,尽管随着代码的行数减少,单行的价格在不断的升高,程序员行业的整体质量也在不断的提高,但依旧艰难。程序员联盟又做了一个艰难的决定:最终的代码每行不得多于 200 字符。对于一般的程序,一行 200 字符足够了,即使一行内容长,也可以分行解决。
 
在程序员联盟认为一劳永逸的同时,缩行师的行业发生了惊天动地的变化,对于底层的没有太大变化,但对于习惯把程序挤到一行的从业者来说无异于晴天霹雳。当原来的方法不适用的时候他们又何去何从?
 
在进行了多次缩行师技术交流峰会之后他们找到了一个对策,那就是将计就计,把每行的代码都调整到 200 字符,在规则的范围内达到最大的收益。于是缩行师行会陆续制订了缩行师的规范,守则。
 
越来越多的人开始分享他们把代码调整成 200 字符的技巧,有的缩行师贴出代码提问“怎么把这段代码缩成标准的格式?”,就会有很多热心的缩行师为其解答,也会有不少伪装成缩行师的程序员冷嘲热讽甚至谩骂。
 
随着缩行技术的发展和普及,程序员和客户由一开始看到凹凸不平的代码,变成一个个整齐的长方形的代码的一脸懵逼,到渐渐习惯再到麻木。很多年过去以后,新的程序员甚至以为长方型的代码就应该是代码本来的样子。
 
程序员的世界也发生了很大的变化,越来越多的客户为了节省一笔缩行师的费用,开始要求程序员去写每行 200 个字符的长方形代码,程序员经过了这么多年的耳濡目染也渐渐的接受了,这第一批写方块代码的程序员渐渐引领了代码的潮流《编程方块》《代码方块之道》《方块之美》《重构 – 方块化改善既有代码》。这些书开始变得越来越畅销。
 
缩行师除了偶尔被叫去做做 code review,需要的越来越少了,整个行业也开始没落。
 
有人的地方就有江湖,有利益的地方就有冲突。
 
 网友:如果代码按行付费,我能写到马云破产

js Date对象常用操作

技术交流lanqiao 发表了文章 • 0 个评论 • 44 次浏览 • 2018-11-26 14:11 • 来自相关话题

关于日期的操作有两种:操作日期时间,操作时间戳。下面是相关API 时间戳,通常是一个字符序列,唯一地标识某一刻的时间,是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。 ...查看全部
关于日期的操作有两种:操作日期时间,操作时间戳。下面是相关API
时间戳,通常是一个字符序列,唯一地标识某一刻的时间,是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。
 
一、创建Date()对象
 
var date1 = new Date();
// 参数是时间戳
var date2 = new Date(1486915200000);
// 参数是日期字符串
var date3 = new Date('2017/2/13');
// 参数是年、月、日...,其中年月日是必须的
var date4 = new Date('2017', '2', '13');
// Mon Feb 13 2017 18:09:31 GMT+0800 (中国标准时间)
console.log(date1)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date2)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date3)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date4)

 
二、获取时间
 
1、获取当前时间
1.Date() 或者new Date()
// Mon Feb 13 2017 15:46:34 GMT+0800 (中国标准时间)
console.log(Date())
// Mon Feb 13 2017 15:46:34 GMT+0800 (中国标准时间)
console.log(new Date())
2.get系列方法,常用的是获取年/月/日/时/分/秒,获取当前时间要求日期对象为当前日期
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。注意不要使用getYear()。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
var date = new Date()
var year = date.getFullYear()
// 2017年
console.log(year + '年')

 
2、获取固定的时间
(1)new Date("2012/12/12");
(2)set系列方法,常用的是设置年/月/日/时/分/秒
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。注意不要使用setYear()方法。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
var date = new Date('2016/2/13')// Sat Feb 13 2016 00:00:00 GMT+0800 (中国标准时间)
console.log(date)
var date1 = new Date()
date1.setFullYear('2016')
// Sat Feb 13 2016 17:55:22 GMT+0800 (中国标准时间)
console.log(date1)

 
3.通过固定的时间戳获取固定的时间
setTime() 以毫秒设置 Date 对象。
var date1 = new Date()
date1.setTime(1486915200000)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date1)

 
4、获取本地时间格式
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
var date2 = new Date()
// 2017/2/13 下午5:30:17
console.log(date2.toLocaleString())
// 下午5:30:17
console.log(date2.toLocaleTimeString())
// 2017/2/13
console.log(date2.toLocaleDateString())

 
三、获取时间戳
 
1、获取当前时间戳
Date.now()、+ new Date()、Date.parse(new Date())、new Date().getTime()
var date1 = Date.now()
var date2 = + new Date()
var date3 = Date.parse(new Date())
var date4 = new Date().getTime()
// 1486977645739
console.log(date1)
// 1486977645739
console.log(date2)
// 1486977645000
console.log(date3)
// 1486977645739
console.log(date4)

从上面输出结果可以看到Date.parse()与其他不同,有点奇葩
 
2、获取固定时间戳
 
Date.parse(new Date())、new Date().getTime()
var date2 = + new Date('2017/2/13')
var date3 = Date.parse(new Date('2017/2/13'))
var date4 = new Date('2017/2/13').getTime()
// 1486915200000
console.log(date2)
// 1486915200000
console.log(date3)
// 1486915200000
console.log(date4)

 
四、开发应用场景
 
1、自定义格式日期,如2015年3月19日 12:00:00这种格式
var date = new Date();
// 2017年02月13日 18:29:39
console.log(formatDateTime(date))
function formatDateTime(date) {
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
var minute = date.getMinutes();
minute = minute < 10 ? ('0' + minute) : minute;
var second = date.getSeconds();
second = second < 10 ? ('0' + second) : second;
return y + '年' + m + '月' + d+'日 '+h+':'+minute + ':' + second;};

 
2、倒计时效果
// 写文章时时间为为2017/2/13
var endDate = new Date('2017/3/13')
// 实现距离距离2017/2/13 00:00:00的倒计时效果
var t = setInterval(function(){
var date = ShowCountDown(endDate,new Date());
console.log(date)
}, 1000);
function ShowCountDown(endDate,nowDate) {
var date = ''
var leftTime=endDate.getTime()-nowDate.getTime();
if (leftTime >= 0) {
var leftsecond = parseInt(leftTime/1000);
var day1=Math.floor(leftsecond/(60*60*24));
var hour=Math.floor((leftsecond-day1*24*60*60)/3600);
var minute=Math.floor((leftsecond-day1*24*60*60-hour*3600)/60);
var second=Math.floor(leftsecond-day1*24*60*60-hour*3600-minute*60);
day1 = day1 < 10 ? ('0' + day1) : day1;
hour = hour < 10 ? ('0' + hour) : hour;
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
date = "还剩:"+day1+"天"+hour+"小时"+minute+"分"+second+"秒";
}else{
clearInterval(t)
date = "还剩:00天00小时00分00秒";
}
return date
}

全球最杰出的14位程序员,你的榜样是谁?

技术交流lanqiao 发表了文章 • 0 个评论 • 181 次浏览 • 2018-11-26 14:04 • 来自相关话题

  近日,ITWorld整理全球最杰出的14位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后)  1. Jon Skeet 个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的 ...查看全部
 
近日,ITWorld整理全球最杰出的14位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后)
 1. Jon Skeet
个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的问答量保持在425个左右。
个人简介/主要荣誉:谷歌软件工程师,代表作有《深入理解C#(C# In Depth)》。
网络上对Jon Skeet的评价:


  • “他根本不需要调试器,只要他盯一下代码,错误之处自会原形毕露。”


  • “如果他的代码没有通过编译的时候,编译器就会道歉。”


  • “他根本不需要什么编程规范,他的代码就是编程规范。”


 2. Gennady Korotkevich
个人名望:编程大赛神童
个人简介/主要荣誉:年仅11岁时便参加国际信息学奥林比克竞赛,创造了最年轻选手的记录。在2007-2012年间,总共取得6枚奥赛金牌;2013年美国计算机协会编程比赛冠军队成员;2014年Facebook黑客杯冠军得主。截止目前,稳居俄编程网站Codeforces声望第一的宝座,在TopCoder算法竞赛中暂列榜眼位置。
网络上对Gennady Korotkevich的评价:


  • “一个编程神童。”


  • “他太令人惊讶了,他相当于我在白俄罗斯建立了一支强大的编程队伍”


  • “彻底的编程天才”


 3. Linus Torvalds
个人名望:Linux之父
个人简介/主要荣誉:


  • Linux和Git之父,一个开源的操作系统;


  • 1998年EFF(电子前沿基金会)先锋奖得主;


  • 2000年英国计算机学会Lovelace奖章得主;


  • 2012年千禧技术奖得主;


  • 2014年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;


  • 2008年入选计算机历史博物馆名人堂;


  • 2012年入选互联网名人堂。


网络上对Linus Torvalds的评价:
“他简直优秀得无与伦比。” 4. Jeff Dean
个人名望:谷歌搜索索引技术的幕后大脑。
个人简介/主要荣誉:谷歌大规模分布式计算系统的设计师,例如:站点爬行,索引与搜索,在线广告,MapReduce,BigTable以及Spanner(分布式数据库)。2009年进入美国国家工程院;2012年美国计算机协会SIGOPS Mark Weiser Award以及Infosys Foundation Award奖项得主。
网络上对Jeff Dean的评价:


  • “使数据挖掘取得了突破性发展。”


  • “能够在各项工作都已安排得满满的情况下,仍能构思、创作、发布出MapReduce以及BigTable这些令人赞叹不已的工具。”


  5. John Carmack
个人名望:第一人称射击游戏经典师祖《Doom》(毁灭战士)之父
个人简介/主要荣誉:id Software公司联合创始人,制作了很多脍炙人口的游戏,如:《德军司令部》(Wolfenstein 3D,又名《刺杀希特勒》)、《Doom》(毁灭战士)、《Quake》(雷神之锤)。引领了很多计算机显示领域的新技术,包括:adaptive tile refresh(切片适配更新)、binary space partitioning(二元空间分割)、surface caching(平面缓存);2001年进入互动艺术与科学学院名人堂;2010年收获游戏开发者精选奖终身成就奖殊荣。
网络上对John Carmack的评价:


  • “制作了很多革命性的第一人称射击游戏,影响了一代又一代的游戏设计者。”


  • “他能在一周内就完成任何的基础设计工作。”


  • “他是会编程的莫扎特。”


 6. Richard Stallman
个人名望:Emacs文本编辑器,多种语言编译器GCC的创造者。
个人简介/主要荣誉:GNU项目发起人,开发出很多核心工具,例如:Emacs,GCC,GDB和GU Make Free Software公司创始人。1990年获得美国计算机协会Grace Murray Hopper奖项;1998年获得EFF(电子前沿基金会)先锋奖。
网络上对Richard Stallman的评价:


  • “曾独自一人与一众Lisp黑客好手进行比赛,那次是Symbolics对阵LMI。”


  • “尽管我们对事物有不同看法,但他一定是最有影响力的程序员,无论现在还是将来。”


 7. PetrMitrechev
个人名望:最有竞争力的程序员之一。
个人简介/主要荣誉:分别在2000年与2012年收获国际奥林匹克信息竞赛金牌;2011年与2013年赢得Facebook黑客杯赛;在2006年赢得谷歌Code Jam程序设计大赛以及TopCoder算法公开赛;截止目前,暂列TopCoderPetr算法竞赛首位,在Codeforces中排行第五。
网络上对PetrMitrechev的评价:
“即使在印度,他都是程序设计竞赛者心中的偶像。” 8. FabriceBellard
个人名望:开发出模拟处理器的自由软件QEMU。
个人简介/主要荣誉:开发了许多著名的开源软件,例如:QEMU硬件模拟虚拟平台,FFmpeg多媒体数据处理软件,Tiny C编译器,LZEXE解压缩软件。在2000年与2001年赢得国际C语言混乱代码设计大赛冠军;2011年赢得谷歌O’Reilly开源设计奖;前圆周率计算精度世界纪录保持者。
网络上对FabriceBellard的评价:


  • “他的作品总是令人印象深刻和光芒四射。”


  • “世界上最有创造力的程序员。”


  • “他是软件工程领域的尼古拉·特斯拉。”


 9. Doug Cutting
个人名望:开发出开源全文检索引擎工具包Lucene。
个人简介/主要荣誉:除了Lucene,还开发了著名的网络爬虫工具Nutch,分布式系统基础架构Hadoop,这些大师级作品都是开源的。目前任职Apache软件基金会主席。
网络上对Doug Cutting的评价:


  • “他开发出卓越超群的全文检索引擎工具包(Lucene/Solr)以及为世界打开了一扇通往大数据的大门。”


  • “开源的Lucene以及Hadoop为全球创造了无数的财富以及就业机会。”


 10. Donald Knuth
个人名望:《计算机程序设计艺术》(The Art of Computer Programming)一书的作者。
个人简介/主要荣誉:著有数本影响深远的程序设计理论书籍;发明了TeX数字排版系统;在1971年成为首位获得美国计算机协会Grace Murray Hopper奖项的人士;1974年获得美国计算机协会A.M. Turning奖项;1979年被授予国家科技奖章;1995年被授予电气和电子工程师协会John von Neumann奖章;1998年入选计算机历史博物馆名人录。
网络上对Donald Knuth的评价:
“我曾经有幸使用过一款无限接近零错误的大型软件,它就是TeX。” 11. Anders Hejlsberg
个人名望:创造了Turbo Pascal。
个人简介/主要荣誉:Turbo Pascal的原作者,Turbo Pascal是最受欢迎的Pascal编译器之一,也首次为Pascal带来整合的开发环境。主导开发了Turbal Pascal继承者Delphi。首席C#设计师与架构师;2011年获得Dr.Dobb’s Excellence in Programming荣誉。
网络上对Anders Hejlsberg的评价:
“我崇敬的程序大师,是我通往专业软件设计师道路上的领路人。” 12. Ken Thompson
个人名望:创造了Unix
个人简介/主要荣誉:与Dennis Ritchie一起创造了Unix。
同时也是B程序语言,UTF-8编码,ed文本编辑器的创造者、设计者。Go程序语言的开发者之一。1983年与Ritchie一起被授予美国计算机协会A.M.
Turning奖项;1994年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;1998年被授予国家科技奖章;1997年入选计算机历史博物馆名人录。

网络上对Ken Thompson的评价:
“世界上最杰出的程序员。” 13. Adam D’Angelo
个人名望:问答SNS网站Quora的创办人之一。
个人简介/主要荣誉:前Facebook CTO、研发副总裁,创建了news feed(信息流)的基础架构。SNS网站Quora的创办人之一。2001年以高中生身份参加美国计算机奥林匹克竞赛,最终取得第八名的佳绩。2004年帮助加州理工学院摘下ACM国际大学生程序设计大赛团体银牌。2005年进入Topcoder大学校际算法竞赛决赛
网络上对Adam D’Angelo的评价:


  • “一位程序设计全才。”


  • Mark Zuckerberg的评价:


  • “我做的每一个好东西,他都能做出六个。”


 14. Sanjay Ghemawat
 
个人名望:Google架构师团队中的核心人物。
个人简介/主要荣誉:帮助Google设计并推出了大型发布式计算系统,包括:MapReduce、BigTable、Spanner以及Google文件系统。开发出Unix ical日历系统;2009年进入国家工程院;2012年美国计算机协会Infosys Foundation Award奖项得主。
网络上对Sanjay Ghemawat的评价:
“Jeff Dean的最佳拍档。”

一个程序员要扔掉多少代码,才能成为真正的程序员

技术交流lanqiao 发表了文章 • 0 个评论 • 114 次浏览 • 2018-11-26 14:02 • 来自相关话题

俗语说,女怕嫁错郎,男怕入错行。   程序员这行当,不贫不富,靠技术吃饭,一直还算个体面职业。进了程序员这行的兄弟们,即便日后飞黄腾达了,谈起早年的编程生涯,都还是自豪的。   不过呢,程序员这个职业,有 ...查看全部
俗语说,女怕嫁错郎,男怕入错行。
 
程序员这行当,不贫不富,靠技术吃饭,一直还算个体面职业。进了程序员这行的兄弟们,即便日后飞黄腾达了,谈起早年的编程生涯,都还是自豪的。
 
不过呢,程序员这个职业,有个挺悲哀的地方,那就是无效工作的占比极高。
 
直接点说,程序员辛辛苦苦敲的代码,大部分都是没用的,都是要扔掉的。
 
这个特点非常鲜明,和别的职业差距相当大。
 
和农民比,农民种的作物,几乎很少浪费。有的年景里,白菜丰收价格太低,但也能喂猪吧? 即便只能烂在地里,那也能肥田呢,不算完全浪费。
 
和建筑工人比,那建筑工人砌砖盖房都是要用上几十年的。 虽然也有烂尾楼,但占比非常低吧? 盖了一半的楼,因为质量不行拆了重新打地基的,也很少见吧? 即便有新盖好的房子,被强拆了,但那也是少数。
 
哦,有一种职业,无效工作比例高,那就是军人。军人天天苦练,要打千万发子弹,但大部分军人终其一生,都不曾将子弹射进过人体。但是呢,从另一个角度看,军人的有效工作还得把震慑算进去,扛着枪晃悠晃悠效果就很好了。这样说来,军人的无效工作比例那就真不算低。
 
可程序员就不一样了。
 
随便在上地西二旗拦住一个尘满面、鬓已霜的男子,问他这十年或者二十年所写的代码,有百分之多少,还在运行中? 他细想之下,怕是要泪千行的。
 
要是有程序员反驳说,不对啊,我多年来写的代码几乎都跑起来了,都用起来了啊。那他肯定是做企业应用项目的,而不是做产品的。企业应用项目么,怎么着胡乱对付也能用个几年。做产品的,不扔个几版,能出精品么?
 
程序员的宿命啊,就是被扔,这代码啊,是写了扔,扔了写。
 
而且,程序员的代码扔了就彻底扔了,一点用处都没有。衣服扔了还可以捐给灾区,废代码是不能捐给灾区的,更不能喂猪,烂在硬盘里也不能肥硬盘。
 
彻彻底底的无用废物。
 
兄弟连里,有句话是这样说的:我们是伞兵,注定要被包围。听来特别过瘾,特别有英雄气概。
 
程序员应该说:我们是程序员,注定代码是要被扔掉的。这句话听起来,却是别有一番凄凉滋味啊。
 
不要拿 Ken,Linus之类的大牛来说事,他们是“创造者”,“创造者”不是职业,也不能用百分比来衡量有效工作。
 
扔就扔吧,好在,程序员们都是有佛性的,懂得色即是空空即是色,一切皆是虚幻,本来都是虚拟数码,扔吧。再说,扔的多,开发工作机会就更多。
 
老板们其实也并不心疼,虽然扔的都是他们的钱。
 
有位老板,打过一个比方:这个代码呢,和精子也差不多,写代码就跟啪啪啪一样,你不能指望次次都孕育成果。过程重要,要学会享受过程。
 
这位老板就喜欢扔代码。
 
开发到了一半,需求有问题,扔;开发完了上线,架构不对顶不住压力,扔;上线了找用户,没有用户愿意用,扔;上线有用户用了半年,界面过时不好看,扔;不喜欢某个程序员,把这厮写的都给我扔了,扔了;
 
不过,有意思的是,这个老板最成功的产品,乃是10年前开发出来的,技术早就老的要掉牙,却一直舍不得扔。
 
做过程序员,写过代码的老板,更喜欢扔代码,团队里浪费也更多。
 
这些有技术情结的老板,喜欢追求完美,都有强迫症,还热衷维持庞大的程序员队伍。浪费是浪费,但过瘾啊。
 
而营销出身的老板,就没那么浪漫,多流于市侩,总要问:能改改凑活上线用么?
 
若是问程序员喜欢那种风格的老板? 程序员当然有自己的偏好和选择了,就是给钱多的那个。
 
有创意的电视人,可以在程序员中,办一个调查类的比赛节目,看看谁的代码扔掉比率最高。节目名就叫,代码去哪儿了。也可以叫,扔掉吧代码。
 
有些行业追求作品的流芳千古,比如绘画写作这类艺术行当。但有趣的是,其行业中的顶尖人物,却容易逆反。例如,作家卡夫卡死前烧掉自己的小说,画家高更死前烧掉自己的画作,这些天才觉得没必要跟满世界的傻逼废话,没人能看懂自己,自己死了更没法去解释奥义。唉,才高寂寞啊,烧掉干净。
 
程序员不会。 程序员首先就不会流芳千古,更不用死前烧掉自己的硬盘。程序员的代码,在离死前很久,就都已经扔掉了,彻底扔干净了。
 
万一在临死时分,竟然还有自己写的代码在世界上运行,程序员就会很恐慌:我操,我死了,代码谁来维护啊?
 
所以,代码还是早早扔掉为好。
 
 
来源:伊成Blog(lvoyee.com) 

如何快速提升算法能力?

回复

技术交流youqi100 发起了问题 • 1 人关注 • 0 个回复 • 33 次浏览 • 2018-10-31 19:22 • 来自相关话题

如何利用代码审查提升你的代码质量?

技术交流lanqiao 发表了文章 • 0 个评论 • 754 次浏览 • 2018-11-27 14:14 • 来自相关话题

代码审查会减缓自己代码的进度,但也是一个提升自己代码,并向其他聪明、经验丰富的工程师学习的机会。那么怎么才能充分利用这个机会呢?   尽量让你的代码变动出现在第一轮审查中,只有轻微的评论。如果你的代码审查通常需要多轮的意见,这些技巧 ...查看全部
代码审查会减缓自己代码的进度,但也是一个提升自己代码,并向其他聪明、经验丰富的工程师学习的机会。那么怎么才能充分利用这个机会呢?
 
尽量让你的代码变动出现在第一轮审查中,只有轻微的评论。如果你的代码审查通常需要多轮的意见,这些技巧可以节省你的时间。
 
有效的利用你的代码审查者的时间,这是一种有限的资源。如果他们发现了那种你自己很容易就能发现的问题,这会降低你的团队的整体工作效率。
 在你的代码进行审查之前:
 
重新评估你的代码:不要像以前测试时一样随便把评审代码送去审查。至少要重新从整体上思考一遍。尤其是如果当天时间已经晚了,看看第二天早上是否会有更好的想法。虽然这样可能会拖慢个人代码的变化,这将从长期上带来更大的平均吞吐量。
 
考虑做一次非正式的设计探讨:如果你有不确定的事,和审查者面对面交流,或提前提出异议并要求一次整体设计上的“预审”。
 
自行审查更改:试着从一个什么都不知道的人的角度,尽可能严格的看自己的代码。你的代码审查工具会比IDE更能给你根本上的不同看法。这将很容易的为你免去一次往返。
 
使差异容易理解:一下子出现的多种改变让代码更难审查。当你自行审查,寻找能减少差异的简单更改。例如,保证重要的重构或格式变化。
不要隐藏提交消息中的重要信息:把它也放在代码中。之后阅读代码的人是不可能看提交的消息的。
 当你处理代码审查意见:
 
处理完重要意见后,重新评估你的代码:退一步并用真正全新的眼光去看代码。一旦完成了一组更改,你会发现,这些更改经常会带来额外的改进。正如任何的重构,它可能需要几个步骤来达到最佳设计。
 
弄明白审查者做出的每一个注释:如果你不明白注释背后的原因,不要仅是修改代码——去找审查者弄清楚,以便自己能学习新的东西。
 
回复审查者在代码上的问题:不只是回复——让代码更容易理解(例如,提高一个变量名、更改一个布尔值等等)——或添加注释。以免之后其他人也会有同样的问题。
 
作者:潇潇和她的第二人格
链接:http://www.jianshu.com/p/d6d2256a5362
來源:简书

好与坏的程序员:如何评价程序员的水平才算客观?

技术交流lanqiao 发表了文章 • 0 个评论 • 504 次浏览 • 2018-11-27 14:11 • 来自相关话题

  1.有感于知乎上的一篇关于程序员的讨论。让我突然之间心有戚戚然的感觉。最近一段时间有点江郎才尽的感觉,写不了大的主题,就写点小东西吧。     我们从知乎上面引用的这段小故事开始: 魏文王问扁鹊家 ...查看全部
 
1.有感于知乎上的一篇关于程序员的讨论。让我突然之间心有戚戚然的感觉。最近一段时间有点江郎才尽的感觉,写不了大的主题,就写点小东西吧。
 
 
我们从知乎上面引用的这段小故事开始:
魏文王问扁鹊家里三兄弟谁的医术最好。扁鹊回答说大哥最好,二哥次之,他自己最差。魏文王疑惑了,又问道,为什么扁鹊最有名呢?扁鹊回答说因为大哥治病的时候人没病就防止了,所以毫无名气。二哥呢,病刚起来的时候,就给治好了,大家以为只能治小病。而自己呢,能耐不够,非要到了病的很厉害了才能看出来,治起来的动静就大了。好在还不至于庸医能治好,结果大家看到每次治的都是顽疾,反而出名了。 
 
 
这发生在几千年前的对话是不是靠谱我们不知道,但是拿这话来套程序员的生态圈,真就是一套一个准。
 
2.微软某个大牛软件下面两个不同的组里各有一个大牛程序员,为了不失一般性,我们叫张三和李四吧。张三的特点颇有点大哥的风范,偶尔也充当一下二哥。写的程序严谨,测试也很严谨,几乎不犯错。组里其他同事有错的,也在出大事之前默默的修掉了。
 
李四的风格和扁鹊像,手脚麻利干活快,但是坑也很多。好在李四人聪明又手脚麻利,每次总是能够在自己或者组里其他人搞出惊天动地的大事来的时候,把坑迅速填好,救产品于危难。
 
名气来说,李四是整个产品部门从VP往下数出了名的可靠的火枪手,救火队员。领导信任不可或缺的左膀右臂。张三就默默无闻了。只有小组里面的人知道自己是高手。
说起结局来,李四很快就到了principal,张三么,一直默默无闻,很多年以后终于熬资历到了senior,然后在一次裁员中被裁掉了。
 
3.事情到这里就有点意思了。几千年前的故事,几千年后还在上演。看官可能觉得这个是特例。其实也不然。这样的故事一直在上演。
 
说说另外一个顺利上市扩张的公司的故事。我们知道但凡是初创公司里的员工,都是能够迅速的开发出差不多能用的东西的工程师的天下。但是这个东西有个度,差不多能用的东西短平快带来的副作用其实很大。弄不好就得在未来某个时候全部重写。
 
这个公司的领导层就是这样一群码农自然而然的升上来的,崇尚的就是这种做事风格。但是因为公司大了,产品不能够再到处是bug了,可是公司的test coverage又是一塌糊涂。
 
哪里都是坑。所以每次新版本的发行,都不停的延期延期又延期。
 
公司里我认识的有一个俄罗斯来的人,做事情严谨,写程序的test coverage很好,因为以前合作的关系,知道这个人的工作style,而且知道这个人是我见过的最为优秀的程序员之一。有次我偶遇聊起天来,这位一个劲的和我诉苦,苦不该去这个公司。因为公司里面所有的人崇尚的是救火队员,从未有人觉得好好写code,少出bug是重要的。
 
后来我又认识了一个罗马尼亚来的工程师,也是同一个公司。这位罗马尼亚老兄的程序我就不评价了,实在有点不堪入目。然而我看看linkedin,在此公司混的是风生水起。我再次和俄罗斯人见到的时候,俄罗斯人和我说,这个罗马尼亚人啊,就是个彻头彻尾的hacker。每次做事情,把当前的bug能修掉再说,code一塌糊涂,最后别人都得替他擦屎。但是领导们都很喜欢他啊,能迅速的修好东西让产品出去。
 
4.这事情说到这里,其实可以概括下来两句话:曲突徙薪亡恩泽,焦头烂额为上客。
一个程序员为了不出问题而做的努力,往往没有那些出了问题以后再打鸡血一样去努力解决的人获得的回报多。你说按照这个标准去判断,到底是哪里出错了呢?
 
从这一点来说,我们首先得要看看一个领导是怎么样去评价一个好或者不好的程序员的。在我的经历里面,并不是没有遇到过在意系统结构,对那些能够写出不错的程序,能够防范未然的程序员非常重视的领导。然而更多的领导其实最在乎的依然是如何能够迅速的把东西写完,迅速的发布出去。
 
基于后者的情况越来越普遍,尤其是在比如著名的亚马逊的很多产品组,领导有的是MBA或者产品经理出身的,其评价体系里面,并不会给扁鹊大哥那样的程序员太多发挥的空间。
 
我作为程序员的时候,是非常希望自己可以成为扁鹊大哥这样的牛逼的大神的。我环顾四周的时候,看到拯救公司的英雄们,各个都如同扁鹊,或者扁鹊++。这个问题我很困扰了,读到知乎上的文章,颇心有戚戚然。那么码农们,你们怎么选?
 


来自:51CTO 作者:徐飞
本文标题:好与坏的程序员:如何客观评价程序员的水平?
本文地址:https://www.oschina.net/news/87295/good-and-bad-programmer

以程序员的视角看为什么骑车忘锁会变成欠两千万

技术交流lanqiao 发表了文章 • 0 个评论 • 478 次浏览 • 2018-11-27 14:05 • 来自相关话题

话题:骑车忘锁 3天欠费2千万 竟是系统升级导致   近日,一条骑共享单车忘锁 3天欠费2千万的新闻引发了网友热议。到底这BUG谁背锅?   李先生介绍,他在秦园路一家房产中介上班,他此前注册过摩拜单车, ...查看全部
话题:骑车忘锁 3天欠费2千万 竟是系统升级导致
 
近日,一条骑共享单车忘锁 3天欠费2千万的新闻引发了网友热议。到底这BUG谁背锅?
 
李先生介绍,他在秦园路一家房产中介上班,他此前注册过摩拜单车,本月初去广西旅游时重新开始使用。24日上午,他从团结新村骑车到秦园路上班,可能忘了关锁,直到27日傍晚准备和朋友骑单车去看电影时,才发现自己试用单车23个小时,账户欠款34元。李先生随后拨通了客服电话,客服人员称出于人性化考虑,可以免除这次扣费,但要扣除李先生15分信用分。过了10多分钟后,李先生查看自己账户,发现信用分确实扣了,但账户余额没有归零,而是显示欠费2147万多元,而且尾数一直在增长。他致电客服,客服人员让他不急,称会解决此事。
 
 
7月31上午,李先生的账户数字停留在欠费21474778元。记者联系上摩拜单车相关负责人,其称系统会有不定期更新升级,极个别用户会遇到类似问题。可以拨打客服电话,app端上报故障,或者通过摩拜单车相关微博微信反馈问题,客服人员收到反馈后即刻会按照实际余额修复,用户无需担心。
 
关于这一事件,有人懂行的网友分析是程序员的锅,因为该用户的欠费数字十分接近int类型极限数字,即-2147483648至2147483647;

微信截图_20181127140004.png

 
 
程序员网友评论: 
科普一下,这个钱还真跟最大值有点关系。2147483647,如果单位是分,整数部分就是21474836元。。而这件事儿里的21474778,跟int 最大值 21474836就差58块钱。。也就是说,这个系统的钱很可能是以分为单位的 int 型值。。。至于你说钱用不用 int 存储的问题,你查查支付宝和微信的支付接口,我记得其中一个就是要的以分为单位的int型值。。而且,int能满足需求了,为啥不用呢?

讨论|使用最少的代码就是最好的程序员吗?

技术交流lanqiao 发表了文章 • 0 个评论 • 311 次浏览 • 2018-11-27 14:02 • 来自相关话题

最近在Quora看到了这样一篇文章:Do the best programmers use the fewest lines of code ? 在网上获得了16.7K的Upvote(值得阅读),这个问题与包含的回答无论是对于初入IT的学习者还是步入行业一定时 ...查看全部
最近在Quora看到了这样一篇文章:Do the best programmers use the fewest lines of code ? 在网上获得了16.7K的Upvote(值得阅读),这个问题与包含的回答无论是对于初入IT的学习者还是步入行业一定时间的老司机来说,都是值得去思考学习的。往往很多人,甚至是程序员自己都认为用最少的代码编程才是优秀的证明,但是否真的是在编程中使用的代码越少,对于程序员来说自身能力就越优秀呢?
 

1.png


2.png


微信截图_20181127135704.png

 
 
你怎么认为呢?一起来讨论吧。

如何快速掌握所有编程语言?对你没看错,是所有。

技术交流lanqiao 发表了文章 • 0 个评论 • 617 次浏览 • 2018-11-27 13:44 • 来自相关话题

本文作者:王垠  来源:51CTO技术栈 原文链接:http://developer.51cto.com/art/201708/547360.htm    很多编程初学者至今还在问,我该学习什么程序语言,怎么学习 ...查看全部
本文作者:王垠 
来源:51CTO技术栈
原文链接:http://developer.51cto.com/art/201708/547360.htm
  
很多编程初学者至今还在问,我该学习什么程序语言,怎么学习。今天,我们要讲的不是如何掌握一种程序语言,而是所有的……
 
由于我知道如何掌握“所有”的程序语言,总是感觉这种该学“一种”什么语言的问题比较低级,所以一直没来得及回复他们 。
 
可是逐渐的,我发现原来不只是小白们有这个问题,就连大公司的很多资深工程师,其实也没搞明白。
 
今天我有动力了,想来统一回答一下这个搁置已久的“初级问题”。类似的话题貌似曾经写过,然而现在我想把它重新写一遍。因为在跟很多人交流之后,我对自己头脑中的(未转化为语言的)想法,有了更精准的表达。
 
如果你存在以下的种种困惑,那么这篇文章也许会对你有所帮助:

你是编程初学者,不知道该选择什么程序语言来入门。

你是资深的程序员或者团队领导,对新出现的种种语言感到困惑,不知道该“投资”哪种语言。

你的团队为使用哪种程序语言争论不休,发生各种“宗教”斗争。

你追逐潮流采用了某种时髦的语言,结果两个月之后发现深陷泥潭,痛苦不堪……
  
程序员的岗位往往会要求熟悉某些语言,甚至某些奇葩的公司要求你“深入理解 OOP 或者 FP 设计模式”。对于在职的程序员,程序语言至今仍然是可以争得面红耳赤的宗教话题。它的宗教性之强,以至于我在批评和调侃某些语言(比如 Go 语言)的时候,有些人会本能地以为我是另外一种语言(比如 Java)的粉丝。显然我不可能是任何一种语言的粉丝,对于任何从没见过的语言,我都是直接拿起来就用,而不需要经过学习的过程。
 
看了这篇文章,也许你会明白我为什么可以达到这个效果。理解了这里面的东西,每个程序员都应该可以做到这一点。嗯,但愿吧。
 
 
重视语言特性,而不是语言
 
很多人在乎自己或者别人是否“会”某种语言,对“发明”了某种语言的人倍加崇拜,为各种语言的孰优孰劣争得面红耳赤。这些问题对于我来说都是不存在的。
 
虽然我写文章批评过不少语言的缺陷,在实际工作中我却很少跟人争论这些。如果有其他人在我身边争论,我甚至会戴上耳机,都懒得听他们说什么 ;
 
为什么呢?归根结底的原因是我重视的是“语言特性”,而不是整个的“语言”。我能用任何语言写出不错的代码,就算再糟糕的语言也差不了多少。 
 
任何一种“语言”,都是各种“语言特性”的组合。
 
打个比方吧,一个程序语言就像一台电脑。它的牌子可能叫“联想”,或者“IBM”,或者“Dell”,或者“苹果”。那么,你可以说苹果一定比 IBM 好吗?
 
你不能,你得看看它里面装的是什么型号的处理器,有多少个核,主频多少,有多少 L1 cache,L2 cache……,有多少内存和硬盘,显示器分辨率有多大,显卡是什么 GPU,网卡速度,等等各种“配置”。有时候你还得看各个组件之间的兼容性。
 
 
 
这些配置对应到程序语言里面,就是所谓“语言特性”。
 
举一些语言特性的例子:

变量定义

算术运算

for 循环语句,while 循环语句

函数定义,函数调用

递归

静态类型系统

类型推导

lambda 函数

面向对象

垃圾回收

指针算术

goto 语句
 
这些语言特性,就像你在选择一台电脑的时候,看它里面是什么配置。
选电脑的时候,没有人会说 Dell 一定是最好的,他们只会说这个型号里面装的是 Intel 的 i7 处理器,这个比 i5 的好,DDR3 的内存比 DDR2 的快这么多,SSD 比磁盘快很多,ATI 的显卡是垃圾…… 如此等等。
 
程序语言也是一样的道理。对于初学者来说,其实没必要纠结到底要先学哪一种语言,再学哪一种。
 
曾经有人给我发信问这种问题,纠结了好几个星期,结果一种语言都还没开始学。有这纠结的时间,其实都可以把他纠结过的语言全部掌握了。
 
 
初学者往往不理解,每一种语言里面必然有一套“通用”的特性。比如变量,函数,整数和浮点数运算,等等。这些是每个通用程序语言里面都必须有的,一个都不能少。
 
你只要通过“某种语言”学会了这些特性,掌握这些特性的根本概念,就能随时把这些知识应用到任何其他语言。你为此投入的时间基本不会浪费。
 
所以初学者纠结要“先学哪种语言”,这种时间花的很不值得,还不如随便挑一个语言,跳进去。
 
如果你不能用一种语言里面的基本特性写出好的代码,那你换成另外一种语言也无济于事。你会写出一样差的代码。
 
我经常看到有些人 Java 代码写得相当乱,相当糟糕,却骂 Java 不好,雄心勃勃要换用 Go 语言。
 
这些人没有明白,是否能写出好的代码在于人,而不在于语言。如果你的心中没有清晰简单的思维模型,你用任何语言表述出来都是一堆乱麻。如果你 Java 代码写得很糟糕,那么你写 Go 语言代码也会一样糟糕,甚至更差。
 
很多初学者不了解,一个高明的程序员如果开始用一种新的程序语言,他往往不是去看这个语言的大部头手册或者书籍,而是先有一个需要解决的问题。
 
手头有了问题,他可以用两分钟浏览一下这语言的手册,看看这语言大概长什么样。
然后,他直接拿起一段例子代码来开始修改捣鼓,想法把这代码改成自己正想解决的问题。在这个简短的过程中,他很快的掌握了这个语言,并用它表达出心里的想法。
 
 
在这个过程中,随着需求的出现,他可能会问这样的问题:

这个语言的“变量定义”是什么语法,需要“声明类型”吗,还是可以用“类型推导”?

它的“类型”是什么语法?是否支持“泛型”?泛型的 “variance” 如何表达?

这个语言的“函数”是什么语法,“函数调用”是什么语法,可否使用“缺省参数”?
 
 
注意到了吗?上面每一个引号里面的内容,都是一种语言特性(或者叫概念)。
 
这些概念可以存在于任何的语言里面,虽然语法可能不一样,它们的本质都是一样的。比如,有些语言的参数类型写在变量前面,有些写在后面,有些中间隔了一个冒号,有些没有。
 
这些实际问题都是随着写实际的代码,解决手头的问题,自然而然带出来的,而不是一开头就抱着语言手册看得仔仔细细。
 
因为掌握了语言特性的人都知道,自己需要的特性,在任何语言里面一定有对应的表达方式。如果没有直接的方式表达,那么一定有某种“绕过方式”。
 
如果有直接的表达方式,那么它只是语法稍微有所不同而已。所以,他是带着问题找特性,就像查字典一样,而不是被淹没于大部头的手册里面,昏昏欲睡一个月才开始写代码。
 
掌握了通用的语言特性,剩下的就只剩某些语言“特有”的特性了。
 
研究语言的人都知道,要设计出新的,好的,无害的特性,是非常困难的。所以一般说来,一种好的语言,它所特有的新特性,终究不会超过一两种。
 
如果有个语言号称自己有超过 5 种新特性,那你就得小心了,因为它们带来的有可能不是优势,而是灾难!
 
同样的道理,最好的语言研究者,往往不是某种语言的设计者,而是某种关键语言特性的设计者(或者支持者)。
 
著名的计算机科学家 Dijkstra 就是“递归”的强烈支持者。现在的语言里面都有递归,然而你可能不知道,早期的程序语言是不支持递归的。
 
直到 Dijkstra 强烈要求 Algol 60 委员会加入对递归的支持,这个局面才改变了。Tony Hoare 也是语言特性设计者。
 
他设计了几个重要的语言特性,却没有设计过任何语言。另外大家不要忘了,有个语言专家叫王垠,他是早期 union type 的支持者和实现者,也是 checked exception 特性的支持者,他在自己的博文里指出了 checked exception 和 union type 之间的关系 。
 
很多人盲目的崇拜语言设计者,只要听到有人设计(或者美其民曰“发明”)了一个语言,就热血沸腾,佩服的五体投地。
 
他们却没有理解,其实所有的程序语言,不过是像 Dell,联想一样的“组装机”。语言特性的设计者,才是像 Intel,AMD,ARM,Qualcomm 那样核心技术的创造者。
 
 
 
合理的入门语言
 
所以初学者要想事半功倍,就应该从一种“合理”的,没有明显严重问题的语言出发,掌握最关键的语言特性,然后由此把这些概念应用到其他语言。哪些是合理的入门语言呢?
我个人觉得这些语言都可以用来入门:

Scheme

C

Java

Python

JavaScript
 
 
那么相比之下,我不推荐用哪些语言入门呢?

Shell

PowerShell

AWK

Perl

PHP

Basic

Go
 
总的说来,你不应该使用所谓“脚本语言”作为入门语言,特别是那些源于早期 Unix 系统的脚本语言工具。
 
采用脚本语言学编程,一个很严重的问题就是使得学习者抓不住关键。
 
脚本语言往往把一些系统工具性质的东西(比如正则表达式,Web 概念)加入到语法里面,导致初学者为它们浪费太多时间,却没有理解编程最关键的概念:变量,函数,递归,类型……
 
不推荐 Go 语言的原因类似,虽然 Go 语言不算脚本语言,然而他的设计者显然不明白自己在干什么。所以使用 Go 语言来学编程,你不能专注于最关键,最好的语言特性。
 
 
 
掌握关键语言特性,忽略次要特性
 
为了达到我之前提到的融会贯通,一通百通的效果,初学者应该专注于语言里面最关键的特性,而不是被次要的特性分心。
这里举一些次要语言特性的例子:

C 语言的语句块,如果里面只有一条语句,可以不打花括号。

Go 语言的函数参数类型如果一样可以合并在一起写,比如 func foo(s string, x, y, z int, c bool) { ... }。

Perl 把正则表达式作为语言的一种特殊语法。

JavaScript 语句可以在某些时候省略句尾的分号。

Haskell 和 ML 等语言的 currying。
 
 
 
自己动手实现语言特性
 
在基本学会了各种语言特性,能用它们来写代码之后,下一步的进阶就是去实现它们。
只有实现了各种语言特性,你才能完全地拥有它们,成为它们的主人。否则你就只是它们的使用者,你会被语言的设计者牵着鼻子走。
有个大师说得好,完全理解一种语言最好的方法就是自己动手实现它,也就是自己写一个解释器来实现它的语义。
但我觉得这句话应该稍微修改一下:完全理解一种“语言特性”最好的方法就是自己亲自实现它。
注意我在这里把“语言”改为了“语言特性”。你并不需要实现整个语言来达到这个目的,因为我们最终使用的是语言特性。只要你自己实现了一种语言特性,你就能理解这个特性在任何语言里的实现方式和用法。
 
学习 SICP 的时候,大家都会亲自用 Scheme 实现一个面向对象系统。
用 Scheme 实现的面向对象系统,跟 Java,C++,Python 之类的语言语法相去甚远,然而它却能帮助你理解任何这些 OOP 语言里面的“面向对象”这一概念,它甚至能帮助你理解各种面向对象实现的差异。
这种效果是你直接学习 OOP 语言得不到的,因为在学习 Java,C++,Python 之类语言的时候,你只是一个用户,而用 Scheme 自己动手实现了 OO 系统之后,你成为了一个创造者。
类似的特性还包括类型推导,类型检查,惰性求值,如此等等。我实现过几乎所有的语言特性,所以任何语言在我的面前,都是可以被任意拆卸组装的玩具,而不再是凌驾于我之上的神圣。 
 
 
总结
 
写了这么多,重要的话重复三遍:语言特性,语言特性,语言特性!不管是初学者还是资深程序员,应该专注于语言特性,而不是纠结于整个的“语言品牌”。只有这样才能达到融会贯通,拿起任何语言几乎立即就会用,并且写出高质量的代码。

据说只有程序员才能看懂的时钟,你敢来挑战吗?

技术交流lanqiao 发表了文章 • 0 个评论 • 182 次浏览 • 2018-11-27 11:10 • 来自相关话题

最近发现一个据说只有程序员和数学家才能看懂的“数学钟”,也就是非常流行的下面这幅图:        用这个钟看时间,你的智 ...查看全部
最近发现一个据说只有程序员和数学家才能看懂的“数学钟”,也就是非常流行的下面这幅图:

微信截图_20181127110308.png

 
 
 
 用这个钟看时间,你的智商够用么?
快来挑战一下吧
 
答案在这里
 

640.webp_.jpg

 
据说12个全能看懂的,在学校肯定是学霸
 
 
 

程序员总工会:以后写代码要按行数收费?那我能写到马云破产!

技术交流lanqiao 发表了文章 • 0 个评论 • 67 次浏览 • 2018-11-27 11:03 • 来自相关话题

程序员总工会发布了一条消息:以后我们的代码要按行收费。客户们立即就炸了锅,按代码收费?那你程序员不是想怎么写就怎么写,我们让你们做个项目,你写个空行,写点注释什么的,谁来管?   物竞天择。有人有需求就立即有人响应。正当这些客户无所 ...查看全部
程序员总工会发布了一条消息:以后我们的代码要按行收费。客户们立即就炸了锅,按代码收费?那你程序员不是想怎么写就怎么写,我们让你们做个项目,你写个空行,写点注释什么的,谁来管?
 
物竞天择。有人有需求就立即有人响应。正当这些客户无所适从的时候,一个职业产生了:代码缩行师。客户在审查项目交付的时候会先去缩行事务所请一位缩行师。缩行师的职责就是,在保证不改变原有系统功能的前提下,将程序最大程度的缩减行数,缩行师按照缩减行数的百分之 10 收费。
 
缩行师是程序员最大的天敌。
 
缩行师也是分等级的,最低级的缩行师只能缩缩空行,挪一挪括号,一般人都能做,大抵是被程序员看不起的,往上一级就要稍微懂一点编程知识了,知道怎么把定义的变量合到一行,怎么去掉可以去掉的括号,他们已经一脚踏入了领域和空间的境界了,他们许多是程序员做不下去为了生计讨口饭吃,倘若搞好客户关系,也能活的很滋润。
 
再往上一级,这些人是缩行师界的精英,而且随时可以成为最优秀的程序员,他们把无聊的体力工作交给下边的人去做,自己则和程序员斗智斗勇,“你这个变量没必要定义”,“你这两处的功能重复了,回去重构一下”,“你这个是自己造轮子,去找别人开源写好的”。
 
他们有的曾经是最好的程序员,有的是因为忍受不了缩行师的百般挑刺,无奈转行,有的是因为满足内心找茬的欲望。他们有的是从事多年的缩行师,从学徒起一步一步坐起,扎扎实实的走到现在的地位,这个级别的缩行师是各大缩行事务所争抢的对象。
 
每个客户都以邀请到他们为荣,预约的人多了,事务所开始准备“缩号”,客户只有摇到了缩号才能有幸邀请到这些人,有的客户更是为专家缩号大打出手,于是又催生了一种叫“缩牛”的职业,不再赘述。
 
他们某种程度上已经达到了缩行师的顶峰,但还有一种传说中的存在,他们是打破规则的存在,如果你侥幸看到他们的杰作,你就会发现上面提到的都是浮云。一行,只需要一行就够了,什么工程,什么项目,只需要一行。jQuery.min.js 就是他们的杰作。
 
有一个站在巅峰的男人曾经应拉里 · 佩奇的邀请将谷歌的所有代码写成了一行,并且能完整的实现了谷歌现有的所有功能,人们甚至发现谷歌搜索快了将近 30%。后来有华尔街和硅谷的资深从业者看到这行代码后久久不能平静,对这行代码给出了 5600 亿美元的估值,当然这行代码一般人是看不完的,据说这行代码的长度可以从加州连接到 M31 星系。
 
程序员的生活变得越来越艰难,程序员联盟本身的福祉:变成了灾难,尽管随着代码的行数减少,单行的价格在不断的升高,程序员行业的整体质量也在不断的提高,但依旧艰难。程序员联盟又做了一个艰难的决定:最终的代码每行不得多于 200 字符。对于一般的程序,一行 200 字符足够了,即使一行内容长,也可以分行解决。
 
在程序员联盟认为一劳永逸的同时,缩行师的行业发生了惊天动地的变化,对于底层的没有太大变化,但对于习惯把程序挤到一行的从业者来说无异于晴天霹雳。当原来的方法不适用的时候他们又何去何从?
 
在进行了多次缩行师技术交流峰会之后他们找到了一个对策,那就是将计就计,把每行的代码都调整到 200 字符,在规则的范围内达到最大的收益。于是缩行师行会陆续制订了缩行师的规范,守则。
 
越来越多的人开始分享他们把代码调整成 200 字符的技巧,有的缩行师贴出代码提问“怎么把这段代码缩成标准的格式?”,就会有很多热心的缩行师为其解答,也会有不少伪装成缩行师的程序员冷嘲热讽甚至谩骂。
 
随着缩行技术的发展和普及,程序员和客户由一开始看到凹凸不平的代码,变成一个个整齐的长方形的代码的一脸懵逼,到渐渐习惯再到麻木。很多年过去以后,新的程序员甚至以为长方型的代码就应该是代码本来的样子。
 
程序员的世界也发生了很大的变化,越来越多的客户为了节省一笔缩行师的费用,开始要求程序员去写每行 200 个字符的长方形代码,程序员经过了这么多年的耳濡目染也渐渐的接受了,这第一批写方块代码的程序员渐渐引领了代码的潮流《编程方块》《代码方块之道》《方块之美》《重构 – 方块化改善既有代码》。这些书开始变得越来越畅销。
 
缩行师除了偶尔被叫去做做 code review,需要的越来越少了,整个行业也开始没落。
 
有人的地方就有江湖,有利益的地方就有冲突。
 
 网友:如果代码按行付费,我能写到马云破产

js Date对象常用操作

技术交流lanqiao 发表了文章 • 0 个评论 • 44 次浏览 • 2018-11-26 14:11 • 来自相关话题

关于日期的操作有两种:操作日期时间,操作时间戳。下面是相关API 时间戳,通常是一个字符序列,唯一地标识某一刻的时间,是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。 ...查看全部
关于日期的操作有两种:操作日期时间,操作时间戳。下面是相关API
时间戳,通常是一个字符序列,唯一地标识某一刻的时间,是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。
 
一、创建Date()对象
 
var date1 = new Date();
// 参数是时间戳
var date2 = new Date(1486915200000);
// 参数是日期字符串
var date3 = new Date('2017/2/13');
// 参数是年、月、日...,其中年月日是必须的
var date4 = new Date('2017', '2', '13');
// Mon Feb 13 2017 18:09:31 GMT+0800 (中国标准时间)
console.log(date1)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date2)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date3)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date4)

 
二、获取时间
 
1、获取当前时间
1.Date() 或者new Date()
// Mon Feb 13 2017 15:46:34 GMT+0800 (中国标准时间)
console.log(Date())
// Mon Feb 13 2017 15:46:34 GMT+0800 (中国标准时间)
console.log(new Date())
2.get系列方法,常用的是获取年/月/日/时/分/秒,获取当前时间要求日期对象为当前日期
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。注意不要使用getYear()。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
var date = new Date()
var year = date.getFullYear()
// 2017年
console.log(year + '年')

 
2、获取固定的时间
(1)new Date("2012/12/12");
(2)set系列方法,常用的是设置年/月/日/时/分/秒
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。注意不要使用setYear()方法。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
var date = new Date('2016/2/13')// Sat Feb 13 2016 00:00:00 GMT+0800 (中国标准时间)
console.log(date)
var date1 = new Date()
date1.setFullYear('2016')
// Sat Feb 13 2016 17:55:22 GMT+0800 (中国标准时间)
console.log(date1)

 
3.通过固定的时间戳获取固定的时间
setTime() 以毫秒设置 Date 对象。
var date1 = new Date()
date1.setTime(1486915200000)
// Mon Feb 13 2017 00:00:00 GMT+0800 (中国标准时间)
console.log(date1)

 
4、获取本地时间格式
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
var date2 = new Date()
// 2017/2/13 下午5:30:17
console.log(date2.toLocaleString())
// 下午5:30:17
console.log(date2.toLocaleTimeString())
// 2017/2/13
console.log(date2.toLocaleDateString())

 
三、获取时间戳
 
1、获取当前时间戳
Date.now()、+ new Date()、Date.parse(new Date())、new Date().getTime()
var date1 = Date.now()
var date2 = + new Date()
var date3 = Date.parse(new Date())
var date4 = new Date().getTime()
// 1486977645739
console.log(date1)
// 1486977645739
console.log(date2)
// 1486977645000
console.log(date3)
// 1486977645739
console.log(date4)

从上面输出结果可以看到Date.parse()与其他不同,有点奇葩
 
2、获取固定时间戳
 
Date.parse(new Date())、new Date().getTime()
var date2 = + new Date('2017/2/13')
var date3 = Date.parse(new Date('2017/2/13'))
var date4 = new Date('2017/2/13').getTime()
// 1486915200000
console.log(date2)
// 1486915200000
console.log(date3)
// 1486915200000
console.log(date4)

 
四、开发应用场景
 
1、自定义格式日期,如2015年3月19日 12:00:00这种格式
var date = new Date();
// 2017年02月13日 18:29:39
console.log(formatDateTime(date))
function formatDateTime(date) {
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
var minute = date.getMinutes();
minute = minute < 10 ? ('0' + minute) : minute;
var second = date.getSeconds();
second = second < 10 ? ('0' + second) : second;
return y + '年' + m + '月' + d+'日 '+h+':'+minute + ':' + second;};

 
2、倒计时效果
// 写文章时时间为为2017/2/13
var endDate = new Date('2017/3/13')
// 实现距离距离2017/2/13 00:00:00的倒计时效果
var t = setInterval(function(){
var date = ShowCountDown(endDate,new Date());
console.log(date)
}, 1000);
function ShowCountDown(endDate,nowDate) {
var date = ''
var leftTime=endDate.getTime()-nowDate.getTime();
if (leftTime >= 0) {
var leftsecond = parseInt(leftTime/1000);
var day1=Math.floor(leftsecond/(60*60*24));
var hour=Math.floor((leftsecond-day1*24*60*60)/3600);
var minute=Math.floor((leftsecond-day1*24*60*60-hour*3600)/60);
var second=Math.floor(leftsecond-day1*24*60*60-hour*3600-minute*60);
day1 = day1 < 10 ? ('0' + day1) : day1;
hour = hour < 10 ? ('0' + hour) : hour;
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
date = "还剩:"+day1+"天"+hour+"小时"+minute+"分"+second+"秒";
}else{
clearInterval(t)
date = "还剩:00天00小时00分00秒";
}
return date
}

全球最杰出的14位程序员,你的榜样是谁?

技术交流lanqiao 发表了文章 • 0 个评论 • 181 次浏览 • 2018-11-26 14:04 • 来自相关话题

  近日,ITWorld整理全球最杰出的14位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后)  1. Jon Skeet 个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的 ...查看全部
 
近日,ITWorld整理全球最杰出的14位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后)
 1. Jon Skeet
个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的问答量保持在425个左右。
个人简介/主要荣誉:谷歌软件工程师,代表作有《深入理解C#(C# In Depth)》。
网络上对Jon Skeet的评价:


  • “他根本不需要调试器,只要他盯一下代码,错误之处自会原形毕露。”


  • “如果他的代码没有通过编译的时候,编译器就会道歉。”


  • “他根本不需要什么编程规范,他的代码就是编程规范。”


 2. Gennady Korotkevich
个人名望:编程大赛神童
个人简介/主要荣誉:年仅11岁时便参加国际信息学奥林比克竞赛,创造了最年轻选手的记录。在2007-2012年间,总共取得6枚奥赛金牌;2013年美国计算机协会编程比赛冠军队成员;2014年Facebook黑客杯冠军得主。截止目前,稳居俄编程网站Codeforces声望第一的宝座,在TopCoder算法竞赛中暂列榜眼位置。
网络上对Gennady Korotkevich的评价:


  • “一个编程神童。”


  • “他太令人惊讶了,他相当于我在白俄罗斯建立了一支强大的编程队伍”


  • “彻底的编程天才”


 3. Linus Torvalds
个人名望:Linux之父
个人简介/主要荣誉:


  • Linux和Git之父,一个开源的操作系统;


  • 1998年EFF(电子前沿基金会)先锋奖得主;


  • 2000年英国计算机学会Lovelace奖章得主;


  • 2012年千禧技术奖得主;


  • 2014年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;


  • 2008年入选计算机历史博物馆名人堂;


  • 2012年入选互联网名人堂。


网络上对Linus Torvalds的评价:
“他简直优秀得无与伦比。” 4. Jeff Dean
个人名望:谷歌搜索索引技术的幕后大脑。
个人简介/主要荣誉:谷歌大规模分布式计算系统的设计师,例如:站点爬行,索引与搜索,在线广告,MapReduce,BigTable以及Spanner(分布式数据库)。2009年进入美国国家工程院;2012年美国计算机协会SIGOPS Mark Weiser Award以及Infosys Foundation Award奖项得主。
网络上对Jeff Dean的评价:


  • “使数据挖掘取得了突破性发展。”


  • “能够在各项工作都已安排得满满的情况下,仍能构思、创作、发布出MapReduce以及BigTable这些令人赞叹不已的工具。”


  5. John Carmack
个人名望:第一人称射击游戏经典师祖《Doom》(毁灭战士)之父
个人简介/主要荣誉:id Software公司联合创始人,制作了很多脍炙人口的游戏,如:《德军司令部》(Wolfenstein 3D,又名《刺杀希特勒》)、《Doom》(毁灭战士)、《Quake》(雷神之锤)。引领了很多计算机显示领域的新技术,包括:adaptive tile refresh(切片适配更新)、binary space partitioning(二元空间分割)、surface caching(平面缓存);2001年进入互动艺术与科学学院名人堂;2010年收获游戏开发者精选奖终身成就奖殊荣。
网络上对John Carmack的评价:


  • “制作了很多革命性的第一人称射击游戏,影响了一代又一代的游戏设计者。”


  • “他能在一周内就完成任何的基础设计工作。”


  • “他是会编程的莫扎特。”


 6. Richard Stallman
个人名望:Emacs文本编辑器,多种语言编译器GCC的创造者。
个人简介/主要荣誉:GNU项目发起人,开发出很多核心工具,例如:Emacs,GCC,GDB和GU Make Free Software公司创始人。1990年获得美国计算机协会Grace Murray Hopper奖项;1998年获得EFF(电子前沿基金会)先锋奖。
网络上对Richard Stallman的评价:


  • “曾独自一人与一众Lisp黑客好手进行比赛,那次是Symbolics对阵LMI。”


  • “尽管我们对事物有不同看法,但他一定是最有影响力的程序员,无论现在还是将来。”


 7. PetrMitrechev
个人名望:最有竞争力的程序员之一。
个人简介/主要荣誉:分别在2000年与2012年收获国际奥林匹克信息竞赛金牌;2011年与2013年赢得Facebook黑客杯赛;在2006年赢得谷歌Code Jam程序设计大赛以及TopCoder算法公开赛;截止目前,暂列TopCoderPetr算法竞赛首位,在Codeforces中排行第五。
网络上对PetrMitrechev的评价:
“即使在印度,他都是程序设计竞赛者心中的偶像。” 8. FabriceBellard
个人名望:开发出模拟处理器的自由软件QEMU。
个人简介/主要荣誉:开发了许多著名的开源软件,例如:QEMU硬件模拟虚拟平台,FFmpeg多媒体数据处理软件,Tiny C编译器,LZEXE解压缩软件。在2000年与2001年赢得国际C语言混乱代码设计大赛冠军;2011年赢得谷歌O’Reilly开源设计奖;前圆周率计算精度世界纪录保持者。
网络上对FabriceBellard的评价:


  • “他的作品总是令人印象深刻和光芒四射。”


  • “世界上最有创造力的程序员。”


  • “他是软件工程领域的尼古拉·特斯拉。”


 9. Doug Cutting
个人名望:开发出开源全文检索引擎工具包Lucene。
个人简介/主要荣誉:除了Lucene,还开发了著名的网络爬虫工具Nutch,分布式系统基础架构Hadoop,这些大师级作品都是开源的。目前任职Apache软件基金会主席。
网络上对Doug Cutting的评价:


  • “他开发出卓越超群的全文检索引擎工具包(Lucene/Solr)以及为世界打开了一扇通往大数据的大门。”


  • “开源的Lucene以及Hadoop为全球创造了无数的财富以及就业机会。”


 10. Donald Knuth
个人名望:《计算机程序设计艺术》(The Art of Computer Programming)一书的作者。
个人简介/主要荣誉:著有数本影响深远的程序设计理论书籍;发明了TeX数字排版系统;在1971年成为首位获得美国计算机协会Grace Murray Hopper奖项的人士;1974年获得美国计算机协会A.M. Turning奖项;1979年被授予国家科技奖章;1995年被授予电气和电子工程师协会John von Neumann奖章;1998年入选计算机历史博物馆名人录。
网络上对Donald Knuth的评价:
“我曾经有幸使用过一款无限接近零错误的大型软件,它就是TeX。” 11. Anders Hejlsberg
个人名望:创造了Turbo Pascal。
个人简介/主要荣誉:Turbo Pascal的原作者,Turbo Pascal是最受欢迎的Pascal编译器之一,也首次为Pascal带来整合的开发环境。主导开发了Turbal Pascal继承者Delphi。首席C#设计师与架构师;2011年获得Dr.Dobb’s Excellence in Programming荣誉。
网络上对Anders Hejlsberg的评价:
“我崇敬的程序大师,是我通往专业软件设计师道路上的领路人。” 12. Ken Thompson
个人名望:创造了Unix
个人简介/主要荣誉:与Dennis Ritchie一起创造了Unix。
同时也是B程序语言,UTF-8编码,ed文本编辑器的创造者、设计者。Go程序语言的开发者之一。1983年与Ritchie一起被授予美国计算机协会A.M.
Turning奖项;1994年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;1998年被授予国家科技奖章;1997年入选计算机历史博物馆名人录。

网络上对Ken Thompson的评价:
“世界上最杰出的程序员。” 13. Adam D’Angelo
个人名望:问答SNS网站Quora的创办人之一。
个人简介/主要荣誉:前Facebook CTO、研发副总裁,创建了news feed(信息流)的基础架构。SNS网站Quora的创办人之一。2001年以高中生身份参加美国计算机奥林匹克竞赛,最终取得第八名的佳绩。2004年帮助加州理工学院摘下ACM国际大学生程序设计大赛团体银牌。2005年进入Topcoder大学校际算法竞赛决赛
网络上对Adam D’Angelo的评价:


  • “一位程序设计全才。”


  • Mark Zuckerberg的评价:


  • “我做的每一个好东西,他都能做出六个。”


 14. Sanjay Ghemawat
 
个人名望:Google架构师团队中的核心人物。
个人简介/主要荣誉:帮助Google设计并推出了大型发布式计算系统,包括:MapReduce、BigTable、Spanner以及Google文件系统。开发出Unix ical日历系统;2009年进入国家工程院;2012年美国计算机协会Infosys Foundation Award奖项得主。
网络上对Sanjay Ghemawat的评价:
“Jeff Dean的最佳拍档。”

一个程序员要扔掉多少代码,才能成为真正的程序员

技术交流lanqiao 发表了文章 • 0 个评论 • 114 次浏览 • 2018-11-26 14:02 • 来自相关话题

俗语说,女怕嫁错郎,男怕入错行。   程序员这行当,不贫不富,靠技术吃饭,一直还算个体面职业。进了程序员这行的兄弟们,即便日后飞黄腾达了,谈起早年的编程生涯,都还是自豪的。   不过呢,程序员这个职业,有 ...查看全部
俗语说,女怕嫁错郎,男怕入错行。
 
程序员这行当,不贫不富,靠技术吃饭,一直还算个体面职业。进了程序员这行的兄弟们,即便日后飞黄腾达了,谈起早年的编程生涯,都还是自豪的。
 
不过呢,程序员这个职业,有个挺悲哀的地方,那就是无效工作的占比极高。
 
直接点说,程序员辛辛苦苦敲的代码,大部分都是没用的,都是要扔掉的。
 
这个特点非常鲜明,和别的职业差距相当大。
 
和农民比,农民种的作物,几乎很少浪费。有的年景里,白菜丰收价格太低,但也能喂猪吧? 即便只能烂在地里,那也能肥田呢,不算完全浪费。
 
和建筑工人比,那建筑工人砌砖盖房都是要用上几十年的。 虽然也有烂尾楼,但占比非常低吧? 盖了一半的楼,因为质量不行拆了重新打地基的,也很少见吧? 即便有新盖好的房子,被强拆了,但那也是少数。
 
哦,有一种职业,无效工作比例高,那就是军人。军人天天苦练,要打千万发子弹,但大部分军人终其一生,都不曾将子弹射进过人体。但是呢,从另一个角度看,军人的有效工作还得把震慑算进去,扛着枪晃悠晃悠效果就很好了。这样说来,军人的无效工作比例那就真不算低。
 
可程序员就不一样了。
 
随便在上地西二旗拦住一个尘满面、鬓已霜的男子,问他这十年或者二十年所写的代码,有百分之多少,还在运行中? 他细想之下,怕是要泪千行的。
 
要是有程序员反驳说,不对啊,我多年来写的代码几乎都跑起来了,都用起来了啊。那他肯定是做企业应用项目的,而不是做产品的。企业应用项目么,怎么着胡乱对付也能用个几年。做产品的,不扔个几版,能出精品么?
 
程序员的宿命啊,就是被扔,这代码啊,是写了扔,扔了写。
 
而且,程序员的代码扔了就彻底扔了,一点用处都没有。衣服扔了还可以捐给灾区,废代码是不能捐给灾区的,更不能喂猪,烂在硬盘里也不能肥硬盘。
 
彻彻底底的无用废物。
 
兄弟连里,有句话是这样说的:我们是伞兵,注定要被包围。听来特别过瘾,特别有英雄气概。
 
程序员应该说:我们是程序员,注定代码是要被扔掉的。这句话听起来,却是别有一番凄凉滋味啊。
 
不要拿 Ken,Linus之类的大牛来说事,他们是“创造者”,“创造者”不是职业,也不能用百分比来衡量有效工作。
 
扔就扔吧,好在,程序员们都是有佛性的,懂得色即是空空即是色,一切皆是虚幻,本来都是虚拟数码,扔吧。再说,扔的多,开发工作机会就更多。
 
老板们其实也并不心疼,虽然扔的都是他们的钱。
 
有位老板,打过一个比方:这个代码呢,和精子也差不多,写代码就跟啪啪啪一样,你不能指望次次都孕育成果。过程重要,要学会享受过程。
 
这位老板就喜欢扔代码。
 
开发到了一半,需求有问题,扔;开发完了上线,架构不对顶不住压力,扔;上线了找用户,没有用户愿意用,扔;上线有用户用了半年,界面过时不好看,扔;不喜欢某个程序员,把这厮写的都给我扔了,扔了;
 
不过,有意思的是,这个老板最成功的产品,乃是10年前开发出来的,技术早就老的要掉牙,却一直舍不得扔。
 
做过程序员,写过代码的老板,更喜欢扔代码,团队里浪费也更多。
 
这些有技术情结的老板,喜欢追求完美,都有强迫症,还热衷维持庞大的程序员队伍。浪费是浪费,但过瘾啊。
 
而营销出身的老板,就没那么浪漫,多流于市侩,总要问:能改改凑活上线用么?
 
若是问程序员喜欢那种风格的老板? 程序员当然有自己的偏好和选择了,就是给钱多的那个。
 
有创意的电视人,可以在程序员中,办一个调查类的比赛节目,看看谁的代码扔掉比率最高。节目名就叫,代码去哪儿了。也可以叫,扔掉吧代码。
 
有些行业追求作品的流芳千古,比如绘画写作这类艺术行当。但有趣的是,其行业中的顶尖人物,却容易逆反。例如,作家卡夫卡死前烧掉自己的小说,画家高更死前烧掉自己的画作,这些天才觉得没必要跟满世界的傻逼废话,没人能看懂自己,自己死了更没法去解释奥义。唉,才高寂寞啊,烧掉干净。
 
程序员不会。 程序员首先就不会流芳千古,更不用死前烧掉自己的硬盘。程序员的代码,在离死前很久,就都已经扔掉了,彻底扔干净了。
 
万一在临死时分,竟然还有自己写的代码在世界上运行,程序员就会很恐慌:我操,我死了,代码谁来维护啊?
 
所以,代码还是早早扔掉为好。
 
 
来源:伊成Blog(lvoyee.com) 
专业提升、学术探讨、技术交流,这里本没有大神,交着交着你我就都成了大神!