8种极品程序员,你属于哪一种?

Who-are-you-really1

 

在日常工作里肯定会发现很多有趣的事情,极品程序员所做的事就是很有意思的。事实上,现在所讨论的极品程序员主要是从他们的判断力、行为举止、个人态度和匪夷所思的工作方式上来判断的,有的时候这些程序员一味的只是追求文档上的内容,而不擅于用分析方式来解决问题。

几乎每一个软件开发者多多少少都会出现头脑短路的现象,也就是说,下面所列举的各种极品程序员类型,总有一款是属于你的。

1. 钟爱型程序员:万般宠爱集于一种技术

这种类型的程序员所遇到的致命错误就是:只钟爱一种技术,对别的技术不来电。其实这不是什么值得表扬的优点。因为这种程序员看上去就像是“天生注定爱上这种框架的程序员”,对于自己喜欢的技术可以说是放不开、丢不掉。甚至在生活里也是一个打破砂锅问到底的人。

a1

 

不管问题是什么,他的回答总是跟他的性格类型脱不了关系:

  • “嘿,我们需要在Rails框架里实现一个内容管理系统,但是我们应该用哪一个数据库呢?”——Mongo数据库
  • “多用户博客呢?”——Mongo数据库
  • “关键业务一致性系统呢?”——Mongo数据库
  • “库存管理系统?”——Mongo数据库
  • “电子病历系统?”——Mongo数据库
  • “分布式数据仓库?”——Mongo数据库

钟爱型的程序员在任何软件开发项目里都会找出各种各样的理由,也不管这些理由是否具有实际意义。但是,一旦你试图反驳他的观点或者是想法的时候,他们在感情上是无法接受的,即使你和他的关系特别好也是没有用的。如果他知道自己的想法错了,也不会告诉任何,而是更愿意在最后一秒的关键时刻偷偷的使用别人的正确方案。

2. 匠心型程序员:保守主义者,不到万不得已不做修复

匠心型的程序员的目标是至高无上的:不考虑成本,尽一切可能保护系统的正常运行和系统的完整性。除此之外,这类程序员信奉一个很简单的哲理,这个简单的哲理也就是引领他们在软件开发和管理实践中的一个基本准则:只要还能将就使用,不到万不得已千万不要去修复。

a2

 

不管什么样的软件,只要是在奥术师的保护下,就一直是使用那个平台、那个部署程序、那个数据库还有那个永远不会改变的操作系统。但是你不必担心,因为匠师会一直盯着这些看上去老旧的组件,也许他不能赢得每一场战斗,但是他一定会为了每一场战斗而凶猛拼杀。
阅读全文

PHP程序员最常犯的11个MySQL错误

对于大多数web应用来说,数据库都是一个十分基础性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一份子。

对于很多新手们来说,使用PHP可以在短短几个小时之内轻松地写出具有特定功能的代码。但是,构建一个稳定可靠的数据库却需要花上一些时日和相关技能。下面列举了我曾经犯过的最严重的11个MySQL相关的错误(有些同样也反映在其他语言/数据库的使用上)。

b1

 

1.使用MyISAM而不是InnoDB

MySQL有很多数据库引擎,但是你最可能碰到的就是MyISAM和InnoDB。

MySQL默认使用的是MyISAM。但是,很多情况下这都是一个很糟糕的选择,除非你在创建一个非常简单抑或实验性的数据库。外键约束或者事务处理对于数据完整性是非常重要的,但MyISAM都不支持这些。另外,当有一条记录在插入或者更新时,整个数据表都被锁定了,当使用量增加的时候这会产生非常差的运行效率。
阅读全文

10个让程序员减压放松的良心网站!

1.  Calm

这是同类型中最火的网站了,站如其名,「平和」,通过自然的图像(阳光下的暖流、淙淙的小溪等)与缓缓的音乐,帮你在短时间内放松下来。

左侧有时间设定,从 2 分钟到 20 分钟,右底部可以改变音频、图像,调节音量等。还有 IOS 客户端下载呦。

a1

 

2.  Do Nothing For 2 Minutes

「木头人,两分钟」,这是一个简单到极致的网站,当你打开的时候,自动开始计时,这时间你不能触碰键盘和鼠标,否则 2 分钟会重置。
阅读全文

感悟:谈谈编程中的哲学,数学,基础,理论,思考与经验

做为一个新人,我是无上尊崇理论的,很遗憾,我却看到不少人对理论和书本嗤之以鼻。
今天在一个web群里,突然又有人问到,md5(a)=b,那么已知b,那么如何解密出a.针对这个问题,却掀起了轩然大波,这本来是一个很没有讨论价值的东西,遗憾的是,很多人还对此争论个不休,却鲜见明白人。

首先,MD5不是一个加密函数,这点我还看到很多人在争论,吵个喋喋不休。说是加密函数的理由是他们在做网站中一直用MD5加密的,如果它不是加密函数那是什么。那么,我用我刷牙的杯子舀水洗菜,那是否可以断然说我的口水杯就是炊具呢?很简单的逻辑,其实,逻辑上的混乱是基础的不扎实。稍微学过信息安全学的人,都知道在信息安全领域,存在各种安全算法,如非对称加密,信息摘要等。这些概念都是很清晰的,都是有定论的,是没有任何争论的价值和必要的。

其实,询问如何MD5从密文还原到明文的,这就已经不是有没有学过信息安全的事,而是有没有用哲学和数学的逻辑思维来思考的问题了,一个人的悟性就往往体现在这里我们都知道,MD5的结果是128位(不是16位,也不是32位,这个问题不该再争论了。),它可以表现为一个长度为16位或者32,甚或24位的16字符串。但是基本的形式是长度为16的字符串。好了,假如说MD5可以还原的话,我们就可以把它看做一个压缩函数。那恭喜你,你的硬盘可以装下10亿部高清电影了,因为我可以把一个1G多的高清电影MD5“加密成”只有16个字节的“密文”,我要看电影,那我只要把这16个字节还原了就可以了。这么看来,这个世界真是美妙。但这是不可能的,所以MD5还原时不可能的,就这么简单的逻辑。
很快,又有人提出反驳意见,说到04年王小云教授的报告,甚至还截图网上的报告,报告中清晰地写着王小云破解了MD5,以此来反驳我。并以数学不是绝对的来反驳我的数学分析。也有人提到只要计算机的性能足够,就可以做到破解密码。在这里,首先我们要明白,其一,媒体总喜欢故意夸大说辞来吸引眼球;其二,破解的定义,什么是破解,什么能叫做破解。我们学习,万万不能涉浅不涉深。至于王小云教授的破解到底是怎么回事,我也不想再细说,这又是一个长篇大论了。可以了解下强无碰撞和弱无碰撞,有限集的概念。至于破解网站,那都是暴力字典比对。

阅读全文

我们该向国外程序员环境学点什么?

程序员的入职门槛和工作环境一直是我们津津乐道的话题,最近就有报道说,在IT技术最发达的美国,人人都可以成为程序员,即使你不是从正规的计算机专业毕业的;即使你之前从没接触过计算机;即使你,只是为了糊口养家而选择编程工作。程序员的世界都是欢迎你的。那么,我们不经要拿外国的程序员工作环境、入职条件等等在我们看来很有魅力的条件和我们国内程序员的条件相对比一下,可是从哪些方面进行对比呢?

一叶知秋,很多IT“专家”其实都只是“砖家”

linghu9990在博客中写到:最近面试了数十个应聘内核开发职位的求职者。这些求职者都来自于芯片或嵌入式操作系统领域出名的非常好的大公司。他们大都声称他们在内核开发领域有至少十年经验。他们的简历看起来闪闪发光,充满着相关项目经验,各种时髦的技术词和奖项等等。

a1

 

但是他们大部分无法回答一个基础的问题:当你调用标准的malloc函数时,内核里面发生了什么?

不要吃惊。当让一位求职者写一个基于 glib 哈希函数的简单 LRU 缓存框架时,他首先说他从没用过 glib,这是我预料之中的。我把 glib 手册给他并给他详细讲解了接口,接着一个多小时以后他只写出了几行糟糕的代码。
阅读全文

常用排序算法之JavaScript实现

笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。

一、插入排序

1)算法简介

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2)算法描述和实现

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
JavaScript代码实现:

 

1 function insertionSort(array) {
2 if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
3 for (var i = 1; i < array.length; i++) { 4 var key = array[i]; 5 var j = i - 1; 6 while (j >= 0 && array[j] > key) {
7 array[j + 1] = array[j];
8 j--;
9 }
10 array[j + 1] = key;
11 }
12 return array;
13 } else {
14 return 'array is not an Array!';
15 }
16 }

 

3)算法分析

最佳情况:输入数组按升序排列。T(n) = O(n)
最坏情况:输入数组按降序排列。T(n) = O(n2)
平均情况:T(n) = O(n2)
二、二分插入排序
阅读全文

内存管理技巧:如何避免JavaScript的内存泄露

高效的JavaScript Web应用必须流畅,快速。与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果消耗过多,页面就会崩溃,迫使用户重新加载。而你只能躲在角落哭泣。

自动垃圾收集是不能代替有效的内存管理的,特别是在大型,长时间运行的Web应用程序中。在这次讲座中,我们将演示如何通过Chrome的DevTools对内存进行有效的管理。

并了解如何解决性能问题,如内存泄漏,频繁的垃圾收集暂停,和整体内存膨胀,那些真正让你耗费精力的东西。

Addy Osmani在他的PPT中展示了很多会在Chrome V8中产生内存泄漏的示例:

1) Delete一个Object的属性会让此对象变慢(多耗费15倍的内存)

var o = { x: 'y' };
delete o.x; //此时o会成一个慢对象
o.x; //

var o = { x: 'y' };
o = null;  //应该这样

阅读全文

95后有多牛?18岁进 Facebook 当全职工程师

Facebook 在物色和吸纳人才方面一贯口碑不错,比如,创业公司就能向它学习如何招到优秀的产品设计师——它家的实习项目也很厉害,总能网罗到天才程序猿,这不,一位刚高中毕业、8 月 24 日满 18 岁的小哥 Michael Sayman 就加入了 Facebook,担任全职工程师——他也是 Facebook 最年轻员工之一。

ddd

 

小哥笑起来很甜美吧,是不是还有点眼熟?没错,Sayman 此番加入马扎哥其实是再续前缘——他之前写了一个火火火火火的 iPhone App,用的还是 Facebook 的开发者工具,随后他引起了 Facebook 的关注。后者特地请他飞到总部和马扎哥碰了碰——一碰,就碰出了个总部实习机会。

Sayman 显然实习得很嗨,他在自己的 Facebook 主页上写道:“在 Facebook 的暑期实习简直爽。不过,当当当当,Facebook 还请我去当全职工程师。嗯,我在这的生涯刚刚起航。” 这条帖子的内容也受到了 Facebook 的认可。

对于这种有点才华有点狂有时简单有时 naive 的 95 后,我只想说一句:带带我。

 

文章来自:36kr

 

实现动态验证码的思路

示例

201407-captcha

 

zswang-captcha

 

背景

验证码主要是防止机器暴力破解。之前的验证码都是以静态为主,现在一些产品开始使用动态方式,增加破解的难度。动态方式以 gif 最为简单可靠。gif 兼容性好,尺寸小。这里分享的就是一种:用 JS 实现 gif 动态验证码的思路。感谢关注。

任务分解

  1. 绘制旋转的文字
  2. 计算每个字符出现位置和角度
  3. 生成 gif 图片

逐步求精

如何绘制旋转的文字?

了解能用的 API

  • context.rotate(angle) 使当前坐标系旋转 angle,单位弧度
  • context.translate(x, y) 使当前坐标系偏移 x, y,单位像素
  • context.font 设置字体
  • context.strokeText(text, x, y [, maxWidth ]) 给文本描边
  • context.fillText(text, x, y [, maxWidth ]) 给文本填充

怎么以文字的中心位置旋转?

void function() {
  // ...
  var x = 100;
  var y = 100;
  var angle = 1 / 8 * Math.PI;
  context.translate(x, y);
  context.rotate(angle);
  context.strokeText('A', 0, 0);
  // ...
}()

以文字的左下角为圆心旋转,不符合预期,见下图效果
阅读全文

Java数组操作的10大方法

下面是精心整理的Java数组操作的10大方法,大部分代码都来自Stack Overflow。

0、定义一个Java数组

String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};

第一种是定义了一个数组,并且指定了数组的长度,我们这里称它为动态定义。

第二种和第三种在分配内存空间的同时还初始化了值。
阅读全文