挑战无处不在
面试过一些应聘者,当我问到为什么换工作的时候,他们都会告诉我,现在的工作没有挑战,无聊,所以想换一个有挑战的工作。于是我问了一下他的工作情况,发现那些有挑战的东西他还没有搞懂。我总是为有这样的认识的朋友感到惋惜,因为我总是认为有挑战的东西无处不在啊,不能因为工作上没有,自己就放纵了自己。比如,面试过一个做地图的工程师,他的工作是做计算地图上任意两点的最短或最优路径的一部分功能。我觉得这个事很有挑战,也有难度,应聘者说,没什么挑战,因为他做的东西只是调用相关的算法库。他在这个项目干了2年了,当我问他有没有看过算法库,知不知道地图是怎么存储的?他却告诉我,因为没有去做,所以就没有去了解,等做的时候再了解(我希望有这样想法的人都去看看程序员的谎谬之言还是至理名言?)。这样的例子很多,很多应聘者在面试中不能和我一起解决某个问题的时候,比如:OOD,数据库设计,系统设计,等,他们都会告诉我,不好意思,因为没有做过相关的事情,所以就不懂了,所以,他需要一个像我们这样的项目来学习和锻炼。我并不要求你能解决你所不擅长的问题,但毕竟数据库,OO,系统设计都是软件开发的基础知识,多少要懂一些吧。
但另外一方面,他们都会告诉我他们对技术充满和热情和兴趣,有着很强的学习能力,也有很能吃苦的态度。这也许是某面试宝典上看来的,面经上可能都会说,如果面对不能作答问题,可以说一下自己的态度和决心。可惜的是,我并不这么想的,我在我的两篇关于招聘的文章里(我是怎么招聘程序员的,再谈我是怎么招聘程序员的)都说过一些我对如何择人的想法。这里重点说明一下其中两个观点:
- 关于热情和态度,说白了就是不要给自己找借口。比如:“工作忙事多没时间学所以可以不懂”,“工作中没用到所以可以不懂”,“工作没有挑战,一直没有遇到合适的项目”等等。时间可以挤,工作之余可以学,随时随地去思考,挑战是无处不在的…… 想想那些你有热情的事,你会发现,几乎没有什么可以阻止你去做那些事。
- 对于某些事情,如果以前没有在你身上发生过,那么这个事情在未来也不会发生。如果你以前没有对你接触过的东西去学习,去深挖,去思考,去改善,那么我不会相信你会在未来面对新的东西的时候也会有这样的态度;如果你以前没有用业余时间学习一些项目之外的东西,那么我也不会相信你会在未来会这样做;如果你以前没有把你的热情和态度转换成你的知识,经验和成果,那么我也不会相信你会在未来能做到。
这两个观点可能太刻薄了,但是,当我回想我自己的经历的时候,观察程序员的成长过程的时候,我发现,优秀的程序员都是相似的,当他们还在是一个菜鸟的时候,就已经有各种成为高手的苗头了,这些苗头就是——他们热爱思考,喜欢解决难题,对新鲜事物非常好奇,总是找人讨论,可以用自己的业余时间狠命研究很多和工作无关的技术,会在业余的时间里写些有趣的小程序,或是会把自己的思路书写下来,等等,等等。
一些问题
我这样说,大家可能会觉得“挑战无处不在”这句话太虚了,而且可能不明白什么叫“热爱思考”,这里,我把我的或别人的思考的东西罗列一下,这些问题,有的会让我思考推敲,有的会让我疯狂地查资料,问人,或是找人讨论,询问。大家不妨可以跟着我一起思考一下。
酷壳上有一些小问题,比如:火车运煤问题,赛马问题,这些问题都不够实际,我觉得也这些问题有点无聊,我们不妨观察一下我们身边的东西,我们就可以看到很多有挑的战的东西,对于这些问题,如果是你来做,你会怎么做呢?
0)许多年前,当我看到珊瑚虫QQ把IP转成地实际地址的时候,我就在思考,如果我有一个IP网段的数据(全球IP地址数据),我怎么来完成这个功能呢?比如:某地点的IP网段是:10.10.1.* – 10.10.5.*。我要有一个IP地址是:10.10.3.20,我怎么匹配这个网段?用Hash表吗?好像有问题。把IP字串转成整型?排序+二分法,好像更容易解决一些,但是如果有一些修改的话好像有点不方便。用树型结构(森林)会不会更好一些呢?如果我要通过地点反查IP段呢?
1)网上短网址服务,你有想过这个短网址生成的算法是什么,如何能做到能最短?怎么查询?你也许觉得会用key-value的NoSQL。那么,如果对于同一个URL,如果要重用已生成的短网址,你怎么用key-value的NoSQL来解决?
英汉词典的检索和这个很相似,如果通过英文查汉语,又通过汉语查英文?如果是N多种语言的互相翻译呢?你的数据存储和检索如何做呢?
2)当我看到Dropbox这样的云同步的软件的时候,我不知道你是否会和我一样会去思考,在多个设备间的文件同步是怎么做的?如果网盘上有几万,甚至几百万个文件,当要和我的本地数据同步时,他如何比较经济地知道哪些文件更改了?需要向服务端同步或是向客户端同步。更进一步,你有没有想过没有中心结点的文件同步问题?你有没有想过,文件冲突的问题?
3)我们的新员工入职的时候,有一些公司会给新员工的帐号生成一个随机口令,然后新员工可以在登录后修改口令(我一直在想我们的银行应该为用户生成一个随机口令,而不是设置一个6个0或是6个8的初始口令)。那么,对生成随机安全口令的算法知道怎么做吗?如果你写出这个算法来了,你怎么证明这个算法是足够随机,生成的密码强度足够大的?(你会发现,测试口令是否随机是否安全的程序,会比生成器更难写)
4)关于动态密码RSA SecurID(如下图),这个小设备上的6位数字会每60秒变一次,在你登录的时候,需要输入这6位数字,服务器上会认证这6个数字,那么这个事怎么做?再试想一下,这样的小设备我要发给我的客户,我希望我的每个客户都使用不一样的随机算法,就算是算法一样,算法的种子也不能一样。那么,如果我的客户一共有百万甚至千万,我的服务端怎么管理这些用户的SecurID?
5)看看我们的网银或是ATM的用户登录功能,如果你登录时输错口令超过3次以上,你的帐号就会被冻结,需要去柜台重置口令。这个功能看上去很安全,因为可以防止黑客在线尝试破解你的登录口令。不过这又带来了另一个问题,如果有一个恶意用户知道你的卡号,他就上网或是造个卡故意输错你的口令,导致你的帐号被冻结,让你一次又一次地去银行排队重置。面对这样的情况,你该怎么解决?
6)当你在网上购物的时候,你会去一些电子商务的网站,这些网站都会对他们的产品进行分类,有大分类有子分类。你进到分类后,你可以通过不同的属性来过滤不同该分类下的商品,注意,不同分类下的商品的过滤属性不一样,如,手机分类和电视分类的属性都不一样。试问,你如何设计你的数据库表结构?
7)当你在泡各种论坛或SNS社区的时候,你会看到,用户在互相回复的时候存在一个问题,尤其是用户量很大的时候,大家的回复完全交织在一起什么 也看不清楚。以前有的论坛使用树形列表来解决这个问题,树形列表好是好,但是把一棵大树放在那里还是很难看。Twitter.com给了一个非常不错的解决方式,就是所有人的回复或是回复的回复都按时间线放在一起,如果你要查看某回复的上下文的话,点击一下这个回复就可以看到了(我在我在“国内微博和Twitter的最大不同”中批评过这个事)。新浪微博在禁评论事件后也开发出了这个功能。你知道这个事怎么做吗?
更进一步,新浪微博的设计上有很多的缺陷,单说新开发的“查看评论”功能这个事来说,还是不完美,因为某些评论会随着转发带到别的地方去,他的“查看评论”功能只能看到当个贴子下的东西,不能把所有转发出去的贴子的评论一起综合起来。虽然这对于用户使用来说没有什么在不了的,但是对于软件设计来说,我们不妨做一个练习,可以思考一下,怎么样设计会更好。
再举一反三,有时候,我发现多个网友会提出同样的问题,我很想用一个回复同时回复他们。如果有这样的功能的话,我们的回复就会从一个树形变成另外一种形状了,我们又该如何设计才能支持这样的功能呢?
8)说到新浪微博,我就想多说几句,我最近观察到了两个事:
- 一个是验证码的事,如果你在你的帐号设置里设置了“登录需要验证码”,你会发现,在登录新浪微博的时候,仅当你输对了口令后,系统才会提示你输入验证码。为什么呢?因为,这个“登录需要验证码”这绑定在你的帐号设置里的,所以,要取这个设置,就需要你登录成功(?!),老实说,这个功能在设计上有点二(中国特色)。如果是你,你怎么设计呢?
- 另一个事情是新浪微博或Twitter的用户名修改后,被他人@过的信息就再也链接不到你这里来了。我们来试想一下,如果是你,你怎么解决这个问题?(我的我的微博里讨论过这个事,不一定对,供大家参考)
9)我有时候我会发一些快递,有时候是一些小东西,有时候是一些大包裹,有时候近,有时候远。我发现一个有趣的现象,就是快递员来收件的时候,快递的价格都是快递员自己说了算的,我还可以和他们砍价。我观察到他们会以距离,重量大小来订价。于是我在想如果你要运营一个物流公司,你作为这个物流公司的程序员,你需要开发一个软件来标注快递价格,你会怎么做?比如,这个快递公司会说,在北京五环以内是一个价,以外是一个价,出省后,上海以北是一个价,上海以南是一个价,等等,这只是北京的,如果把全国的各个城市到别的城市的价格都考虑进来,还要受到重量,体积,价格,是否加急等等因素的影响,你的数据库设计要怎么做呢?
A)国内的水军太恐怖了。他们活动的刷排名,刷信用,刷积分,刷粉丝等等地方,你是否想过如何解决这个问题?还有广告联盟的欺诈问题,等等。这些东西,有的还是可以通过技术手段进行限制和计算的,你有思考过应该使用什么样的方法吗?
B)说到水军就不能不提垃圾邮件和垃圾短信。你有没有想过邮件系统怎么过滤垃圾信息的?
C)关于推荐功能,这必然是一个热点,这是软件产品从request -> response的被动方式到主动方式的进化。微博上有推荐关注者的功能,电商有推荐商品的功能,豆瓣上有推荐影片音乐书籍的功能。不同的领域的推荐算法各不相同,你有没有思考过,如果是你来做推荐算法的时候,你会怎么做吗?更进一步,推荐通常伴随着学习和匹配,学习用户的行为,匹配相似的东西,你想过怎么学习用户的行为,怎么匹配相似的东西了吗?
D)关于微博,某名人有几千万的粉丝,当这个名人发一个微博的时候,需要通知这几千万个粉丝,这个在系统架构上应该怎么做?如果某天这个名人与人发生口角,和人吵架,拼命的刷微博,那么,系统架构要怎么设计才能支持这样的事呢?
E)想想火车票的分段卖票的方式,现有的解决方案是为每个站点预留票,于是我们可以看到火车始发时,有很多空坐,这些空坐都是留给下一个站点的,我们能否开发出一个系统来,可以把一条线上的这些这站上那站下的旅客统筹规划一下,制定出一个最经济的方式,让火车运行得更有效。
F)对于地铁公交网络,我们希望这个网络既能有更多的覆盖,又能节省路线,你能不能设计出一个系统,当我们输入一些数据(如:站点,是否终点或起点站,该站的下一站可能方向(多个),该站是以上车为主,还是下车为主,等等),你的系统能自动安排出各种线路吗?
这样的问题实在是太多了,都是可以让我们去思考的,并不一定有经济效益,但是至少可以让你锻炼一下怎么去分析问题,怎么去思考,怎么去解决问题。
总结
综上所述,我想说的是:
1) 只要你想,挑战是无处不在的。那怕是你现有的觉得无聊的东西,只要你想做到极致,那怕是一个简单的功能(比如用户登录的功能)也会让你充满挑战。
2)观察身边的事物,去思考,去调查,举一反三,这才是你成长的源泉。不要把你的成长推给客观原因。
3)我的软件开发的三重门中说过,第三重门是解决实际问题,让你的业务处理更为的智能,更为地强大。我不知道为什么这一两年,我们的圈子里所有的人都在关注着“云”,“海量数据处理”,“高性能架构”这样的东西,尤其是那些性能调的高性能的东西并不很难,而这些更为实际问题更有挑战性,也更有前景。
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《挑战无处不在》的相关评论
陈皓的文章总是那么犀利!
二十多岁的年轻人需要跟对人,与其说工作没有意思,不如说没有能指明方向的人。再者说挑战的力量来源于压力,或者自己本身原始的冲动。对于前者来说,缺乏指路人,自然没有压力,工作就枯燥;对于后者来说,这种人天生具有取胜的基因,我们无需讨论,成功对他们来说只是时间问题。
不管你接触的东西有多少。只有你认真思考了,能沉淀下来的才是对你有价值的。
顿时觉得白活了。
RSA SecurID 比较简单,其实就是时间相关的128种子算法。
文章是不错,但观点不敢认同。无聊的工作和身边无处不在的挑战根本就是两码事。比如在一个公司,老板每天就给你一些文件,让你做一个文字的输入工作,你觉得要在这上面去寻找挑战吗?人家问的是工作,你这说的是思想。
这些题目都显得太琐碎每天在做或者有人做过了,
考虑到普遍浮躁的气氛下,
这种问题在管理层看不够吊,在社区同僚看也不够吊,自然没人愿意关心
说的灰常好,RSS上看到忍不住过来评论几句。我认为,技术能力是一种积累的过程,有时候一些非常小的问题延伸出去有非常非常多的细节要去考虑,而这些细节则往往是一个项目成败的关键!正所谓挑战无处不在,重点啊。不过有时候大环境的问题,面试时的机械性回答也不必在意,个人认为大多数人换工作的最主要原因还是待遇,其次是发展,然后是工作环境,再次才是个人偏好之类,真相啊真相。
很多时候提出问题比解决问题更难呢.
这个和人的基因有一定的关系呵呵。有没有挑战很大程度不是由工作性质来决定的,而是由自己来决定的
@Yunfei1982
严重同意之。无论你的工作是什么,身边的挑战都存在,当然也值得你去思考。但是,这其实是两回事。如果这份工作本身毫无挑战(比如说严重重复性的工作),这份工作的价值就没有体现出来。即使我辞职在家看书,身边的挑战也依然存在,有心人自然会去思考。然而,这与工作本身并没有什么关系。
我喜欢,嘿嘿
顿然醒悟,谢谢皓哥。
个人觉得思考还是业余时间的事儿,工作时去钻研如何提高效率反而会降低效率。
多想想UC浏览器怎么做才更好
虽然话说挑战无处不在,但是我只是好奇,很多解决办法可能是我等菜鸟闻所未闻,有时候我们会借口说这些因为我没有做过相关项目,所以我不懂,但是陈皓说说这是借口,我只是想问说就算你对某种问题思考很透彻,但是没有相关项目和机会去实践你的想法,你的想法是否有实践意义?是否有纸上谈兵之嫌疑?陈皓是因为编程多年接触的项目也很多思考也很多,但是并不是每个人都有幸和陈皓一样,这才是问题所在。。,牛人可以纸上谈兵,但是大多数人(普通人)其实需要是通过实践出真知的机会,而不是通过纸上谈兵就可以掌握了,因为我们只是普通人。。。。
顿然醒悟,谢谢皓哥。 + 2
工作中有挑战会更快成为高手。更快。
不过人的精力终归有限,挑战无所不在,但还是挑自己感兴趣的进行较好,
相当不错的文章。 自己无聊或许是自己没有给过自己目标。或许只是简单的对工作中的不足进行反思和改进说不定就会带来一些不一样的收获。
如果衣食无忧,如果不用为生活而妥协,那么,陈浩大侠说的东西,我都会赞同。
关键还是因为没有利益驱动吧
有些观点很好,有些不赞同。
生活是如此复杂,而不仅仅是技术,这样那样的借口有时候也不是没有道理,因为别人不了解。
以前做的不好绝对不能代表以后也做的不好。
好的程序员都是技术控,对自己很苛刻,但是不能对别人也有同样的要求,难道是非技术控不招?
最不赞同的是那句话:面试50个可以一个都不录用,我觉得应该是看50份简历找一个面试,只要不差到过分就录用。
如果说思考,个人愚见,哲学问题才是有挑战思考,技术一般花时间都能解决。。。
10.0.0.0/8 网段都是预留给私有地址用的 不可能出现在公网.
好吧 我是来挑刺儿的。。
@zolibra
不见得只是这么简单吧~这样的话,对卡和服务器的时间同步以及各自的精度要求很高,要知道,服务器是允许时间相差比较大的时候再次同步校准的~
网上短网址服务,也是我很想做的;动态id,也是我很想做的,现在做的系列密码工具( http://t.cn/zOxe6FS ),思路就有共同的地方。。。。。。
说没挑战,只是一种各方都不太尴尬的借口吧
能列出这么多“小需求”,说明是一个善于发现、喜欢脑力体操的人
我第一次在上海坐地铁时,就在想它的临时磁卡的机制是怎么实现的:卡里是否存进站的信息。还是仅仅只是一个只读、不变的id。。。
生活也是类似.
图挂了…….
醍醐灌顶,说的太对了。
就比如我们雅思班有个同学,天天高谈阔论中国没有英语环境,从来没见他读过英语,我自己在一边背我的课文。其实大环境都是如此,你改变不了环境,但可以改变自己的思维,创造出有挑战性的生活。
亚马逊中国的特色在哪里,云不必说了,国内没有,长尾理论没有实现,亚马逊的书籍不见得比京东、当当全。而且推荐系统也有致命伤,我已经买了那本书,还在那里推荐,浏览记录作出的推荐单子没有从订单中去除这个信息
同意,永远不要抹杀自己的好奇心
同意这个观点。《程序员的谎谬之言还是至理名言?》里说的“和高手一起工作”——事实上工作有可能是是重复机械的劳动,徘徊在加班和进度问题之间。挑战无处不在,但工作还是需要换掉的。
现实很残酷,很多人能力的提高都是被逼出来的,如果不在实际项目中成长,还是会和在大学校园里一样。试想,如果不给你项目做,就让你自己折腾,有几个人能真正成长起来?做工作关键还是先得把自己份内的事做好,再去需求更大的挑战。
短网址那个可以用冗余 同时用nosql存短->长的映射, sql存常规的办法 毕竟相对于读取生成的时候少的多; 银行密码那个可以用用户名 这样别人试密码的的时候还需要先知道用户名 测试随机数和推荐算法那个有点复杂 基本都是统计学解决 E的话用优先权 设计一个算法总里程越长(¥++)或者越短(填补空的站)给越高的优先权 同时给车站分配权重 两个一减就是余票量 然后里程的权重车站权重一直在变化所以余票量一直在变化 到最后为0那就真没票了 新浪微博验证码那个。。 直接ajax根据用户名取一个参数。。。。 新浪微博的设计吐槽无力的。。。。微博通知那个的话我会直接把每个web登录制造成jabber的客户端 何苦重复制造轮子~
@Rodin
就是这么简单的。。。。。 你把服务器时间改超过(我们的系统用的是)90秒 验证就永远不成功了
可以去读一下google authentication的源码 大体意思不变 算法多一个pk(也不一定 也有对等加密和纯hash做的)
@haitao
哈哈我也是 然后就开始查这方面的资料 发现非接触性的卡非为id卡和iq卡不是不是。。。 ic卡。。。。
id就一个id ic卡自带cpu 很好玩滴~
@cms
同意!看到文章开题贬低有这个借口的面试者,特别寒心。
设计者和执行者 没有谁对谁错
刚刚毕业那会儿,很喜欢想这个东西怎么实现,那个东西怎么实现,
怎么同步QQ好友的在线,还是离线。
迅雷怎么实现P2P下载。
FTP怎么实现断点续传。
当时确实带来了不少的激情和进步。可惜感觉这两年来,越来越麻木,越来越不爱问为什么。
博主的层次确实到了一定境界,所以与部分朋友的思想可能已经在慢慢拉开距离。
受教了,还是少些时间逛逛,多学习吧。
发现身边事物背后的故事~
博主这能力是到一定程度了,所以能这么说。
换工作的小白,还没这么高的水平,见识也没这么多。
0-F 的那些问题就是想到了,也想不出什么本质的解决方案,最多也就当科普消遣下。其中也要走许多弯路,很多就根本找不到正确的方向。
就比如新闻中很喜欢报道的农民造飞机事件,根本就没有一点理论基础,就自己YY,最后只能是一堆废铁。(本人没有攻击农民的意思,每个人都有自己的自由)
豆瓣推荐的文章还真的不错。。。。
人其实都是有惰性的,环境会很大程度上影响一个人的发展,一个是工作上每天要去不断的学习,查找资料,要是做不出来就被鄙视,另一种每天做一些重复无聊的工作,利用业余时间去学习,你说哪种更快更好?
让热情和态度转化成知识,这句话很喜欢
这篇文章是我见过你的最不极端的观点,哈哈,不符合你语不惊人死不休的性格。:)