Browsed by
作者:陈皓

芝兰生于深谷,不以无人而不芳 君子修身养德,不以穷困而改志
再谈“我是怎么招聘程序员的”(下)

再谈“我是怎么招聘程序员的”(下)

<<<再谈“我是怎么招聘程序员的”(上)

在上篇中,我们说到了一些认识人的方法(操作,知识,经验,能力),还有一些面试的方法(算法题,实际生产活动中的挑战),下面我们来说说,面试的风格,还有一些点评。

把应聘者当成你的同事

有些公司的面试官,在面试过程中问你一个算法题,然后等着你解答了,如果你给出一个答案,然后就会问你有没有更好的答案,如果你给出了正确的答案,他们就会问你一个更难的问题,如此循环下去。他们基本上很少给你提示,甚至不停地质问你,挑战你,搞得应聘者很紧张。

另外,有很多问题是没有标准答案的,或者说是,同一个答案的描述方法有多种,很多面试官会觉得你没有回答到他想要的答案,因此表现得有对你不屑,并表现出你不行的样子,并觉得你的能力有问题。真是可笑了。比如我一个朋友在回答什么是异步的问题时,举例说明了异步调用就是不能处理完就返回,并且需要传递一个回调函数给调用方以便完成后回调通知结果。这样的回答并没有错,但是这并不符合面试官心里想要的答案,面试官对此并不满意,进而认为我这个朋友还需要去多读读书。

我相信大多数面试官都会这样干的。我想问问这样的面试官,你们有没有用面试的方式对过你的同事?在你的工作场景中,你会不会用面试的风格和你的同事进行交流和说话?不妨让我们来问我们自己下面几个问题:

  • 你在工作当中遇到难题时你是怎么解决的?你会和人讨论吗?你只用15分钟就能得出最优解吗?
  • 你在工作当中解决难题时是否会有一个人在旁边质问你并给你压力吗?
  • 你在工作当中会为难你的同事吗?会让你的同事紧张吗?你觉得在紧张的状态下能做好工作吗?
  • 你在工作中觉得同事的回答并不是你想要的答案,不是符合你的答案,你会认为你的同事不行吗?
  • 你的成长过程是什么样的?在是压力和天天被人质问的情况下成长的吗?
  • 大家都知道学校里应试教育的弊端,你觉得你的面试是不是一种应试呢?
    (看看这么多的应聘者们都在做各种各样的算法题,这不就是一种应试吗?)

想一想你的日常工作,问自己一下上面这些问题,想一想你自己的成长过程,想一想你和你的同事是怎么相处的,想一想你的日常工作中是什么样的,相信你自己也能得出结论的。

如果你把应聘者当成自己未来的同事,那么你的面试会有下面的收获:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (22 人打了分,平均分: 4.77 )
Loading...
BT雷人的程序语言(大全)

BT雷人的程序语言(大全)

还记得以前本站的BT雷人的程序语言吗?除了那几个BrainfuckLOLCODEWhiteSpace,我以为这些是比较BT的语言,但是自从这两天我在网上看到一些(见文章最后的参考一节),我发现我错了,这个世界上,只有更变态,没有最变态。不相,你看看下面这些,简直变态到了极致啊。(下面的语言变态不分排名)

Befunge

第一个变态语言Befunge维基上面说——这门语言由Chris Pressey在1993年创造,本意为设计一种为难编译器的语言……结果马上出现了一批编译器。Befunge的代码是二维的。它用 < > v ^ 这四个符号来控制一个指针在代码中移动,指针经过一个字符或数字则把它压入一个栈,四则运算符号的功能就是弹出栈顶两个元素进行计算后把结果压回去。用 _ 和 | 来表示有条件的方向选择:当栈顶元素为0时向右(上)走,否则向左(下)走。& 和 ~ 分别用于读入数字或字符并压入栈,句号和逗号分别表示将栈顶元素作为整数或字符输出。最后以一个@符号表示程序结束。Befunge代码的注释不需要任何符号标明,你可以把注释写在程序的任何地方,只要运行时指针不会经过它就行了。

下面这段Hello World代码:

>              v
v  ,,,,,"Hello"<
>48*,          v
v,,,,,,"World!"<
>25*,@

下面一个是算圆周率的代码,非常的壮观:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (26 人打了分,平均分: 4.85 )
Loading...
面试题:火车运煤问题

面试题:火车运煤问题

这个可能是一个比较经典的智力题了,和以前的那个《赛马问题》很相似,其题目如下:

你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?

这道题一开始看上去好像是无解的,因为你的火车每一公里就要消耗一吨煤,而到目的地有1000公里,而火车最多只能装1000吨媒。如果你的火车可以全部装下,到目的地也会被全部烧光,一丁点也不剩。所以,很多人的第一反应都是觉得这个不太可能。

如果你一开始就觉得不太可能的话,这是很正常的。不过我不知道你还会不会继续思考下去,如果你不想思考下去了,那么我很为你担忧,因为你可能并不是一个不善于思考的人,而是一个畏难的人,还有可能是一个容易放弃的人。这对于你做好 一个需要大量思考的工作的程序员来说可能并不适合。

我一开始也觉得不可能,后来想了一想,想到一个解法可以最多运送500吨煤到市场,方法如下:(希望你先自己想一想再查看这个答案

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (47 人打了分,平均分: 4.74 )
Loading...
程序员的谎谬之言还是至理名言?

程序员的谎谬之言还是至理名言?

有朋友(网友never)在酷壳Coolshell.cn的留言版上问我,为什么关注了这很多的东西,我想我可以用下文来回答这位网友,因为我和作者的观点几乎一致。这篇文章由 ALAN SKORKIN写的 “The Greatest Developer Fallacy Or The Wisest Words You’ll Ever Hear?” ,我把其全文翻译如下,我很喜欢这篇文章,希望你也喜欢。(翻译的也许不好,欢迎指正)

—————————————————正文分隔线——————————————————

Wisdom

I will learn it when I need it – 我会在我需要的时候再学“!我听到这句已经很多年了。这对于一个高速变化的软件行业环境来说,这似乎是一个非常实用的态度。 在某些方面这的确很实用主义,不过在其它的方面,我为这句话感到很不爽。这句话变成了整个软件行业的福音,但却没有让我们的软件行业变得更好。其问题在于,这句话伪装在于其听上去像是一个智慧的有经验的开发者说的,但是人们只是以此为借口而随波逐流。实在是有太多的东西需要我们去了解,我们也的确需要在工作当中来学习这些东西。但是, “在工作中学习”和“根据遇到的问题捡知识”这两者有着巨大的不同。

  • 另外,目前整个软件行业越来越需要一堆多面手,也许现在已经是这样了,只是我还没有注意到。当然,我也不喜欢这种情。现在,好像没有人愿意花更多的时间来把某一个东西学好学深学扎实,比如 计算机科学的基础知识,或是最新的你正在使用的技术,甚至你在最近几年内每天都在使用其编码的程序语言(参考:Java is passed by value)(译注:我在如何学好C++一文的回复中已经看到一些这样的人)。何苦呢?你会在你的学习路途中看到这些东西被更新,被废弃,并可能变得小众化。我和很多不同的人讨论过很多次,但是好像没有人意识到这是一个问题。 “哥们,做个实用主义的人吧”。
  • 与此同时,我们所有的人都在相互地克隆和模仿(译注:参看中国的C2C)。你需要一个Java程序员,我是一个Java程序员,你也是一个Java程序员,我的邻居也是一个Java程序员。我们之间有什么差别?其实,基本没有差别。好吧,我有一些jQuery的经历,太好,所以,你知道怎么来做一个折叠式的菜单?当然,我可以Google一下,然后剽窃别人最好的代码给你 :)(译注:参看“十条不错的编程观点”中的”Googling it” is okay)。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (96 人打了分,平均分: 4.79 )
Loading...
一些有意思的文章和资源

一些有意思的文章和资源

又到了向大家介绍一些最近我在网上发现的有价值的东西的时候了。(下面的链接中很多都被墙)

  • 本站的关于排序的文章有很多,对于排序算法来说,其受到要排序的个数和数据的杂乱程度的影响,我们知道比较稳定的排序算法是快速排序和归并排序,归并排序对于大量的数据排序效果是非常好的,尤其是我们可以进行并行的排序。这里有一个并行归并排序的算法的源代码,你可以参考一下 – “Parallel Merge Sort”。
  • 说到“奇技淫巧”和算法,这里有一个文章向你展示了C语言中使用位操作可能完成的各种算法,很有意思。请参看 – “The Aggregate Magic Algorithms
  • 这里有篇文章教你如何取得一个在线的哈佛大学的硕士学位,文章中说了一些相关的事宜,包括一些收费情况,并且展示了一张文凭。这里有一个网页说明了哈佛软件工程学位(Software Engineering)的所需要学习的科目,比如:Java和分布式计算,分布式/企业级计算,设计模式和Java,通讯协议,高级数据网络,Web开发,计算理论,Perl实践,Unix系统编程……我不知道我们的国家各个大学的硕士在学什么,因为我没有读过硕士,但好像现在的计算机研究生只是导师用来挣钱的免费资源,而且,实在不知道研究生在校研究什么。不管怎么样,从这看来,我们的大学好像并没有教给学生计算机的技术。比如在“如何学好C语言”和“如何学好C++语言”中我提到的那些书,那些才是大学里应该学的。我国的教育还真不是一般的落后,不过你不妨试试哈佛的在线学位。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (14 人打了分,平均分: 4.14 )
Loading...
我有一个Hello World的C++程序编译不过

我有一个Hello World的C++程序编译不过

在StackOverflow上有这样一个贴子,楼主说,我有下面这样的一个C++程序,为什么编译不通过啊。其让我想起了以前的这两个帖子《编程真难啊》和《给我一个序列号》。仅以此篇文章祝大家假期快乐吧

hello world 程序
hello world 程序

楼主还给出了相关的编译出错的信息(相信你一看就明白问题在哪里了,你应该还会发出一声“靠”!!!)

先是用Visual C++ 2010编译

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

再用G++ 4.5.2编译

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (20 人打了分,平均分: 4.60 )
Loading...
又一个有趣的面试题

又一个有趣的面试题

大家还记得前些天的那个火柴棍式的面试题吗?很有趣吧。下面是我今天在StackExchange上看到的一个有趣的面试题。大家不妨一起来思考一下。问题如下——

有两个相同功能代码如下,请在在A,B,C是什么的情况下,请给出三个原因case 1比case 2快,还有三个原因case 2会比case 1要执行的快。(不考虑编译器优化)

for (i=0; i<N; ++i){
    A;
    B;
    C;
}

for (i=0; i<N; ++i){
    A;
}
for (i=0; i<N; ++i){
    B;
}
for (i=0; i<N; ++i){
    C;
}

我的第一个反应是——

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (13 人打了分,平均分: 4.69 )
Loading...
如何学好C++语言

如何学好C++语言

昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家有用。首先,因为如何学好C语言中谈到了算法和系统,所以这里就只谈C++语言。

  • C++是最难的语言。这个世界上最难的编程语言可能非C++莫属了。你千万不要以为几天就可以学好C++,C++的学习曲线是相当BT的,你可以看看这篇文章。C++是一门很自由的语言,自由到了有点BT和恐怖的地步。我甚至认为C++并不是一门成熟的编程语言,因为太容易犯错了。所以,你一定要在一开始就要有很小心谨慎的态度,并把C++当成一种难以训服的猛兽来看待
  • 多问“为什么要这样”的问题。学习C++一定要多问几个“为什么是这样”,“凭什么要这样”的问题。比如:很多人知道C++有拷贝构造函数和初始化列表,但你真的知道为什么要有拷贝构造函数?为什么要有初始化列表吗?为什么要有template,为什么要有RTTI,为什么不是别的呢?难道就是为了让一门语言变得Cool一些吗?完全不是这样的,C++中的任何一个feature都有些实实在在的原因,你一定要去了解为什么要把C++设计成这样的原因,你才能学好C++。有空看看《C++演化和设计》一书。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (46 人打了分,平均分: 4.63 )
Loading...
如何学好C语言

如何学好C语言

有人在酷壳的留言版上询问下面的问题

keep_walker :
今天晚上我看到这篇文章。
http://programmers.stackexchange.com/questions/62502/small-c-projects

我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!

我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:

  1. 虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
  2. 大量的封装好的类库也屏蔽了很多实现细节。

一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。

下面是我给这位朋友的一些建议:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (134 人打了分,平均分: 4.84 )
Loading...
纯文本配置还是注册表

纯文本配置还是注册表

我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的创新。在网上又看到有人在争论为什么用注册表而不是纯文本,所以,写下这篇文章。

引入注册表所谓的原因

首先,让我们来看一下为什么微软觉得要使用注册表而不是ini文件,下面是一些其列出来的ini方面的毛病:

  • ini文件不支持Unicode
  • ini文件的安全权限不够
  • ini文件在多进程下存取会有问题
  • 如果一个进程锁上了这个文件,另一个进程就无法获得,只能出错。
  • ini文件只能包含字符串,无法使用二进制
  • 解析ini文件相对来说性能比较慢,第一次读写都需要把整个文件读入内存,然后再写回去。
  • ini文件最大只有32K
  • ini文件的默认目录在Windows系统目录下,只能这个目录只能Windows管理员才能访问
  • ini只能包含了两层,对于多层不支持。
  • 把ini文件放在中央服务器上管理很困难。

而微软说,注册表可以完美地解决这些问题。居然微软只说到了ini文件,但我觉得不单单是ini,所有的以纯文本方式保存配置文件的方法都会出现上述这样的问题。

我的观点

那么,当你在看到这些言论时,你是怎么想的?你有没有经过自己的独立思考?还是你觉得注册表完美地解决了所有的一切?下面是我的一些观点:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (21 人打了分,平均分: 4.19 )
Loading...