关于翻译:译证明你可以做困难的事情

原文地址:Proof You Can Do Hard Things原文作者:Nat Eliason本文永恒链接:https://segmentfault.com/a/1190000044187657译者:Fw恶龙校对者:Fw恶龙当一个富裕好奇心的学生问为什么须要学习微积分时,你会怎么答复? 你也晓得只有一些非凡职业会应用到微积分,而大部分人在成年后是根本用不到的。 你能够对他说:“这对你上大学有帮忙”,但他们仍会想晓得为什么大学会在意你是否懂得微积分。而如果他们曾经到了大学,兴许你会说:“这能够帮你找到一份好工作”,然而为什么企业的老板会关怀你会多元微积分呢? 我就是这些烦人学生中的一员。我从没有听到过有谁对这一问题进行很好的解释,以至于只管我能够获得优异的问题,但从来不关怀是否可能获得好的问题。 我仍不明确辛苦地学习那些在事实中永远不会应用到的常识有什么意义,我认为能够不必认真对待这些课程,只做最根本的要求,而后还可能顺利毕业。 但我最近意识到学习微积分是为了证实你能够解决艰难的事件。 你可能为本人或你的孩子造就的最有用的能力或者就是能够解决艰难事件的能力。证实你有能力做到这些,将会是你简历中很好的一个竞争劣势。 咱们对待本人的形式是由新近所取得的能力组成的。你越强制本人做艰难的事件,就会发现自己越有能力。就好比你如果可能跑齐全程马拉松或可能举起两倍于本身体重的杠铃,那么因为关照新生儿而给你带来的睡眠不足对你而言也只是小事;如果你善于有机化学或计量经济学,那么你将轻而易举地找到一份金融相干的工作。(此处是指在你解决了更加艰难的事件后,一些原本会对你造成困扰的事就显得轻松许多) 但如果咱们始终以回避的态度面对艰难,那么在面对任何一点有挑战性的事件时对你而言都会变得难以克服。咱们会因为一些小事就到某音上哭诉。咱们会发现自己无奈学习新技能、从事新职业、解脱蹩脚的处境。而证实你能够做艰难的事件,是你能够送给本人最好的礼物之一。 我会尽可能防止对孩子们扯谎,因而我不会通知他们学习微积分是如许重要的一件事,也不会通知他们问题有如许重要。事实上,学习微积分只是用来证实你有能力去做艰难事件的一个形式,但如果你自身就曾经在做艰巨的事件,例如在业余时间学习编程和构建应用程序、博得一场足球比赛、写一部小说……那么微积分对你来说就不是很有必要,你所做的事件可要比它难上许多。 这也是为什么在“问题优异的学生通常会受雇于问题较差的学生”这句话中存在着很多幸存者偏差和谬误倡议的起因。事实上,大多数问题较差的学生并没有去做其余艰难的事件来代替学校的作用,他们只是在鸿鹄之志,所以最终大部分只能受雇于问题优异的学生。 但有些学生学习成绩较差是因为他们沉迷于其余艰难的我的项目。随着工夫的推移,这种对于谋求艰难指标的执着让他们超过了同龄人(Excellent Sheep)。所以,如果你有一个问题较差的学生,而他正执着于一些艰难的事件,你大可不必放心。但如果他们正在嗑high了,看抖音,那就蹩脚了…… Excellent Sheep「卓越的绵羊」:这个词组出自威廉·德里斯科尔(William Deresiewicz)的同名书籍,用来形容在高等教育零碎中,过分谋求问题和传统胜利规范,不足独立思考和真正趣味的学生。这个词组常被用来讥刺过于刻板的教育体制和对于标准化胜利的适度谋求。我并不会特地关怀孩子们上学后的问题。我真正关怀的是他们是否能够向我证实有解决艰难事件的能力。如果他们想用微积分来证实,那没问题。但还有很多很多其余抉择。 如果你不晓得本人是否能做艰难的事件,那就想方法向本人证实这一点。或是养成一个好习惯,或是学习一项技能,或是发明一些货色,无论是什么,都能够让你在面对挑战时的态度从“看起来很难”变成“我能解决”。 去证实你可能做艰难的事件吧。

September 6, 2023 · 1 min · jiezi

关于翻译:译-你的软件可以从ATM机的巧妙设计里学到点什么

原文链接: https://www.simplethread.com/your-software-can-learn-a-lot-fr...为良好失败设计回顾一下你最初一次应用ATM,很有可能,你左近就有一台,你应用ATM机的次数,你本人都数不清。 你从ATM接管到过数目不对的钱嘛? 我猜的答案肯定是没有过,只管ATM机每年存取数百万的钱。只管解决像发放正确数量现金这样的简单工作,ATM机的可靠性证实了设计的独创性。ATM机是如何实现高牢靠的。可能你会感到十分诧异,答案是相当简略的。ATM机采纳了一个比较简单的机制,从一叠钞票中一张一张的抽出,而后在通过时验证他们的厚度。如果抽取的钞票比预期的要厚,很可能是因为多张钞票粘在了一起,取款就会被回绝并留下来供人工查看,这个零碎并不完满,它为良好失败所设计。 那么这与软件设计有什么关系呢?ATM给咱们提供了好多贵重的教训: 执行工作验证工作验证工作执行失败,进行和再次尝试,这种设计的美好之处在于其简洁性,ATM机不是通过创立简单的机制来确保百分之百的可靠性,而是被设计为优雅的解决故障。这是软件开发者须要用心记下来的一节课。为了构建牢靠的零碎,上面一些步骤需遵循。 被许多开发者所忘记的准则为了建设高牢靠的零碎,你须要: 执行繁多、可验证的工作验证工作的执行后果如果验证失败,就撤销可撤销的操作,告诉相干人员。上面设设计软件中,也须要防止一些做法: 下图是软件设计中须要遵循的实际 在验证之前不要做多个操作: 放弃简略, 验证每个步骤。防止为了清理删除一些货色: 相同,隔离有问题的文件能够保留状态信息,这会帮忙咱们解决问题。不要主动去修复问题: 除非你对问题确信无疑,否则编写错误处理代码可能会引发意料之外的问题。失败的时候要有日志记录或状态隔离: 当呈现谬误时,收集数据,并将其搁置在已知的谬误地位。不要在共享地位执行操作: 如何可能呈现故障,在一个长期区域先执行操作。简略,验证,无效的失败解决简而言之,软件设计哲学该当和ATM设计相似,崇尚简略,确保验证,无效的解决失败。 软件的牢靠并不需要借助简单,他须要领有良好的故障解决能力。让咱们持续从物理工程外面汲取灵感,在软件设计中记录这个无效的教训。 上面是文章的评论读者Nicholas Piasecki的评论:如果技术人员调换了10美元和20美元 墨盒,那么ATM机就会给出谬误的金额,这揭示了一个令人丧气的事实,就是总有出错空间。因为我遇到过一次这样的状况,我立即走入了左近的一家分行,退出了丧气人群的队伍,他们都不太高兴,设想一下,被扣掉80美元,但只拿到了40美元。(有些机器曾经通过只有20美元来解决这个问题) 但这依然是一个不错的倡议,就像红绿灯一样,如果工夫谬误导致两个相同方向的的红绿灯都呈现了绿灯,那么保险丝会被熔断,导致所有的信号灯都进入到闪动的“黄灯/红灯模式”。很多软件都能够采纳相似的保险丝技术。他放弃了持续运行,直到有人来查看我为止。然而可怜的是,这种故障爱护在软件中意味着“解体”而不是降级。 尤其是故障很少产生时,你能够间接点重试,而不是编写很少应用的异样代码。 读者mat roberts的评论:我已经在ATM机外面取出谬误的金额,只有一次,那是一个硬件问题--纸币又旧又皱,不晓得是什么起因,在机器外面被卡住了。作者回复Nicholas Piasecki: 这就是互联网,我晓得我一发这篇文章就能收到1000条从ATM机外面取到谬误金额的评论。Jonathan Pryor的评论: 总结这篇文章就是放弃简略,放弃简略,放弃简略,放弃简略。哦,还是放弃简略(因为放弃简略而容易验证),这也是咱们为什么要有开发者准则,不要捕捉异样(Exception 异样的基类),除非前面跟着软件的退出,因为它不简略而且无奈确定具体捕捉的是什么异样(比方OutOfMemoryException),程序是否平安的继续执行。 放弃简略、愚昧,如果咱们认为很厉害,咱们曾经失败了,咱们须要时刻揭示本人咱们并不聪明,这样做,咱们将确保咱们的软件能够被普通人所了解,这对咱们都有益处,因为咱们都是凡人。 读者Al Tenhundfeld的评论: 这与Erlang的“让其失败”准则有些相似,只管不完全相同。指标是尽量避免失败复杂化你的设计。 我没有应用Erlang工作过,但据我理解,Erlang在解决故障的时候应用了一种乏味的繁多职责办法,你不会在你的畛域实现外面混淆大量的谬误弥补代码。相同,你有监督过程来察看你的实现过程,并决定在失败的时候做些什么? 这样做对嘛? 另外,这也让我想起了测试驱动开发取得的很多有价值办法中的一个。当我实际TDD的时候,我发现更偏向于思考代码应该如何失败。而且,我常常可能从新设计API,使其不对谬误进行弥补,而是不容许谬误状态的存在。 作者对Al Tenhundfeld的回复: 你说的很乏味,因为整个文章都变成了关于软件故障的内容。我批准,在大多数状况下,用错误处理来净化你的代码只是一种节约。通常状况下,更好的做法是花工夫记录日志,这样当谬误产生的时候,你就晓得产生了什么,并且可能通过修复软件进行弥补,而不是让软件经验繁琐的操作来尝试自我修复。

June 16, 2023 · 1 min · jiezi

关于翻译:译-我仍然喜欢编程的十件事续

前言,这个翻译系列有点让我骑虎难下的感觉,原本打算翻译软件破绽呢,然而发现这篇文章更乏味,于是就决定先翻译这一篇。 原文: https://www.simplethread.com/... 这篇文章是我依然喜爱编程的十件事的续篇。 11. 学习新工具软件工程在许多方面依然是不成熟的。这意味着咱们的工具会一直的倒退。对于旧有的问题人们一直给出新的办法去解决。在加上来自于程序员喜爱的懈怠驱动式翻新,你就会有各种各样的实用工具和开源解决方案去简直解决任何问题。我在DIY(Do it yourself 本人动手做)畛域有过相似的感触。比方,在木工畛域,你能够应用电锯手工管制角度,只有你有足够的毅力和急躁就能做的很好。而后你的木匠敌人带着它的斜切锯来了,哦,天呐(原词为 oh,man,译者认为这里表赞叹,所以未采取直译),这些角度就变得如此容易切割,那么润滑,看起来那么丑陋。如果你和我相似,那应该也了解,那是一种十分让人满足的体验。如果你认真思考,编程也能够给你很多机会找到适宜当前任务的工具。 12. Helping people 帮忙他人我以前写进入软件工程畛域是因为对视频游戏感兴趣,并且驱动我去了解视频游戏背地产生了什么。尽管这是真的,让我继续对技术放弃趣味的另一部分起因是齐全的掌控感。这是四周大多数人都不了解的货色,而我能够帮忙他们了解它。是的,这意味着有的时候要为敌人或家人做IT反对。是的。当人们的冀望不统一可能就会感到腻烦。这实用于大多数技术业余,我置信医生、机械师、建筑师、律师也会有一样的感觉,每个人必须设定界线。归根接地,我很开心有一项技能能够帮忙他人。即便我偶然不得不把手举起来说: “道歉,我不晓得你的打印机出了什么问题,然而你否试过重启” 13. Practicing magic 修习魔法我年老的时候浏览过大量奇幻书籍。直到现在我依然空想成为一名巫师,领有说出正确咒语或执行正确的步骤就能扭转四周世界的能力。我想平凡的作品能够做到这点,然而我素来没写过任何被我认为是魔法的货色。最靠近感觉本人像是施展魔法的时刻是构建软件,特地是在DevOps方面,如果你编写了正确的Ansible 脚本或 Terraform 打算,忽然之间一整个协调的服务器队列都在依照你的志愿运作。如果你天天做DevOps,就会让你丢失兴奋感。但对于我来说,这是非常少有的让我看到所有东倒西歪,就像施展魔法般让人欢快,令人沉醉。 14. Turning ideas into reality 将想法变成事实。咨询业最酷的事件是有机会帮忙很多人建设他们独自建设不了的产品-远远超出他们原有愿景的产品。他们可能有一个产品的想法,或者他们对问题有充沛的理解和信念,认为肯定有更好的形式(办法)。不论怎么样,咱们有能力让他们产生,把形象的想法变成事实世界中的人可能从中受害的货色。我永远不会厌倦领导客户实现这个过程,即发现他们真正想要实现的指标,而后帮忙他们将这些想法变成一个真正的、无效的零碎。 15. Diagnosing ridiculous Heisenbugs 修复一些匪夷所思的bugHeisenbug是一个对于bug的术语,当你试图去找起因并且复现时无奈复现。它也是随机呈现并且没有显著谬误的bug 的通用缩写。大多数软件中的bug都是间接的,比方没有思考过的状况,没有思考的上游效应等。然而有些时候,你碰到这样一个问题,始终找起因,然而依据代码推断基本就不可能有这样的行为。然而在你放弃之前,老天啊,你象征地重现了它。这时你就晓得你要学点好货色了,尽管它可能并不令人欢快。他可能是一个谋杀案,而你就是凶手。这个bug会填补你的常识空白,进步你的专业知识程度。例如,通常状况下,如果磁盘有空间并且过程有权限就能够向磁盘写入文件,除非它是一个旧的FAT32(文件系统)的磁盘,你正在向外面写入一个65k大小的文件,因为清理过程,写入会偶然失败。这对我集体来说是一个特地苦楚的教训。 16. Solving impossible problems 解决一些不可能的问题在软件工程畛域,如果有短缺的工夫和精力,简直任何问题都是能够被解决。这既让人兴奋也让人困倦。有时人们会要求你去做不可能做的事件,有时答案是不行,技术还不存在。但更多时候,答案是,这依赖于你进行头脑风暴和钻研,和共事进行白板会议。你经常就能相处一个以前你感觉不可能被解决的解决方案。提醒: 不可能的解决方案通常是通过找出如何将问题从新定义为可解决的问题。而后,你再解决这个问题。一个常见的例子是,如果实际上不能让一个操作变得更快,但兴许咱们能让用户感觉更快。我也曾涉足其余畛域,但没有什么能与编程等量齐观,因为我常常面对那些感觉不可能解决的问题,但最终还是找到了解决办法。 17. SQL我非常高兴NoSQL静止稍稍消退,称为另一个版本的正确工具。我钻研过很多备选的数据库,他们在特定状况下表现出色。例如我喜爱的Redis和Elasticsearch。然而,我依然认为关系型数据库是很棒的通用数据存储--它们是鲨鱼而不是恐龙。(译者著: 鲨鱼和恐龙是同一个时代的物种,这里译者认为是在暗喻关系型数据库在不断进步,适应时代。)我喜爱 PostgreSQL和其余关系型数据的一个很大起因是SQL,是的,它由一些奇怪的不统一之处,并不完满,然而一旦你把握了基础知识,SQL就是一种查问和解决数据集的漂亮直观形式。 在不同的键上连贯多个数据集,做聚合、分组等,为缺失的值提供默认值。当然,你能够在Ruby、Python、C#中做所有这些事件,并且成果也不错。然而在SQL中更加污浊,或依据数据集的值来更新一个数据集的属性? 是的,我将放弃我的SQL技能敏锐,非常感谢。 18. Psychic debugging 通灵调试零碎存在着一个奇怪的问题? 是DNS的问题吗? 不是? 你确定? 好吧,是字符编码的问题? 你确定你没有从Word中粘贴一些智能引号? 兴许是缓存没有正确。在这个畛域曾经有一些念头了,一个乏味的事件就是某些乏味的事件就是某些问题会一直呈现。我曾经数不清有多少次同时形容了一个问题。我在对于代码无所不知的状况下就能准去地诊断出这个bug。这相对让人感觉是某种神秘的、通灵的力量,但其实只是我犯了很多谬误,看到了很多奇怪的货色。 顺便说一句,在那时,问题永远都在DNS上,即便是你曾经齐全排除了DNS。 19. Refactoring 重构重构指的是改良软件的内部结构,同时保留它的可察看行为。但更一般地说,它是指在个别不扭转性能的状况下,清理代码。 一些开发人员认为这很乏味并且浪费时间。但这个观点是错的,道歉,我认为重构是编程中最大的乐趣之一,特地是在长时间工作在一个零碎下的时候。在生活中,你有多少的机会修改过来的谬误? 你有多少机会从新扫视过来的决策并更新它们以适应一直变动的环境。对我来说,并不是很多,并且可能进入凌乱的代码局部,构想如何更清晰地组织它,而后井井有条地进行合成和去模糊化时,你会感到无比的满足。当你实现重构后,测试依然通过,所有工作都和以前一样,但它不再是代码库中人们胆怯批改的局部。 20. Being cool under pressure 在压力下放弃沉着最初一点这并不是编程独有的,但这是我常常体验到的状况。在我职业生涯的晚期,我和一些高级开发人员一起工作,他们在压力下放弃平静。 你会从一个重要的客户那里收到一份奇怪的生产错误报告。数据隐没了? 这到底是怎么回事? 你会开始钻研这个问题,并且胃里有会有一种沉甸甸的感觉.....哦,事件十分不对劲,肾上腺素开始跳动。所有都十分蹩脚,你拉进领导开发人员开始缓和地讲述你所做的所有。他们让你说完,而后平静地回到结尾,兴许走到白板前。 “好吧,让咱们从列出咱们晓得的货色开始,而后咱们能够列出.....”等等。你从惶恐不安到感觉所有都会好起来。有这样人在你的团队真是一种解脱。不知何故,只管困难重重,我想我曾经胜利地在很多软件工程背景下成为这样的人。我能够排汇团队中人的压力,并散发回一种平静的感觉。这并不是说我有什么非凡的能力;我只是看到了足够多的软件问题,并设法找到了正当的解决放那。所以我置信不论这个新的危机是什么,咱们都能度过。可能为咱们团队中的人提供平静的起源十分让我开心。 ...

January 31, 2023 · 1 min · jiezi

关于翻译:译-仍然让我喜欢编程的十件事

原文来自于: https://www.simplethread.com/...这篇博文的灵感来自于我的联结创始人Justin的《编程20年我学到的事》,我没有在这个列表增加太多,然而读了这篇文章之后,我发现我在想所有依然让我喜爱编程的事,即便做了20年。上面是带给我高兴的10件事。 近些年,我的日常工作次要是领导和治理,更多的在于为他人发明胜利的环境,但在这个清单外面,我次要关注的是作为一个开发者编写代码和在生产零碎上的方方面面。不论你的编程教训如何,我心愿上面这些可能让你共鸣。享受吧(enjoy) 1. 等等,这怎么做到的(或者这是为啥呢)这是开发者的特地体验,我从未在编程之外的畛域领会过。你正在钻研一些问题,探寻其逻辑实现,因为它与预期不合乎。但事实上,你越看,你就会越感到困惑...这个零碎怎么会进去正确的后果呢?我十分喜爱这一刻,因为这意味着你行将获得一些冲破,学到一些十分重要的货色。这有点像科学研究的老话: “科学研究上最令人兴奋的短语,那个预示着新发现的短语,不是我找到了它,而是乏味 ”(译者注: 突破性发现往往来自于意料之外的发现,在问题解决中,遇到意料之外的事件并不是好事,反而会有新的冲破发现)。 2. 一个精心设计、保护良好的阐明文档你是否有过这样的经验,走进敌人的厨房,所有都很清朗? 厨具摆放的东倒西歪(荒诞不经),须要的一切都在手边并且容易发现。这很像我进入一个代码仓库,仓库外面有一份设计良好的readme带给我的高兴。readme的好坏依赖于我的项目自身,应该包含清晰的先决条件阐明和根本装置命令、可能会遇到的问题以及解决方案,取得初始数据的一些简略命令,运行测试等等。如果我可能轻松运行该仓库中的代码并基于此进行开发,很少有其余货色可能像设计良好的Readme来博得我的尊重。 3. 测试用例通过 软件开发中一个十分酷的事件是咱们可能从咱们构建的逻辑中立即失去反馈,并且测试过程实质也是能够自动化的。当然,也不是所有的事件都能自动化。比方UX反馈通常须要用户参加,并且咱们并不需要对每一行代码都进行可靠性测试,这破费的代价会有些大。 尽管如此,你依然能够在写下代码之后,写一个测试来验证在设定条件下它是否具备你冀望的行为。它也不仅仅是即时的,你也能够保留这个测试,并在其他人应用的时候提供应用阐明。这十分酷。我的大多数喜好,反馈周期都比拟长。比方烘焙和园艺,可能须要几天甚至几个月能力失去反馈。而且即使如此,解释后果并猜想出错后果依然须要肯定水平的专业知识。但我永远不会厌倦的是,运行测试样例并且看到所有的测试样例通过。 4.rails new译者注: rails new 是一个 Ruby的一个脚手架,rails new,咱们通过几个命令就能够搭建起一个简略的Rails我的项目。 是否有过一个我的项目开始构建时的兴奋劲? 我喜爱那种从零开始,有着有限可能感觉,没有技术债的我的项目。这也是我到当初依然喜爱通过Darden’s i.Lab(一个征询网站)来向年老的企业家提供倡议的一个起因,也是我在20年当前依然喜爱征询的起因之一。你能够在许多事件上取得这种感觉,但软件有些不同,咱们更强调自动化和框架。几个命令,砰!你就取得了一个利用的脚手架,你能够应用这个脚手架来实现你的想法。丑陋。当我盯着一个空白页面的时候,我时常会心愿有一个这样的脚手架用来合作。 5. Vim译者注: Vim是从vi倒退进去的一个文本编辑器。其代码补完、编译及谬误跳转等不便编程的性能特地丰盛,在程序员中被宽泛应用。和Emacs并列成为类Unix零碎用户最喜爱的编辑器。 译者注: 没认真用过,不做过多评估。 还须要我说吗?如同年轻人说的, 如果你用过你就晓得了(原文是一个缩写: IYKYK If You Know You Know)。实际上,我爱的不肯定是Vim,我次要比拟喜爱Vim的模式编辑。简略的说,在Vim中你能够在两种模式下切换,一种是插入,一种是管制文本。在管制文本模式下(也称失常模式)下,你能够通过三个字符删除逗号之前的所有字符。一旦你习惯了,你就再也回不去了。在我本人的电脑上,我甚至将shell也设置为了vi模式,这样我就能够应用一些组合按键来操作命令行参数。如果你没筹备好,那么面对Vim就会很困惑,如果你有了充沛的理解,那么就会发现它很弱小。 6. Building Our Tools 构建工具说到Vim... , 在懒惰的周日下午,我喜爱看木工节目,如The Woodright's shop. 主持人在节目中探讨古时候的工具和木匠的历史。他们通常从根本工具开始,比方手锯和凿子,而后向你展现如何制作一个你本人的工作台。甚至有时是一个简略的车床或磨床。这很吸引我,常常让我想到软件开发。咱们用来编写代码和构建软件的工具也是由代码来构建。咱们的工具个别由其余程序员发明,如果有工夫,咱们齐全能够本人构建工具出像Vim这样的工具来满足咱们的需要。构建工具十分让人满足,在社区方面也十分的弱小。因为它发明了一个自动化反馈循环,有助于减速软件崛起、 7. Open Source 开源在某种程度上,构建工具只是我酷爱开源软件的一个方面。也有人说过开源软件对于集体、公司乃至于整个人类文明有着不堪设想的价值。我只想说开源真他妈的酷。除了维基百科,我想不到其余的,开源软件是人类已经尝试过的最大常识合作我的项目,而程序员处于这个我的项目的最后阶段。如果人类文明在100年内、1000年、10000年后依然以某种可辨认的形式存在,那么我预计咱们依然会有某种模式的数字指令合作集,也就是开源软件。我只晓得人们可能感觉开源软件曾经巩固和成熟了。但咱们进入这个扭转人类文明的致力才只有几十年,开源软件太棒了。 8. 性能优化。接下来让咱们回到高空,即时过了20年,我仍然酷爱解决性能问题。最近我的少数工作的内容都是主观和奥妙的。例如职改革, 可能须要几个月能力看到你致力的胜利。然而解决性能问题是主观的和具体的。比方这个页面加载太慢了,修复它。通常来说,修复它很简略,比方加上索引或者缓存。但有些状况,就须要深入研究,使用你多年来积攒的常识。这可能也是一个机会让你去理解磁盘如何存取数据的深奥常识,或者一些乏味的货色。有些状况,问题可能从无奈简略的被解决。所以你须要退后一步,重新考虑用户体验和基础架构。比方,你能够让用户感觉上快一点。在上班前,通常就有一个明确的解决方案。之前这个也面在最大负载场景下须要6秒。当初只须要300毫秒。哇哦,能够开香槟了。 9. Removing Toil(自动化流程)下面的点次要来自于我本身,毕竟是我列出来的依然让我喜爱编程的十件事,然而真正让我对编程这个职业痴迷不已却并不是趣味,而是它如何影响四周的世界。有些时候,我意识到我能够应用软件开发的形式来改善同胞的生存。这就是我决定这就是我余生值得谋求的货色。软件行业的衰亡对社会有着深远的影响,或好,或坏。但有一件事,我感觉齐全的好,就是打消反复的劳动。打消那些反复的,不须要用到创造力的工作。设想一下这样一个工作,理分明库存和规格之间的关系,突出缺口。这是须要一个人每天破费数小时进行文本匹配的乏味工作。这也是计算机善于的工作。当初将这项工作交给计算机,这个人就能够将工夫花在依据计算机的输入做出判断,而后与其余局部协调,确定优先级等等。 自动化也有负面影响,然而总体来说瑕不掩瑜,我置信不论任何背景的进行职业流动,并将本人独特的见解和能力带入这些职业流动时,这才是一个良好的社会。人们节约生命在一些反复艰辛的工作上不利于文化提高。 10. 写给我本人最初以我的初衷来完结探讨,最后我学习编程是因为我想要解决一些问题,我想让一些BBS的操作自动化,因为我厌倦了下载实现的时候点击下一个,下载的失败的时候点击重试。我想肯定有更好办法。过后曾经有了一种脚本语言,我记得是perl。我曾经遗记了具体的细节。但这正是这种感觉让我喜爱上了编程。你会有这样的感觉,会有更好的解决方案,因为你有编程的能力,如果你想扭转它,那通常就有更好的解决方案。 我当初曾经很少有一天去写代码了,然而我常常依然会我本人写代码。在上周我写了一个脚本每天去拉取一种鲜为人知的举重器材的价格,并将其存储到一个CSV文件中。我想取得这个价趋势,然而制造商的网站太小了无奈被大型的数据追踪器笼罩到。但这无奈难倒我,我是一个程序员,我会解决他。 论断这并不一定是编程中最让我喜爱的十件事。但它们是我脑袋中第一批想到的事。当我写作的时候,我想到了其余十几个。如果你是一名程序员,我可能漏掉了你喜爱的事。软件开发社区变的更加多样化,对于不同背景的人更加敌对。其中最酷的事件在于看到不同的人在编程中失去共鸣,他们会带来新的视角。如果有其余喜爱的事,或者不喜爱我喜爱的事请请告知,感激浏览。

January 29, 2023 · 1 min · jiezi

关于翻译:译-你的工作有趣吗

原文链接为:https://www.simplethread.com/...我在面试候选人的时候,习惯性会有短缺的工夫让候选人去问对于Simple Thread(美国弗吉尼亚的一家软件公司)的一些问题, 比方咱们的工作形式,所有在职位形容中没有列出的货色。 最近一个候选人向我问道: "你们都有哪些项目? 你们解决的是乏味的问题吗?" 这是一个十分正当的问题(It's a perfectly reasonable question), 总体上来说,这是一场体验良好的面试。全程很周到,交换也有来有往。然而对于这个问题,在过后,我却有点纳闷,我不晓得该怎么答复。 我难堪的缄默了一段时间,而后说:“哈哈哈哈,当然,我认为是这样的,我认为简直所有的问题都很乏味” 当我再次谈话的时候,我曾经复原了我的理智并且探讨了咱们的典型我的项目,突出了一些其中听起来很酷和乏味的。但这让我也开始思考,咱们是否在做乏味的我的项目? 什么是乏味的我的项目?让我过后临时困惑的起因之一是, 在不同的人对乏味的了解的不同(或趣味在于看客) ,所以有人问我是否解决了乏味的问题时,我开始思考提问者会认为什么是乏味的? 所以不同的提问者向我发问,失去的答案会有所不同。软件开发者、设计师、潜在客户、来自学校的敌人,在什么是乏味的这个问题上会有不同的认识。 只管认识不同,但也具备共性: 以后技术范畴内的极限问题, 可能须要新的技术能力解决,或者也可能无奈解决。工作于以后技术的热门畛域(机器学习,量子计算等等)解决一些重要的问题(衰弱、教育,生态)高难度的问题(超高程度的视觉设计)根本是就是一些,当你思考,你会想"哇,他们是怎么做到的" 什么是无趣的我的项目然而我想到了我做过的那些不合乎下面要求的我的项目,难道他们是无趣的吗? 对我来说是乏味的。大多数问题是有约束条件的,在约束条件尽可能的找出最优解是乏味的。可能是因为我在成为软件开发之前,我从事过批发和餐饮服务工作。兴许是我从我的家庭中听到了太多对于挣扎的故事。然而不论是什么起因,即便我曾经在这个行业数十年当前,我依然感觉十分有幸可能从事应用本人的大脑来解决逻辑问题的职业。 每个我的项目都会有因为一些限度或束缚引发一些问题的时刻,这是你的团队须要解决的一个小难题。兴许你能够在限度或束缚范畴内设计出完满的解决方案。兴许你须要重塑这个问题,使得这个问题在约束条件下能够被解决。兴许你能够回溯并从新设计自身的限度。这就是代码和数字设计中的粗浅乐趣,他们靠近于有限灵便的建筑材料。 我经验过很多人可能感觉无聊的我的项目。优化我的项目、技术债权偿还我的项目,救济我的项目,重构我的项目。然而,如果有正确的心态,解决这些问题就会显得乏味起来。 哪些项目无聊?让我持续思考,我做过的哪些项目是让我感觉无聊的,如果我的答案是没有,那么感觉我在这个问题上的答案是不可信的。 首先我认为这和束缚相干,解决一些小的问题是趣味的起源。然而,也不齐全是,我做过一些简直无限度的我的项目,绝对于须要解决的问题来说,咱们的估算相当短缺,同时也没有技术难题须要克服,工期也是正当的。问题也好了解,我的项目也是工作,交付代码、接管反馈、迭代,批改。 所以这些我的项目为什么不无聊呢? 我同你讲,这些问题也困扰着,一整天都在我的脑海外面拉扯。那天早晨,我在试图入睡的时候,我的思路又再次回到了这个问题。 这些我的项目我认为乏味的起因可能一部分在于团队十分棒,技术栈也是适合的,工作环境也十分棒。这些我的项目对咱们的用户来说也十分重要。等等,最初一个点是什么? 这个我的项目十分重要 啊哈,我想到这的这点,我一天思考解决的问题,对一些人十分重要。(原文为: Aha! As soon as I had that thought, I knew that was the idea my brain had been circling all day. The problems we were solving mattered to somebody. 啊哈!一旦我有了这个想法,我就晓得那是我的大脑一整天在思考的想法了。咱们要解决的问题对某人很重要。) 重要的问题但下面的理由并不总是充沛,在我没有看到相关性的状况下。如果我可能明确咱们构建的零碎为什么存在,为什么咱们正在解决的问题能够改善世界上的人的生存,为什么所有人都关怀这个问题 ? 那我就能从其中找到趣味。 从这个角度,来回顾我的职业生涯的话,我也加入过一些无趣的我的项目。我的项目的外围用户并没有参加,没有业务专家。没有人真正关怀它。如果没有人真的关怀正在解决的问题,那么这个我的项目就是无趣的。 在大中型企业中,这样的景象是常见的,外围用户应用这个零碎来自于领导的要求,实际上来说外围用户并不想用这个零碎。解决的也是用户并不关怀的问题。有时,你和某个商业单位的负责人单干,但其实负责人并不关怀这部分业务,他们只是在这里破费工夫,解决问题是因为被他人告知来解决它。但他们并不理解理论状况而且也不关怀。 这些相似的问题也呈现在一些初创企业上,比方,如果它们的产品和市场还没有很好的匹配或者他们并不真正置信风投的推动方向。你能够感触到他们在挣扎,无奈确定问题和解决方案。他们关怀问题,然而无奈确定解决方案是否真的无效。 是的,咱们在解决的是乏味的问题当我回顾这些年来在Simple Thread的所有我的项目时,我想不出哪个我的项目是没有意义的。咱们的许多我的项目是客户业务的外围软件,或者帮忙用户从新构建一个团队的规范工作流程,或者是为他们的次要产品提供SAAS平台。这些我的项目对咱们的客户十分重要。 ...

January 15, 2023 · 1 min · jiezi

关于翻译:我常用的两个翻译神器程序员必备-JavaGuide

你好,我是 Guide。 我从五月中旬开始,每天强制本人浏览至多一篇纯英文的文章。其实,这也算是跳出舒服区了。毕竟,雷同内容的文章,中文看一篇须要 5 分钟的话,纯英文可能须要 10~15 分钟。 我平时通常会从 Medium 这个网站上找文章浏览,我没有开明这个网站上的会员,都是找的一些收费的文章浏览,总体感觉这个网站下面的文章中等偏上,并没有很多博主吹得那么高质量,弱智低质量的文章仍然也有很多。 不过,据说在这个网站上写文章能够赚钱。之前网上意识的一位敌人,把本人国内平台的文章搬运过去赚了几百美金。 想要写博客然而you 英语比拟差且想要进步英文浏览能力的,能够通过翻译工具(如谷歌翻译、腾讯翻译)等工具将英文按段翻译,而后再用本人的话润色一下。将翻译之后的内容放在每一段英文之后,没事就拿进去浏览,长此以往,浏览的英文文章多了之后,英文浏览能力天然就上来了! 另外, 我常常应用的是彩云小译这个浏览器插件,真心好用,就是收费额度太少了! 彩云小译这个浏览器插件也能够对文章进行在线翻译,且每一段中文位于英文之后。 并且,这个工具还反对 PDF 和视频翻译,这点很实用! 这不是广告哈!我发现每次举荐工具总有个别人说是广告,恰烂钱。。。我是真无语。。。 彩云小译这工具我用下来的确能够,而且翻译品质挺高。毛病也很显著,收费额度太少了,重度应用的话,只能开会员。不过,会员的价格也不贵,一般 VIP 一年也就 98 元。 另外,沙拉查词这个划词翻译插件也很不错,评估很高。试用了几天沙拉查词之后,我把之前用的 Mate Translate 这个相似的插件给干掉了。 成果如下,这个插件反对多平台的翻译 api ,能够自行在后盾设置。 还有很多其余的性能比方单词记录、情景模式,用的不多,这里就不做介绍了。

June 8, 2022 · 1 min · jiezi

关于翻译:翻译CJS-AMD-UMD-ESM-System-和-IIFE-分别代表什么用-Rollup-示例来说明模块格式

原文地址 What Are CJS, AMD, UMD, ESM, System, and IIFE? 古代 Javascript 我的项目须要用打包工具来将小段代码编译成库或者应用程序那种更大更简单的货色。风行的打包器有webpack、Rollup、Parcel、RequireJS 和 Browserify。它们将 JavaScript 代码转换为能够作为一个 bundle 加载的模块。一个 bundle 能够用不同的格局打包。这篇文章中,咱们将展现 CJS, AMD, UMD, ESM, System 和 IIFE 格局的打包示例。 打包工具和格局上面是一个规范的 HTML 文件,第5行引入了一个款式文件,第6行引入了一个 JS 文件: <!DOCTYPE html><html lang="en"> <head> ... <link rel="stylesheet" href="style.css" /> <script src="src/index.js"></script> </head> <body> ... </body></html>简略状况下能够将所有的 JavaScript 代码放到一个文件中。随着我的项目的增大,咱们须要将代码拆分成具备独立命名空间的独立模块。除了更好的构造,模块化还带来了封装的性能、依赖治理和复用性。这就是打包工具呈现的起因。它须要将小块的 JavaScript 代码,样式表和图片编译成更大更简单的像库或者应用程序一样的货色。打包工具是如何将打包的代码格式化为输入?有很多的抉择, 上面是 Rollup 定义的一些格局: cjs (CommonJS) — 实用于 Node 和其余打包工具(别名:commonjs)。amd (Asynchronous Module Definition,异步模块化定义) — 与 RequireJS 等模块加载工具一起应用。umd (Universal Module Definition,通用模块化定义) — amd,cjs 和 iife 蕴含在一个文件中。es — 将 bundle 保留为 ES 模块文件。实用于其余打包工具,在古代浏览器中用 <script type=module> 标签引入(别名:ems, module)。system — SystemJS 加载器的原生格局 (别名:systemjs)。iife — <script> 标签引入的自执行函数。如果你想为你的利用创立一个包,你须要用到的可能就是这种。在这篇文章中,咱们将通过示例解释这些格局。 ...

September 22, 2021 · 8 min · jiezi

关于翻译:译-Vuejs-和-Alpinejs-比较

(翻译自:https://medium.com/@wearethre...) Vue.js 是以后世界上最风行的 JavaScript 框架之一,公布于 2014 年,第三个版本行将公布(译著:翻译时曾经公布),不会有大的变动。 那么咱们为什么须要另一个 JavaScript 框架呢?为什么是 Alpine?与大多数古代 JavaScript 框架不同,应用 Alpine,,只须要简略援用,不须要编译,即可执行,全副个性都能够应用。它超级轻量级,在本文编写时候,Alpine 只有 4.3kb(v.1.9.3)。然而,对我而言,Alpine.js 最吸引我的中央是它的语法,如果你曾经熟知 Vue,那你基本上理解了 Alpine,这使其非常适合 Vue 开发人员转换过去,而无需学习头疼的语法和某些奇怪的常识。Alpine 的作者 Caleb Porzio(Laravel Livewire 的作者)使其大部分的语法与 Vue 保持一致,例如:v-for 变成了 x-for,v-show 变成了 x-show 等等等等,它也引进了一些缩写语法,如x-on,所以 x-on:click=""能够简写为 @click="",你能够在 https://github.com/alpinejs/a... 理解到全副13 个语法。 (你可能好奇为什么 Alpine 应用 x- 而不是 a-,其实这是因为 Alpine 的名字确定之前,Alpine 被称为 project-x,这是对他过来名称的致敬。) 咱们接下来看一个简略的待办事项利用。”WWWWW HHHHHYYYYY?为什么还要再做一个TODO?”(我能听到你在问……)嗯,这个利用显示了很多基本概念,所以…… 从 Vue 开始有多种形式能够应用 Vue,最简略的形式应用,是间接从 CDN引入: <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>当然,Vue 提供了 Vue CLI,要应用 Vue CLI,你须要装置 node,你能够在此找到相干信息:https://nodejs.org,而后在终端,通过命令行进行装置: npm install -g @vue/cli在你的 Vue CLI 命令行装置结束后,你能够创立你的我的项目: ...

February 28, 2021 · 3 min · jiezi

关于翻译:翻译软件设计的哲学0-序言

People have been writing programs for electronic computers for more than 80 years, but there has been surprisingly little conversation about how to design those programs or what good programs should look like. There has been considerable discussion about software development processes such as agile development and about development tools such as debuggers, version control systems, and test coverage tools. There has also been extensive analysis of programming techniques such as object-oriented programming and functional programming, and of design patterns and algorithms. All of these discussions have been valuable, but the core problem of software design is still largely untouched. David Parnas’ classic paper “On the Criteria to be used in Decomposing Systems into Modules” appeared in 1971, but the state of the art in software design has not progressed much beyond that paper in the ensuing 45 years. ...

February 17, 2021 · 7 min · jiezi

关于翻译:翻译实用的Python编程00Setup

课程设置与概述欢送拜访本课程(Practical Python Programming)。这个页面蕴含一些对于课程设置的重要信息。 课程周期和工夫要求该课程最后是作为一个由讲师主导的,继续 3 -4 天的现场培训。要全副实现本课程,您应该起码打算用25-35小时进行学习。大部分的参与者发现,在不浏览题解代码的状况下,学习材料是相当具备挑战性的(见下文) 设置和 Python 装置您只须要装置 3.6 或者更新版本的 Python 即可。不依赖于任何特定的操作系统,编辑器,IDE,或者其它与 Python 相干的工具。没有第三方依赖。 也就是说,本课程大部分内容波及学习如何编写脚本与小型程序,这些脚本与小型程序波及从文件中读取数据。因而,您须要确保您处在一个能够轻松解决文件的环境中。这包含应用编辑器创立 Python 程序,并可能从 shell 或终端运行这些程序。 您可能偏向于应用更具交互性的环境来学习本课程,例如 Jupyter Notebooks。我倡议不要这样做。只管 Jupyter Notebooks 十分棒,但本课程中的许多练习传授与程序组织的相干的观点,包含应用函数,模块,导入语句以及重构源代码逾越多个文件的程序。以我的教训,很难在 Jupyter Notebooks 环境中反复这样的环境。 派生(Forking)/克隆(Cloning) 课程仓库为了筹备本课程的环境,我举荐您从本课程的仓库 https://github.com/dabeaz-course/practical-python 派生您本人的 GitHub 仓库。实现后,您能够将其克隆到本地计算机上: bash % git clone https://github.com/yourname/practical-pythonbash % cd practical-pythonbash %请在 practical-python/ 目录下实现所有的练习。如果将解题代码提交回派生的仓库,那么您的所有代码会保留到一个中央。实现后,您将领有良好的学习记录。 如果您不想派生一个本人的 GitHub 仓库或者您没有 GitHub 账号,您依然能够将本课程的仓库克隆到您本人的计算机上: bash % git clone https://github.com/dabeaz-course/practical-pythonbash % cd practical-pythonbash %如果这样做,除了对计算机的本地正本进行更改外,您将无奈提交代码更改到 GitHub 上。 课程排版在 Work/ 目录下实现所有的编程工作。在Work/ 目录外面,有一个 Data/ 目录。 Data/ 目录蕴含各类在课程中应用的数据文件及其它脚本。您将会常常拜访位于 Data/ 目录下的文件。课程练习假设您在 Work/ 目录下创立程序。 ...

February 1, 2021 · 1 min · jiezi

关于翻译:火山引擎在机器写作和机器翻译方面的最新进展

随着新媒体平台的衰亡,人工智能技术曾经大大提高了信息内容的创作,而个性化举荐算法的信息又为信息内容的散发提供了极大的便当,这其中,文本生成技术十分重要,因为它在很多的利用场景有宽泛的利用,比方机器翻译、机器写作、对话机器人以及主动问答。2019 年在《管理科学》杂志上 MIT 钻研人员发表的一项最新钻研表明,机器翻译技术曾经将国际化贸易量进步了 10%,这相当于将地球上的各个国家之间的间隔缩短了 25% [1]。 近年来,字节跳动也研发了多项先进的机器翻译技术,目前字节跳动自研的火山翻译平台曾经有公司内外的 50 多个客户应用,反对超过 50 多种语言的相互翻译。此外,在字节跳动咱们研发了 Xiaomingbot 主动写稿平台,自 2016 年上线以来,曾经累计写了 60 万篇文章,笼罩了 17 项的体育赛事,反对 6 种语言,在自媒体平台下面也有 15 万的粉丝。 上面给大家展现一下 Xiaomingbot 如何主动写新闻。 咱们的零碎将从数据源获取到较量信息,例如球员较量布阵、球员的进球等等信息。同时咱们还会利用计算机视觉的算法,对较量视频进行剖析辨认出其中的球员、球衣下面的号码,球员的静止轨迹、球员的动作、球员的地位以及要害的一些场景等等。再利用这些信息咱们利用文本生成算法写出最初的文章 [2]。 在另外一项钻研当中咱们应用计算机视觉的算法去剖析斯诺克较量的静止、桌上球的静止轨迹、以及利用机器学习最初去预测球员的击球策略,预测下一杆球会落到哪个袋,并且利用这些预测去生成最终的较量讲解 [3]。这对于一些非职业的观众来说,十分有助于帮忙了解球赛的过程。这是咱们算法最终生成的一些讲解状况。 本场讲座,会分为五局部内容。第一局部,我会给大家先简略介绍一下什么是序列生成问题,它有什么样的难度和挑战;第二局部,将介绍深度隐变量模型,Deep latent Variable Models for Text Generation;第三局部,我将介绍文本生成当中如果加上限度之后,如何做更好的算法,咱们提出了一类蒙特卡洛采样算法来做文本生成;第四局部会介绍机器翻译当中如何使一个模型能够去获取四项双语语言能力。最初一部分介绍多语言的机器翻译,咱们最新的一个工作 mRASP。 序列生成问题的难度和挑战在自然语言中,所有自然语言宣称的外围问题是对句子序列做建模,比如说这样一个句子的 The quick brown fox jumps over the lazy dog 句号,这里有 10 个字符,Modeling 的问题就是对这 10 个字符的联结概率去建模,也就任意一个句子长度为 L 的句子,我须要对整个 L 各字符对它算出它的联结概率分布。当然最根本的一种办法是叫 Auto-Regressive Language model,是把这个联结概率分解成上面这个模式,每一个局部它实际上是第 i 个字符的概率,是建设在后面 1 到 i-1 个字符的根底之上,这具体的每一个概率能够有很多建模的办法。比如说当初从 2017 年开始比拟风行的叫 Transformer 网络外面对个条件概率的建模是应用多层的多头注意力机制(Muti-Head Attention)来建模的 [4]。当然这个 Transformer 有很多的参数,理论学习当中就须要找到最好的一组参数,使得语料外面的联结概率最大。 ...

January 28, 2021 · 5 min · jiezi

关于翻译:2021年你需要的7个JS-Array方法

前言文本翻译至 2021年您将须要的7种JS数组办法 JavaScript 为咱们提供了大量解决数组的不同办法。咱们将在短短几分钟内为您介绍7个基本知识,以进步您的JS开发技能 注释1.Array.map()当咱们在数组上应用该 .map() 办法时,它都会在原数组根底尚返回一个新的批改版本。该 .map() 办法具备循环遍历您的数组并且批改的性能。 .map() 每当您要更新数组中的每一项并且须要返回新数组时,都能够应用该办法 假如咱们有一个蕴含汽车品牌的数组: const cars = ["Porsche", "Audi", "BMW", "Volkswagen"];当然,咱们认为所有的汽车品牌都很酷,咱们须要给每个品牌来加以表白,咱们能够应用 .map() 办法。 const coolCars = cars.map(car =>`$ {car}是一个十分酷的汽车品牌!`);//后果:[“保时捷是一个十分酷的汽车品牌!”,“奥迪是一个十分酷的汽车品牌!”,“宝马是一个十分酷的汽车品牌!”,“大众汽车是一个十分酷的汽车品牌!”]] 太棒了!该 .map() 办法创立了一个新数组并将形容文本增加到每个我的项目。 很快乐的事,咱们还晓得如果应用 .map() 办法解决蕴含对象的数组 让咱们有一堆价格不含税的汽车,而后应用加上含税价格 .map() const carsWithPrice = [ {brand: "保时捷", price: 100000}, {brand: "奥迪", price: 80000}];const carsWithPriceAndTax = cars.map(carObject => { return { // 返回原对象 ...carObject, // 返回新的含税的价格新值 priceWithTax: carObject.price * 1.2 }});// 后果:[ {brand: "保时捷", price: 100000, priceWithTax: 120000}, {brand: "奥迪", price: 80000, priceWithTax: 96000}]; ...

January 25, 2021 · 2 min · jiezi

关于翻译:javascript是如何工作的03内存管理和如何处理4种常见的内存泄漏

概述像C语言这种具备底层内存治理的原始语言,例如malloc()和free()。开发人员应用这些原始语言明确地给操作系统调配和开释内存。 同时,JavaScript 在创立事物(对象,字符串,等等)的时候分配内存,并且在不再应用的时候“主动”开释内存,这是一个垃圾回收的过程。开释资源的这种看起来“主动”的个性是凌乱的起源,给 JavaScript (和其余高级语言)开发者一种他们能够不再关怀内存治理的谬误印象。这是一个大谬误。 即便在应用高级语言工作的时候,开发者应该了解内存治理(或者起码是基本知识)。有时,主动内存治理存在问题(例如垃圾回收中的bug或者实现限度,等),开发人员必须理解这些问题能力正确处理它们(或者找到适当的解决办法,同时尽量减少老本和代码累赘)。 内存生命周期无论你应用哪种编程语言,内存生命周期简直都是一样的: 以下是对周期中的每一步产生的状况概述: 分配内存 - 内存是由操作系统调配的,操作系统容许你的程序应用它。在底层级别语言(例如C)中,这是你作为一个开发者应该解决的明确操作。然而,在高级别语言,这是你应该解决的。应用内存 - 这实际上是程序应用之前调配的内存的时候。读和写操作在代码中分配内存的时候产生。开释内存 - 当初是时候开释你不再须要的整个内存了,这样它能够从新开释并且可再次应用。与分配内存一样,在低级别语言中这是明确的。要疾速理解调用栈和内存堆的概念,能够浏览这个主题的第一篇文章。 什么是内存?在间接进入 JavaScript 内存之前,咱们将简略地探讨下什么是个别内存,以及它是如何工作的。 在硬件层面,计算机内存是由大量的触发器组成。每个触发器蕴含几个晶体管,并且能够存储一个比特。每个触发器通过一个惟一的标识符寻址,因而咱们能够读取和复写它们。因而,从概念上讲,咱们能够认为整个计算机的内存是一组比特数组,咱们能够读写他们。 然而作为人类,咱们并不善于应用比特来实现咱们所有的思考和算数,咱们将它们组成更大的组,它们能够一起来示意数字。8比特被称为1字节。除了字节,还有单词(有时是16,有时是32位)。 内存中存储大量的货色: 所有的变量和所有程序应用的数据。编程的代码,包含操作系统的。编译器和操作系统一起工作,为你解决大量的内存治理,然而咱们倡议你查看一下背地产生的事件。 当你编译你的代码的时候,编译器能够查看原始数据类型,并且提前计算它们须要多少内存。而后在调用堆栈空间中将须要的内存调配给程序。调配这些变量的空间叫做堆栈空间,因为在调用函数的时候,他们的内存会增加到现有的内存之上。一旦他们停止,它们将以LIFO(后入先出)的程序移除。例如,思考上面的申明: init n; // 4bytesint x[4]; // array of 4 elements, each 4 bytesdouble m; // 8 bytes编译器能够立马看到这些代码须要多大内存 4 + 4 * 4 + 8 = 28 bytes.这就是它如何解决以后整型和double的大小。大略20年前,整型通常是2bytes,和4字节。你的代码不应该依赖以后根本数据类型的大小。编译器将插入与操作系统交互的代码,它须要申请以后栈上所需存储变量的大小的字节数。 在下面的例子中,编译器确切地晓得每个变量的内存地址。实际上,不论你什么时候书写变量n,这将会在外部被翻译成相似于“内存地址 4127963”。 留神到,如果咱们试图在这里拜访x[4],咱们将须要拜访与之关联的m。这是因为咱们拜访了数组上不存在的元素 - 它比实际上调配给数组的最初一个元素x[3]多了4字节,并且可能将会最终读取(或者复写)一些m的比特。这将对剩下的程序产生十分不冀望的结果。 当一个函数调用另一个函数时,每个函数在调用堆栈时都会失去本人的堆栈块。它将其所有的本地变量都保留在这里,并且有一个程序计数器去记住执行过程中的地位。当这个函数调用实现,它的内存块将会用于其余用处。 动态分配可怜的是,当咱们不晓得一个变量在编译的时候须要多少内存,事件就变得不简略了,如果咱们要做上面的事件: int n = readInput(); // reads input from the user...// create an array with "n" elements这里,在编译的时候,编译器不晓得这个数组须要读书内存,因为它是由user提供的值决定的。 ...

October 30, 2020 · 4 min · jiezi

关于翻译:javascript是如何工作的02V8引擎内部机制及如何编写优化代码的5个诀窍

概述一个 JavaScript 引擎是一个执行 JavaScript 代码的程序或者解释器。一个JavaScript 引擎能够实现成一个规范的解释器,也能够是一个实时编译器,它以某种像是将 JavaScript 编译为字节码。 这是一个正在实现 JavaScript 引擎的热门我的项目列表: V8) — 开源,谷歌开发,应用C++编写Rhino - Wikipedia](https://en.wikipedia.org/wiki... — 由Mozilla基金会治理,开源,齐全应用Java开发SpiderMonkey) — 第一个JavaScript引擎,在过后反对 Netscape Navigator, 明天反对FirefoxJavaScriptCore -- 开源,作为Nitro销售,由苹果公司为Safari开发KJS - Wikipedia](https://en.wikipedia.org/wiki... — KDE 引擎起初由 Harri Porten 为KDE Konqueror web 浏览器我的项目而开发Chakra (JScript9) - Wikipedia](https://en.wikipedia.org/wiki... — IE浏览器Chakra (JavaScript) - Wikipedia](https://en.wikipedia.org/wiki... — 微软 EdgeNashorn - Wikipedia](https://en.wikipedia.org/wiki... —作为JDK的一部分开源,由Oracle的Java语言和工具组编写 JerryScript) — 物联网的轻量级引擎为什么要创立V8引擎?V8引擎是由谷歌应用C++编写创立的开源引擎。这个引擎被用于谷歌的Chrome外部。然而,与其余引擎不同的是,V8页用于风行的Node.js运行时。 V8是第一个为了进步 JavaScript 在 web 浏览器的执行的性能优化而设计的。为了进步速度,V8将 JavaScript 代码转换为效率更改的机器代码,而不是应用外部解释器。它通过实现JIT(Just-In-Time) compiler 将 JavaScript 代码在运行的时候转为机器代码,就像许多古代的JavaScript引起做的一样,例如 SpiderMonkey 或者 Rhino(Mozilla)。这里的次要区别是V8不产生字节码或者任何其余中间代码。 ...

October 30, 2020 · 2 min · jiezi

关于翻译:javascript是如何工作的引擎运行时和调用栈的概述

随着 JavaScript 的越来越风行,促使团队在多个栈上都须要它反对 - 前端、后端、混合应用程序、嵌入式设施等等。 这篇文章是这个系列的第一篇,目标是深入研究 JavaScript 以及它真正是如何工作的:咱们认为理解 JavaScript 的构建块,并且晓得它是如何一起运行的,那么你将会写出更好的代码和应用程序。咱们也将分享一些咱们在应用构建 SessionStatck时候的一些教训规定,一个轻量的应用程序,为了放弃竞争力,必须是强壮和高性能的。 正如GitHut statsGitHut - Programming Languages and GitHub统计数据展现, JavaScript 是 GitHub 上 Repositories 最沉闷和 push 最多的语言。在其余的类别中,它也没有落后。 获取最新的GitHub language stats) 如果我的项目越来越多的依赖 JavaScript,这意味着开发者为了构建一个令人惊叹的软件,必须利用语言提供的所有,并且对于生态系统外部有着深刻的了解。 事实证明, 很多开发者每天都在应用 JavaScript,然而并不知道它们外部产生了什么。 概述简直每个人都曾经据说过V8引擎的概念,并且很多人晓得 JavaScript 是单线程的或者它是应用回调队列的。 在这篇文章中,咱们将会具体讲述所有的概念,并且解释 JavaScript 是如何真正运行的。在晓得这些字节之后,你将会适当的利用提供的APIS写出更好的,非阻塞的应用程序。 如果你是 JavaScript 老手,这篇文章会帮忙你了解为什么 JavaScript 和其余语言比拟起来如此“怪异”。 如果你是一个有教训的 JavaScript 开发者,心愿它能够让你对每天都在应用的 JavaScript 运行时是如何真正关注的有一些新的了解。 JavaScript 引擎最风行的 JavaScript 引擎的例子是谷歌的 V8 引擎。V8被用于 Chrome 和 Node.js 外部。上面是一个简略的视图示例: 引擎次要由两个局部组成: 内存堆 — 这是内存调配的中央调用栈 — 这是代码执行的栈运行时有很多浏览器的APIS被 JavaScript 开发者应用过(例如:setTimeout)。然而这些APIS,并不是引擎提供的。 ...

October 30, 2020 · 1 min · jiezi

关于翻译:介绍在使用-Solidity-以太坊升级智能合约的挑战

在开发软件的时候,咱们常常须要公布新的版本来减少新的性能或者修复bug。当波及到智能合约开发时,也没有什么区别。尽管将智能合约更新到新版本通常不像更新其余类型的雷同复杂性的软件那么简略。 大多数区块链,尤其是像 Ethereum 这样的公链,都实现了不可变的个性。实践上不容许任何人扭转区块链的 "过来"。不可变更性实用于区块链中的所有交易,包含用于部署智能合约和相干代码的交易。换句话说,一旦智能合约的代码被部署到区块链上,它将永远 "原样 "地 "活着"--没有人能够扭转它。如果发现了bug或者须要增加新的性能,咱们无奈间接批改部署合约的代码。 如果一个智能合约是不可更改的,那么你如何可能将它降级到新的版本?答案就在于将新的智能合约部署到区块链上。但这种办法会带来一些须要解决的挑战。最根本也是最常见的是,所有应用智能合约的用户都须要参考新合约版本的地址,第一个合同的版本应该被禁用,强制每个用户应用新版本。 通常,你须要确保旧版本的数据(状态)被迁徙或以某种形式提供给新版本。在最简略的状况下,这意味着你须要将旧版本中的状态复制/迁徙到新合同的版本中。 上面的章节将更具体地形容这些挑战。为了更好的阐明,咱们用上面两个版本的 MySmartContract 作为参考。 // Version 1contract MySmartContract { uint32 public counter; constructor() public { counter = 0; } function incrementCounter() public { counter += 2; // This "bug" is intentional. }}// Version 2contract MySmartContract { uint32 public counter; constructor(uint32 _counter) public { counter = _counter; } function incrementCounter() public { counter++; }}用户可参考新合同的地址。当部署到区块链时,智能合约的每个实例都被调配到一个惟一的地址。该地址用于援用智能合约的实例,以便调用其办法并从/向合约的存储(状态)读取/写入数据。当你将合同的更新版本部署到区块链时,合同的新实例将部署在一个新的地址。这个新地址与第一个合约的地址不同。这意味着,所有与智能合约交互的用户、其余智能合约和/或 dApp(去中心化利用)都须要更新,以便它们应用更新版本的地址。剧透:有一些选项能够防止这个问题,你会在本节最初看到。 那么,让咱们思考以下状况。你用下面 Version 1 的代码创立 MySmartContract。它被部署到区块链的地址 A1(这不是一个实在的 Ethereum 地址--仅用于阐明目标)。所有想要与 Version 1交互的用户都须要应用地址 A1 来援用它。当初,通过一段时间后,咱们留神到了办法 incrementCounter 中的 bug:它是以2来递增计数器,而不是以1来递增它,所以咱们实现了一个修复,产生了 MySmartContract 的 Version 2 版本。这个新合约的版本被部署到地址 D5 的区块链上。此时,如果用户想要与 Version 2 进行交互,须要应用地址 D5,而不是 A1。这就是为什么所有与 MySmartContract 交互的用户都须要更新,以便他们参考新的地址 D5 的起因。 ...

September 13, 2020 · 4 min · jiezi

关于翻译:golang的逃逸分析

翻译自:http://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html Golang逃逸剖析2015-10-18 垃圾回收是Go的一个很便当的个性--其主动的内存治理使代码更整洁,同时缩小内存透露的可能性。然而,因为垃圾回收须要周期性的进行程序从而去收集不必的对象,不可避免的会减少额定开销。Go编译器是智能的,它会主动决定一个变量是应该调配在堆上从而在未来便于回收,还是间接调配到函数的栈空间。对于调配到栈上的变量,其与调配到堆上的变量不同之处在于:随着函数的返回,栈空间会被销毁,从而栈上的变量被间接销毁,不须要额定的垃圾回收开销。 Go的逃逸剖析绝对于Java虚拟机的HotSpot来说更为根底。根本规定就是,如果一个变量的援用从申明它的函数中返回了,则产生“逃逸”,因为它有可能在函数外被别的内容应用,所以必须调配到堆上。如下几种状况会比较复杂: 函数调用其余函数援用作为构造体的成员变量切片和映射Cgo指向变量的指针为了实现逃逸剖析,Go会在编译阶段结构函数调用关系图,同时跟踪入参和返回值的流程。 ---待持续

August 12, 2020 · 1 min · jiezi