非阻塞代码似乎不是更好的选择

我没有得出一个明确的答案,尽管编写非阻塞代码似乎不是更好的选择——它不应该更快或具有更高的吞吐量,尽管传统观点认为应该如此。

因此,抛开理论问题,我决定做一个基准测试。代码非常简单——它将一个46kb的文件读入内存,然后将其写入响应。这是最简单的场景,仍然是关闭web应用程序的常规用例——从数据库中读取内容,对其执行一些逻辑,然后向客户端写入一个视图(如果数据库在另一个服务器上,这是磁盘I/O对网络I/O,但我们现在忽略它)

有5种截然不同的场景:使用BIO connector的Servlet,使用NIO connector的Servlet,Node.js,使用sync文件读取和Spray(一个scala非阻塞web框架)的Node.js于执行测试,并在t2.small AWS实例上运行;应用程序代码在单独的m3.large实例上运行。

基准测试中使用的代码以果您发现基准测试确实有问题,导致结果失真,请告诉我)

做什们?不管它是阻塞的还是非阻塞的。响应时间和每秒请求数(以及其他因素)的差异可以忽略不计。

https://www.douban.com/note/831216064/

当负载不是很高时,Spray似乎稍微好一点,而BIO恰好在非常高的负载下有更多的错误(但同时也是最快的),Node.js对于javascript运行时来说惊人地快(为Google的V8致敬)。

不同运行中的差异更可能是由于主机虚拟机当前的CPU和磁盘利用率或网络延迟,而不是编程模型或使用的框架。

得出这个结论后,spray看起来更快的事实让我很困扰(特别是考虑到我在休息半小时后执行了spray测试),所以我想在今天早上重新运行测试。我关于基础设施因素作用的假设被证明是再正确不过了。我运行了60,000个请求的测试,平均时间是3秒(对于spray和servlet),有几百次失败,每秒只有650个请求。这与我的观察一致,即当我在清晨(GMT+2,当欧洲还在睡觉,美国已经在睡觉时)开始并删除云形成堆栈时,AWS的工作速度要快得多。

该基准仍然有效,因为我在一个周日下午的1小时内执行了它。但是整个实验让我更加相信我在上一篇文章中得出的结论——非阻塞没有明显的好处,人们不应该为了想象中的性能提升而强迫自己使用可能不友好的回调编程模型。撇开利基案例不谈,对于一般的场景,你应该选择团队中的人最习惯的框架、语言和编程模型。

https://weibo.com/ttarticle/p/show?id=2309404772070947946663

前几天我卫·拜托(David Byttow)讲述了“

如何找到一份工程工作”。而且我也不完全同意他的论断。

当然,我同意一个人必须一直写代码。对于软件工程师来说,不写代码是最糟糕的事情。

但是一些细节是我们意见分歧的地方。我不同意你应该记住著名算法和数据结构的复杂性,我也不同意你应该能够从头开始实现它们。他没有给出这个建议的理由,只是说“这样做”。不要误解我——你应该知道什么是计算复杂性,以及遍历图和树有什么算法。但是你自己去实现它们?为什么我已经实现了排序算法,树结构和类似的东西好几次了,仅仅是为了它。两年后,如果不检查一个例子或描述,我就不能再这样做了。为什么?因为你在日常编程中从来不需要这些东西。如果你能在30秒内找到它,为什么你会知道一个图搜索算法的复杂性?

https://m.weibo.cn/ttarticle/p/show?id=2309404772070947946663​​​​​​​

我不同意的另一件事是解决类似TopCoder的问题。是的,它们可能会帮助你提高你的算法编写技能,但是花时间在这上面,而不是给我写实际的代码(例如,作为附带项目)有点浪费。不是你不应该做的事,而是你不必做的事。如果你喜欢解决这类问题,那就想尽一切办法去做。但是不要坚持“真正的程序员解决非现实世界的谜题”。尤其是当问题是如何得到一份软件工程的工作时。

因为软件工程,我再次同意David Byttow的观点,不仅仅是写代码。它考虑软件系统的所有方面,使用许多技术和许多抽象层次。但他坚持认为,你必须专注于较低层次(如数据结构),并成为这方面的专家。但是要你很好的概述了下面/上面那些。

让我们面对现实吧——找一份工程工作很容易。对工程师的需求远远高于供给,所以你必须非常无能才能得到任何工作。如何找到一份有趣且高薪的工作是另一回事,但我可以向你保证,这样的工作也足够多了,而且并不是所有的工作都要求你在面试中解决大一的风格问题。我看到有一种趋势,特别是在硅谷,要求熟记软件工程的计算机科学组成部分如果你想在谷歌或脸书工作,你必须知道流行算法的复杂性,并且能够在白板上实现红黑树。但这并不意味着每个有趣的公司都需要这些东西,也不意味着你不是一个有价值的工程师。

最后一个分歧——不知道你申请(或招聘你)的公司的具体细节,这没关系。也许公司对自己很着迷,但是当你去一个没有全球知名度的中小型公司时,不知道他们所处领域的竞争是很好的。(不管是你申请了,还是他们猎头了你,这都是有区别的。)

但是我的反建议不会给你带来一份平庸的工作吗?不。有些公司在做“很酷的事情”,他们不在乎你是否熟记迪杰斯特拉的算法。只要你表现出解决问题的能力、广泛的专业知识和对编程的热情,你就被录取了。其中包括TomTom、易贝、乐天、爱立信(我面试过或工作过的公司)。这可能不会让你在谷歌找到工作,但我们应该专注于成为优秀的工程师,还是满足硅谷的人工面试标准?

到目前为止,我基本上不同意,但我实际上并没有给出要点。因此,除了大卫文章中我同意的东西之外,这里还有一些:

  • 很好地了解一项技术——如果你在过去的一年里一直从事某项技术的工作,你必须对它有深入的了解;否则,你看起来就像那个不知道自己在做什么的人,但仍然会得到一些样板/简单的任务。
  • 表明软件工程对你来说不是朝九晚五的事情。关注最新趋势、拥有博客、GitHub贡献、自己的兼职项目、讲座、聚会——所有这些都很重要。
  • 拥有广泛的专业知识——仅仅是一个“非常优秀的Spring/Rails/Akka/…”开发人员是不够的。你必须知道软件是如何设计、部署和管理的。你不需要自己编写数百万行的CloudFormation,或者支持一个Puppet安装,但是至少你必须知道什么是基础设施和部署自动化。(咻,我设法避开了“全栈”这个术语)
  • 了解基础知识——正如上面指出的,你不需要记住复杂性和实现。但是不知道什么是哈希表或链表(至少在使用模式方面)会大大降低你的机会。知道有些东西在你需要的时候就存在,是知道如何写它和对它一无所知之间的实际妥协。
  • 能够解决问题——通常面试官可能会问一个假设的问题(事实上,是他们最近面临的一个问题),然后看你如何解决这个问题。不要说你没有足够的信息或者你不知道——试着解决它。这可能不正确,但经过深思熟虑的尝试仍然算数。
  • 要尊重。这并不意味着过于专业或害羞,但假设面试你的人和你一样——都是热爱创作软件的优秀开发人员。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值