挑战无处不在

        面试过一些应聘者,当我问到为何换工做的时候,他们都会告诉我,如今的工做没有挑战,无聊,因此想换一个有挑战的工做。因而我问了一下他的工做状况,发现那些有挑战的东西他尚未搞懂。我老是为有这样的认识的朋友感到可惜,由于我老是认为有挑战的东西无处不在啊,不能由于工做上没有,本身就放纵了本身。好比,面试过一个作地图的工程师,他的工做是作计算地图上任意两点的最短或最优路径的一部分功能。我以为这个事颇有挑战,也有难度,应聘者说,没什么挑战,由于他作的东西只是调用相关的算法库。他在这个项目干了2年了,当我问他有没有看过算法库,知不知道地图是怎么存储的?他却告诉我,由于没有去作,因此就没有去了解,等作的时候再了解(我但愿有这样想法的人都去看看程序员的谎谬之言仍是至理名言?)。这样的例子不少,不少应聘者在面试中不能和我一块儿解决某个问题的时候,好比:OOD,数据库设计,系统设计,等,他们都会告诉我,很差意思,由于没有作过相关的事情,因此就不懂了,因此,他须要一个像咱们这样的项目来学习和锻炼。我并不要求你能解决你所不擅长的问题,但毕竟数据库,OO,系统设计都是软件开发的基础知识,多少要懂一些吧。html

       但另一方面,他们都会告诉我他们对技术充满和热情和兴趣,有着很强的学习能力,也有很能吃苦的态度。这也许是某面试宝典上看来的,面经上可能都会说,若是面对不能做答问题,能够说一下本身的态度和决心。惋惜的是,我并不这么想的,我在个人两篇关于招聘的文章里(我是怎么招聘程序员的,再谈我是怎么招聘程序员的)都说过一些我对如何择人的想法。这里重点说明一下其中两个观点:程序员

  • 关于热情和态度,说白了就是不要给本身找借口。好比:“工做忙事多没时间学因此能够不懂”,“工做中没用到因此能够不懂”,“工做没有挑战,一直没有遇到合适的项目”等等。时间能够挤,工做之余能够学,随时随地去思考,挑战是无处不在的…… 想一想那些你有热情的事,你会发现,几乎没有什么能够阻止你去作那些事。
  • 对于某些事情,若是之前没有在你身上发生过,那么这个事情在将来也不会发生。若是你之前没有对你接触过的东西去学习,去深挖,去思考,去改善,那么我不会相信你会在将来面对新的东西的时候也会有这样的态度;若是你之前没有用业余时间学习一些项目以外的东西,那么我也不会相信你会在将来会这样作;若是你之前没有把你的热情和态度转换成你的知识,经验和成果,那么我也不会相信你会在将来能作到。

      这两个观点可能太刻薄了,可是,当我回想我本身的经历的时候,观察程序员的成长过程的时候,我发现,优秀的程序员都是类似的,当他们还在是一个菜鸟的时候,就已经有各类成为高手的苗头了,这些苗头就是——他们热爱思考,喜欢解决难题,对新鲜事物很是好奇,老是找人讨论,能够用本身的业余时间狠命研究不少和工做无关的技术,会在业余的时间里写些有趣的小程序,或是会把本身的思路书写下来,等等,等等面试

 一些问题算法

      我这样说,你们可能会以为“挑战无处不在”这句话太虚了,并且可能不明白什么叫“热爱思考”,这里,我把个人或别人的思考的东西罗列一下,这些问题,有的会让我思考推敲,有的会让我疯狂地查资料,问人,或是找人讨论,询问。你们不妨能够跟着我一块儿思考一下。shell

酷壳上有一些小问题,好比:火车运煤问题,赛马问题,这些问题都不够实际,我以为也这些问题有点无聊,咱们不妨观察一下咱们身边的东西,咱们就能够看到不少有挑的战的东西,对于这些问题,若是是你来作,你会怎么作呢?数据库

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)个人软件开发的三重门中说过,第三重门是解决实际问题,让你的业务处理更为的智能,更为地强大。我不知道为何这一两年,咱们的圈子里全部的人都在关注着“云”,“海量数据处理”,“高性能架构”这样的东西,尤为是那些性能调的高性能的东西并不很难,而这些更为实际问题更有挑战性,也更有前景。

转自:http://coolshell.cn/articles/7048.html

相关文章
相关标签/搜索