显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

汉斯的博客

信之:疯子和天才只一步之差,奋起直追,提升自我,坚持不懈,永不言弃!

 
 
 
 
 
 

阿里负责人揭秘面试潜规则

2014-9-26 14:22:06 阅读54 评论0 262014/09 Sept26

阿里巴巴校招负责人揭秘面试中那些你应该知道的“潜规则”

最近负责了公司招聘,发现校园招聘这种事情,真是一个奇葩的工作。能做好校园招聘的人,一定是一个矛盾体。

这个人一定是思维缜密,因为流程在这里特别重要,宣讲会、笔试、面试,需要不能出乱子;这个人还需要有创新意识,做好了宣讲会、笔试面试,也就是中规中矩,没啥特色,如果不弄点有新意的东东出来,也很难找到最优秀的人才。

有人说,这个不矛盾啊。看上去不矛盾,实际上挺矛盾的。因为如果这个人思维缜密,还有很好的创新意识,太难找了。

看了很多大学生过来面试,感触颇多。感触的是,人和人真的很不一样。今天就给大家分享一下我的见闻和感想,不设框架,随便聊聊。

考察三个方面

无论是哪一种面试,主要就看三个方面:现在能力如何,未来潜力如何,人品如何。第一个因素是最重要的,因为后面两个因素有太多的人为判断因素,无法量化。所谓的面试准备,“现在能力如何”很难有大的改变,后面两个因素是可以短时间做一些准备的。

之前有一个很典型的case,有个小伙子能力很强,笔试和初试评价都很高,最后终试的时候,评价特别低,就是因为其被判断为潜力不够。没有钻研精神,对新技术不感兴趣,不愿意深入思考,不主动学习……

毕业学校

总有学生会问类似的问题:你们公司是不是特别看重学历和毕业院校,是不是只招211,985高校的学生?我第一次听见这些问题还好,后来经常听见类似问题。

我发现一个规律:问这些问题的人,一定不是985或者211高校的学生,而且问这些问题的人,内心又有着无限的自卑,总是觉得别人会看不起自己。

作者  | 2014-9-26 14:22:06 | 阅读(54) |评论(0) | 阅读全文>>

前端工程师应该具备的三种思维

2014-9-10 21:24:21 阅读39 评论0 102014/09 Sept10

如果你是一个天才工程师(马上可以离开),可以独立完成一个很多事情,你可以是一个怪咖,因为我相信没有一个人不会不佩服你。但现实归现实,多数人都不是天才,而我们在职场上也不是单打独斗,我们需要团队合作,需要协调和配合,需要考虑除了代码以外的更多事情。

前端工程师,也不仅仅只是负责接资料,捞数据,做个回应。当然只做这些也并没有不对,但我们需要和后端工程师沟通,我们也需要和设计沟通,也需要和 PM 沟通,怎么做才是对这三方都比较有好处?

逻辑思维

在开始写某一段代码的时候,想一下它会用在哪里,会重复用吗? 它以后会不会变,如果会变,那可以怎样变?一般网页结构的变化,虽然有很多但是也有一个根据,这个根据就是可以预先估计好的。没有一个案子,是不会「不改」的,很多时候你都是要一边做一边改,甚至可能会来个乾坤大挪移。当真的需要发生变动和修改的时候,你有什么对策?这些都是需要想好,并且建立在一个逻辑上。

通常专业的设计师,设计一个网页的元素都是同质性很高,等比或对比的,所以代码按理也是可以重复用的。所以为何你要学会用 CSS preprocessor (Sass,stylus,less),写一个 Mixin 或一个变量,一开始用你会觉得很麻烦,但是用了你就回不去了,不但提高你的效率还提高了你的准确率。

工程师的世界就如武林,大家都各自修炼,每天都有新的祕籍,大家都很好奇跑去修炼一下,希望有天成为武林高手。这也是提升你见识和专业的潜动力,如果你没有好奇心,看的和懂得东西太少,逻辑自然不会跟上时代。要保持不断的学习,来磨练自己的逻辑思维。

作者  | 2014-9-10 21:24:21 | 阅读(39) |评论(0) | 阅读全文>>

如何提高Web服务端并发效率的异步编程技术?

2014-9-7 19:54:17 阅读42 评论0 72014/09 Sept7

【编者按】在Java里开发多线程最强有力的实践就是做服务端的并发处理,本文作者阐述了实施多线程的具体实践方法,要真的掌握某种技术你就必须要知其所以然。笔者转发至此,希望对Web开发者有所帮助。

全文如下:

作为一名Web工程师都希望自己做的Web应用能被越来越多的人使用,如果我们所做的Web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的Web应用能有更多人使用,我们就得提升Web应用服务端的并发能力。那么我们如何做到这点了,根据现有的并发技术我们会有如下选择:

给服务端请求开启线程

第一个做法:为了每个客户端发送给服务端的请求都开启一个线程,等请求处理完毕后该线程就被销毁掉,这种做法很直观,但是在现代的Web服务器里这种做法已经很少使用了,原因是新建一个线程,销毁一个线程的开销(开销是指占用计算机系统资源例如:CPU、内存等)是很大的,它时常会大于实际处理请求本身的开销,因此这种方式不能充分利用计算机资源,提升并发的效率是有效的,要是还碰到线程安全的问题,使用到线程的锁机制,数据同步技术,并发提升就会受到更大的限制;除此之外,来一个请求就开启一个线程,对线程数量没有任何控制,这就会很容易导致计算机资源被用尽,对于Web服务端的稳定性产生很大的威胁。

提高服务端并发量

第二个做法:鉴于上面的问题,我们就产生了第二种提高服务端并发量的方法,首先我们不再是一个客户端请求过来就开启一个新线程,请求处理完毕就销毁线程,而是使用一种池技术即线程池技术,线程池技术就是事先创建一批

作者  | 2014-9-7 19:54:17 | 阅读(42) |评论(0) | 阅读全文>>

四个级别的 “自由” 程序员

2014-8-21 9:01:20 阅读78 评论0 212014/08 Aug21

摘要:大多数程序员为企业工作,被捆绑在岗位上,但拥有稳定的收入与福利。如果向往自由,有些程序员会成为SOHO一族,有些则是自主研发产品。而财务自由则是程序员们最高的自由等级,那时,编程更像是一门艺术。

这段时间,作为程序员的我一直在思考关于工作中“自由程度”的问题,终于我得出了一个结论,把它分成了四个级别。

这四个级别与技术无关。通常来说,只要努力追求,我们都可以成功“晋级”。

第一级:上班族

大部分程序员都是从这一级别开始的,甚至大部分程序员会一直停在这个层级。该级别的程序员没有太多自由,只能做那些必须做的工作,而且被“捆绑”在固定位置上。为别人打工也不全是坏处,你可以有稳定的收入和福利,但这一切都是用你大部分自由时间换取的。

第二级:自由开发者

提起“自由工作者”,大家的想法是:可以做自己想做的项目、可以跟不同人打交道、可以到不同的地方工作……

然而自由开发者并不如我们想象的美好。首先,如果你只有大客户,那和上班没区别。其次,就算你有很多不同的客户,你的工作量和压力会远远大于上班族。当然,从收入上来说的确比上班强。

第三级:自主研发产品

当发现自由开发者的生活不如想象中那么美好时,我又开始幻想:如果能研发出一种产品或者一种服务卖给别人,这样就算不工作也有钱赚。

于是我开发了几个地图应用来挣钱。现在我没有固定的老板和客户,就算几个月不工作也不担心没钱赚,基本上可以达到自由。但有个问题,这时的你得自己决定开发的产品或者服务,所以得学会调查市

作者  | 2014-8-21 9:01:20 | 阅读(78) |评论(0) | 阅读全文>>

新浪微博 微彩票 第二轮改造规划

2014-8-15 9:29:48 阅读72 评论0 152014/08 Aug15

1、架构规划

2、前、后端规划

3、规范标准(命名、访问路径、请求、相应规划)

4、性能规划

5、兼容性规划(web与触屏版兼容性)

6、code review规划

7、...

打造全新的项目组团队,力争让每一个参与了该项目改造的人员都能有所提高。

作者  | 2014-8-15 9:29:48 | 阅读(72) |评论(0) | 阅读全文>>

编程认知:多思考、多编码、多测试

2014-7-17 21:41:11 阅读76 评论0 172014/07 July17

摘要:每位程序员有自己独有的编程方式,原文作者Ben Teese在他的程序员生涯中,悟出对编码流程的一些见解:多思考、多编码、多测试。打造软件的过程是一个不断学习的过程,一个好的策略是遵循计划-执行-反思来进行的。

在我的程序员生涯中,悟出了以下的一个程序编码流程;期间也接触了很多其它的理论和想法,但是我还是觉得这是最适合我的。

大致的样式是这样的:

多思考(Think a bit)多编码(Code a bit)多测试(Test a bit)再来一遍(Go to Step 1)

第一步:多思考

有多少朋友会觉得,噼噼啪啪键盘节奏的快慢代表了程序生产力的高低?如果你也是这样想的,我希望你能在遇到问题时,先放一放,静心想一想。

如果思考的时候,觉得无从下手,不妨先问问自己:究竟要做什么? 一旦安静下来,这个问题的答案将会使我们辨清方向或者重新考虑问题的处理方法。

下一步,我会建议思考这个问题:自己是否把简单问题复杂化了? 尝试用最简单的办法来解决问题是每个程序员应该为之努力的目标。但当我们掌握了足够多的学识时,用如此简单的方法来解决问题是否大材小用了?如果这样想,或许最后找上我们的却是一堆堆越来越复杂的问题。尝试转一下思路,用简单的办法解决问题会导致最坏结果是什么呢?是比不能解决问题更差吗?学会跳出牛角尖,这一点很重要。

因此,在遇到问题时,不妨多问问自己以上几个问题。而当进行到一个瓶颈位置,进退维谷时,我会考虑进入下一步。

第二步:多做

我觉

作者  | 2014-7-17 21:41:11 | 阅读(76) |评论(0) | 阅读全文>>

分析Netty工作流程

2014-4-13 19:41:28 阅读153 评论0 132014/04 Apr13

下面以Netty中Echo的例子进行流程跟踪,并简要的

服务器启动->客户端连接-> 服务器处理连接-> 服务器处理客户端数据<-> 客户端处理服务器数据

1:客户端连接:

我们直接看这行代码:

bootstrap.connect(new InetSocketAddress(host, port));

通过帮助类ClientBootstrap来连接服务器。

Debug源码进去发现最后是某个Channel类进行connect操作。

而这个Channel是如何来的呢?其实是从前面的 ChannelFactory和ChannelPipelineFactory得到的。

Channel.connect-> AbstractChannel.connect->Channels.connect(…);

Channels是Channel的帮助类,封装一些常用的操作。在封装操作时,基本都是触发事件。

这里发起一个connectd的Downstream的事件。

所有的事件都是丢给ChannelPipeline进行管理,ChannelPipeline使用了责任链模式来将事件传送给注册到Pipeline中的ChannelHandler,由ChannelHandler进行处理。如果遍历了所有的ChannelHandler后则交给ChannelSink进行处理,ChannelSink根据不同的事件进行不同的处理,

作者  | 2014-4-13 19:41:28 | 阅读(153) |评论(0) | 阅读全文>>

基于Websocket草案10协议的升级及基于Netty的握手实现

2014-4-13 12:12:02 阅读168 评论0 132014/04 Apr13

最近发现,WEBWW在chrome14及FF6.5中没法与后台建立连接了,后面经过查找原因,是chrome14中使用最新的websocket协议草案,而chrome12中使用的websocket协议标准还是草案7.5、7.6的标准;现在草案的最新版本是草案10,草案的链接地址为:http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10,本次协议变更比较大,主要体现在安全性和可扩展性上:

1、握手的标准:

1)、最老的websocket草案标准中是没有安全key,草案7.5、7.6中有两个安全key,而现在的草案10中只有一个安全key,即将7.5、7.6中http头中的"Sec-WebSocket-Key1"与"Sec-WebSocket-Key2"合并为了一个"Sec-WebSocket-Key"

2)、把http头中Upgrade的值由"WebSocket"修改为了"websocket";

3)、把http头中的"-Origin"修改为了"Sec-WebSocket-Origin";

4)、增加了http头"Sec-WebSocket-Accept",用来返回原来草案7.5、7.6服务器返回给客户端的握手验证,原来是以内容的形式返回,现在是放到了http头中;另外服务器返回客户端的验证方式也变了,后面会有介绍。

作者  | 2014-4-13 12:12:02 | 阅读(168) |评论(0) | 阅读全文>>

基于netty的websocket开发小结

2014-4-13 12:08:41 阅读219 评论0 132014/04 Apr13

WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebSocket技术,后台可以随时向前端推送消息,以保证前后台状态统一,在传统的无状态HTTP协议中,这是“无法做到”的。

WebSocket提出之前,为了解决后台推送消息到前台的需求,提出了一些解决方案,这些方案使用已有的技术(如ajax,iframe,flashplayer,java applet ...),通过一些变通的处理来实现。

webSocket是html5新引入的技术,允许后台随时向前端发送文本或者二进制消息,WebSocket是一种全新的协议,不属于http无状态协议,协议名为"ws",这意味着一个websocket连接地址会是这样的写法: 

ws://127.0.0.1:8080/websocket。ws不是http,所以传统的web服务器不一定支持,需要服务器与浏览器同时支持, WebSocket才能正常运行,目前的支持还不普遍,需要特别的web服务器和现代的浏览器。

浏览器对WebSocket的支持 

Google Chrome浏览器最先支持WebSocket,随后是Safari,Firefox,此外最新版本的Opera和IE(Opera11,IE10)也支持WebSocket。

客户端WebSocket的主要方法

1 构造函数

Java代码

var websocket = new WebSocket("ws://127.0.0.1:8080/websocket");

作者  | 2014-4-13 12:08:41 | 阅读(219) |评论(0) | 阅读全文>>

java开源高性能nio框架netty

2014-4-12 16:51:53 阅读146 评论0 122014/04 Apr12

1、netty是什么?

2、netty能解决什么问题?

3、如何使用netty?

4、编写后,如果做监控、安全等的扩展

5、应用在java程序中进行交互。

作者  | 2014-4-12 16:51:53 | 阅读(146) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 4

2014-4-11 21:56:30 阅读128 评论0 112014/04 Apr11

半关闭socket

TCP和SCTP允许用户关闭一个socket的出站流量而不用完全关闭它。这样的socket被称为“半关闭socket”,同时用户能够通过调用SocketChannel.shutdownOutput()方法来获取一个半关闭socket。如果一个远端关闭了出站通道,SocketChannel.read(..)会返回-1,这看上去并没有和一个关闭了的链接有什么区别。

3.x没有shutdownOutput()操作。同样,它总是在SocketChannel.read(..)返回-1的时候关闭链接。

要支持半关闭socket,4.0增加了SocketChannel.shutdownOutput()方法,同时用户能设置“ALLOW_HALF_CLOSURE”的ChanneOption来阻止Netty在SocketChannel.read(..)返回-1的时候自动关闭链接。

灵活的I/O线程分配

在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。4.0使用新的名为EventLoopGroup的接口来替换ChannelFactory,它由一个或多个EventLoop来构成。同样,一个新的Channel不会自动注册到EventLoopGroup,但用户可以显式调用EventLoopGroup.register()来注册。

感谢这个变化(举例来说,分离了ChannelFactory和I/O线程),用户可以注册不同的C

作者  | 2014-4-11 21:56:30 | 阅读(128) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 6

2014-4-11 21:55:51 阅读209 评论0 112014/04 Apr11

良好定义的线程模型

在3.x里并没有良好设计的线程模型,尽管曾经要修复线程模型在3.5的不一致性。4.0定义的一个严格的线程模型来帮助用户编写ChannelHandler而不必担心太多关于线程安全的东西。

Netty将不会再同步地调用ChannelHandler的方法了,除非ChannelHandler由@Shareable注解。这不会理会处理器方法的类似——入站、操作、或者是生命周期时间处理器方法。用户不再需要同步入站或出站的事件处理器方法。4.0不允许加入加入一个ChannelHandler超过一次,除非它由@Sharable注解。每个由Netty调用的ChannelHandler的方法之间的关系总是happens-before。用户不用定义一个volatile字段来保存处理器的状态。用户能够在他加入一个处理器到ChannelPipeline的时候指定EventExecutor。如果有指定,ChannelHandler的处理器方法总是由自动的EventExecutor来调用如果没指定,处理器方法总是由它关联的Channel注册到的EventLoop来调用。声明到一个处理器的EventExecutor和EventLoop总是单线程的。处理器方法总是由相同线程调用。如果指定了多线程的EventE

作者  | 2014-4-11 21:55:51 | 阅读(209) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 5

2014-4-11 21:54:45 阅读84 评论0 112014/04 Apr11

简化的关闭

releaseExternalResources()不必再用了。你可以通过调用EventLoopGroup.shutdown()直接地关闭所有打开的连接同时使所有I/O线程停止,就像你使用java.util.concurrent.ExecutorService.shutdown()关闭你的线程池一样。

类型安全的ChannelOptions

有两个方法来配置Netty的Channel的socket参数。第一个是明确地调用ChannelConfig的setter,例如SocketChannelConfig.setTcpNoDelay(true)。这是最为类型安全的方法。另外一个是调用ChannelConfig.setOption()方法。有时候你不得不决定在运行时的时候socket要配置什么选项,同时这个方法在这种情况下有点不切实际。然而,在3.x里它是容易出错的,因为一个用户必需用一对字符串和对象来指定选项。如果用户调用了错误的选项名或者值,他或她将会赵宇到一个ClassCastException或指定的选项甚至可能会默默地忽略了。

4.0引入了名为ChannelOption的新的类型,它提供了类型安全地访问socket选项。

01ChannelConfig cfg = ...;

02

03// Before:

04cfg.setOption("tcpNoDelay", true);

05cfg.setOption("tcpNoDe

作者  | 2014-4-11 21:54:45 | 阅读(84) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 3

2014-4-11 21:52:24 阅读66 评论0 112014/04 Apr11

每个处理器的缓存

不像3.x那样在每次读操作都简历一个新堆里的缓存来触发上游的MessageEvent,4.0不会每次都创建新的 缓存。它直接从socket中读取数据到由用户的ChannelInboundByteHandler和ChannelInboundMessageHandler实现创建的入站缓存。

因为由上述处理器创建的入站缓存直到关联的通道关闭前都会重用,所以在上面的GC和内存带宽消耗都能保持较小。同样,当接收到的数据被销毁时用户已经完成操作,codec的实现就变得更简单和有效了。

在创建出站缓存时也是差不多的(不会新建)。用户的ChannelOutBoundBYteHandler和ChannelOutboundMessageHandler来操作。

不需要每条消息都有一个事件

4.0里不再有了messageReceived或writeRequested处理器方法。它们被inboundBufferUpdated和flush代替了。用户的入队一个或多个消息到一个入站(或出站)缓存同时会出发一个inboundBUfferUpdated(或flush)事件。

01public void inboundBufferUpdated(ChannelHandlerContext ctx) {

02    Queue<MyMessage> in = ctx.inboundMessageBuffer();

0

作者  | 2014-4-11 21:52:24 | 阅读(66) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 2

2014-4-11 21:51:29 阅读74 评论0 112014/04 Apr11

Channel API的变化

在4.0中,许多io.netty.channel包中的类都经历大量修改,因此文本上的简单搜索-替换是无法让你基于3.x的程序迁移到4.0上。这个部分会尝试将这些重大变更背后的思考过程展示出来,而不只是简单地作为展示所有变更。

翻新后的ChannelHandler接口Upstream → Inbound, Downstream → Outbound

对于初学者来说,术语'upstream'(译者注:直译为向上游,有点像TCP/IP协议栈中从下往上,从物理层最终到达应用层这么一个流程)和'downstream'有点让人迷惑。在4.0中,只要可能,都会使用'inbound'(译者注:直译为开往内地的,相对于upstream确实更贴切,即指数据从外部网络经历层层filter到达我们的处理逻辑)和'outbound'来替换他们。

新的ChannelHandler继承层次

在3.x时代,ChannelHandler只是一个标记接口,而在ChannelUpstreamHandler、ChannelDownstreamHandler、LifeCycleAwareChannelHandler定义了具体的处理器方法。在Netty 4中,ChannelHandler将LifeCycleAwareChannelHandler接口和一堆实现辅助方法融合到了一起,具体见代码:

01public interface ChannelHandler {

02

作者  | 2014-4-11 21:51:29 | 阅读(74) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

广东省 深圳市 处女座

 发消息  写留言

 
对互联网系统与应用架构、中间件架构、大型分布式系统架构、系统性能优化(特别是互联网性能优化)等有深入研究。微信等第三方开发商
 
近期心愿完成一些第三方软件开发,再为创业机缘做进一步的积累、沉淀。
POPO  daihaixiang@163.com
QQ54339729
MSNcnhaixiang@hotmail.com
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
圈子列表加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014

创建博客 登录  
 加关注