JavaScript的诞生与进化
JavaScript的诞生与进化
JavaScript 历史回顾
JavaScript 是什么
JavaScript 与 ECMAScript 的关系
JavaScript 的不同版本
简短的历史回顾JavaScript,最初被称为 LiveScript,在 1995 年由 Brendan Eich(网景公司)开发并集成进 Netscape Navigator 2 浏览器中。最初的目的是提供一种替代 Perl 语言的轻量级客户端脚本,特别用于表单验证。那时,验证一个表单字段的内容通常需要与服务器进行通信,而慢速的拨号上网使得每一次的页面刷新都变得非常痛苦。
JavaScript 的命名背景为了吸引更多开发者和媒体的关注,网景公司在发布前将 LiveScript 改名为 JavaScript。这个改名与当时 Java 编程语言的流行密切相关,借用了 Java 的影响力来推动 JavaScript 的普及。
随着时间的推移,JavaScript 在浏览器中的使用变得越来越广泛,逐渐从简单的表单验证,发展为网页动态交互、AJAX 请求、复杂的计算和动画等多方面应用。
JavaScrip ...
编程世界的AI依赖症:自救与反思
在这个技术日新月异的时代,越来越多的人开始担心一个问题:人工智能是否正在让程序员变成编程“文盲”?我们不难发现,随着对AI技术依赖的增加,程序员解决问题的能力似乎正在下降。
依赖AI的趋势一开始,程序员们不再花时间翻阅那些厚重的技术手册了,因为AI似乎随时能提供答案。渐渐地,他们在调试时也开始感到吃力。那些曾经司空见惯的错误信息和堆栈追踪,没了AI的帮助,看起来仿佛变成了难以攀登的高山。
自我挑战:设立“无AI日”面对这种情况,一些人提出了一个自我挑战的方式——设立无AI日。简单来说,就是每周至少有一天,程序员完全不使用任何AI工具进行编程。这样做的初衷是让程序员们重新找回与代码打交道的感觉,从而提升自己的核心编程技能。虽然刚开始可能会感到不适应,甚至有些挫败,但从长远来看,这有助于防止技术能力的荒废。
技能缺失的隐忧尤其是对于许多刚入行的程序员来说,他们或许从未体验过没有AI辅助时,独立解决问题所带来的成就感。长此以往,这种技能的缺失可能导致整个行业在解决问题的能力上逐渐变弱。
行业反思这个话题已经引起了广泛关注。一个经验丰富的程序员在他的博客上分享了这些思考,文章在一周内吸引了超过 ...
欧洲程序员薪资分析:从爬虫数据看各国薪资差异
欧洲程序员薪资分析:从爬虫数据看各国薪资差异在全球化的科技发展背景下,程序员的薪资差异已成为了一个不可忽视的话题。为了更好地了解欧洲各国程序员的薪资水平,我爬取了 Levels.fyi 网站的欧洲薪资地图,分析了该平台提供的各个国家程序员薪资数据。本文将展示获得的数据,并通过转换为人民币进行对比分析,进一步探讨这些薪资数字背后的意义。
1. 爬取说明:数据来源与获取爬取的目标网站是 Levels.fyi,网址为 https://www.levels.fyi/heatmap/europe/。该网站提供了详尽的各国程序员薪资数据,包括中位数薪资,以及最低10%、25%、75%、90%分位数的薪资信息。所有薪资数据的单位为美元(USD),这里使用了7.25的汇率将其转换为人民币(CNY),并计算出对应的月薪数据。
2. 数据表格:欧洲程序员薪资月薪对比以下是经过汇率转换后的欧洲各国程序员薪资数据。所有数值均为人民币(月薪):
序号
国家名称
中位数月薪
最低10%月薪
25%月薪
75%月薪
90%月薪
1
瑞士
92464
58808
73742
154244
216074
...
ROS主流版本与适用场景建议
ROS主流版本与适用场景建议在机器人开发中,ROS(Robot Operating System)是当前最流行的开发框架。随着ROS 1和ROS 2的推出,开发者可以选择不同的ROS版本来满足各种需求。ROS的版本与操作系统(如Ubuntu版本)以及Linux内核的兼容性密切相关。本文将探讨ROS 1和ROS 2的主要版本、生命周期以及如何根据Ubuntu版本和Linux内核选择最合适的组合,并提供一些具体的应用场景建议。
1. ROS 版本概览与支持情况ROS 1 版本ROS 1已经存在多年,虽然ROS 2逐渐成为未来的方向,但ROS 1仍然在很多老旧项目中被广泛使用。以下是ROS 1的主要版本及其维护状态:
版本
发布日期
EOL(结束维护日期)
支持的Ubuntu版本
ROS Noetic
2020年5月23日
2025年5月(Ubuntu 20.04 LTS支持)
Ubuntu 20.04 LTS
ROS Melodic
2018年5月23日
2023年6月27日
Ubuntu 18.04 LTS
ROS Lunar
2017年5月23日
2019年5月
...
为什么GPU如此强大,CPU依然不可或缺?
为什么GPU如此强大,CPU依然不可或缺?最近,一段2009年的老视频在推特上重新火了起来,旨在向观众直观展示CPU与GPU之间的差异。
视频的内容可以在这里观看,时长90秒:视频链接
视频的核心思想是:CPU和GPU进行了一场绘画对决。它们连接到一个喷射彩弹的机器上,CPU花费了30秒钟画出一个简单的笑脸。而GPU则在瞬间画出了蒙娜丽莎。
从这个视频中得出的一个结论是:CPU很慢,而GPU很快。虽然这有一定的道理,但实际上,背后还有更多的细节和复杂性。
TFLOPS:衡量处理器性能的标准当我们说GPU比CPU强大时,通常指的是TFLOPS(每秒万亿次浮点运算)的概念。TFLOPS用来衡量一个处理器每秒能进行多少次数学运算。例如,Nvidia的A100 GPU可以执行9.7 TFLOPS(即每秒97亿次操作),而Intel最近的24核处理器只能达到0.33 TFLOPS。这意味着,即使是中端GPU,其性能也至少是最强CPU的30倍。
那么,为什么我MacBook里的Apple M3芯片既包含了CPU又包含了GPU呢?难道我们不能完全抛弃这些”缓慢”的CPU吗?
程序类型的差异我们可以将 ...
软件版本命名新趋势:“自豪”与“羞愧”版本
软件版本命名新趋势:“自豪”与“羞愧”版本在软件开发中,版本命名至关重要,它帮助开发者和用户了解软件的更新历史和功能变化。传统的版本号命名方式通常包括主版本号、次版本号和修订号,分别对应不同级别的更新。然而,这种方法有时并不能清晰地表达版本更新的实际意义,尤其是在边界定义上。为此,Nikitonsky 提出了一种新的版本命名模式:“自豪”与“羞愧”版本控制,这种方法试图通过情感的维度来更直观地反映软件版本的变化。
1. 传统版本命名的局限性在传统版本控制系统中,虽然结构清晰,但很多时候开发团队面临如何恰当地升级版本号的困境。例如,一个小修复是否足以触发次版本号的升级?或者一个新增功能是否重要到必须提升主版本号?这些问题往往难以有一个统一的标准,导致版本号的更新有时显得随意或不够透明。
2. “自豪”与“羞愧”版本控制模式的详解根据Nikitonsky的提议,引入“自豪”与“羞愧”的概念,为版本控制增加了情感层面的判断:
自豪版本(Proud version):当开发团队对某个版本特别满意,认为它在功能或性能上有显著提升时,会提升主版本号。
默认版本(Default version): ...
网页精准跳转技巧:通过链接直接定位到指定内容
网页精准跳转技巧:通过链接直接定位到指定内容在之前,我们只能在页面的某个部分有ID时,才能链接到该部分。我们只需将ID附加到URL后面,就可以链接到该部分。如果我们想链接到页面的特定部分,必须为该部分设置锚点。这种方式一直持续到“文本片段”功能的出现!
什么是文本片段?文本片段是现代Web平台中的一个强大功能,它允许我们精确地链接到网页中的特定文本,而无需添加锚点!该功能由::target-text CSS伪元素配合使用,后者提供了一种样式化高亮文本的方式。
文本片段通过在URL末尾附加特殊语法来工作;就像我们以前在哈希符号(#)后附加ID一样。浏览器会解析URL的这一部分,搜索页面中指定的文本,并在浏览器支持文本片段的情况下,滚动并高亮显示该文本。如果用户尝试通过按Tab键导航文档,焦点将移到文本片段后面的下一个可聚焦元素。
我们如何使用它?以下是文本片段URL的基本语法:
1https://example.com/page.html#:~:text=[prefix-,]textStart[,textEnd][,-suffix]
在哈希符号后,我们添加这个特殊语法 :~:(也称为片 ...
深入理解并发、并行与 JavaScript
直到现在,我一直不太清楚“并发”和“并行”究竟有何不同,因为很多人经常把这两个概念混用。直到我阅读了阮一峰的博客,我才意识到原来它们并不是完全相同的概念。
这让我想更深入地了解与“并发”和“并行”相关的知识,尤其是和我熟悉的编程语言——JavaScript——相关的内容。所以,这篇文章基本上是我在学习过程中总结的一些笔记。
顺序执行、并发和并行在我们的日常生活中,任务的执行方式有时是顺序的,有时是并发的,也有时是并行的。这些概念同样适用于计算机科学。
顺序执行指的是任务一个接一个地完成,没有任何重叠。举个例子,假设你正在做饭。你先洗菜,做完后再开始炒菜,完全按照顺序进行。这种方式的问题在于,有时一个任务的进展可能会被阻塞,导致效率低下。比如,当你在等待菜煮熟时,如果不做其他事情,就会浪费很多时间。因此,在某些情况下,进行多任务处理可以提高效率。
并发和并行是实现多任务的一种方式,但它们之间有一些细微但重要的区别。
并发就像是通过不断切换多个任务来实现多任务处理,也就是“交替执行”。举个例子,假设你正在做饭,先把菜洗好放在一边,再开始炒菜。当菜炒的过程中,你去检查一下炖汤的火候,再回来翻 ...
计算机编程的哲学:从古代哲学到现代实践
计算机编程的哲学:从古代哲学到现代实践计算机科学和编程不仅仅是技术问题,它们同样包含着深刻的哲学思考。许多古代哲学的智慧,今天依然能为我们提供宝贵的启示。本文将探索几条计算机编程中的哲学原则,并以古代哲人的思想为基础,阐述如何将这些哲理应用到现代软件开发中。
1. 亚里士多德的本质与附属性质亚里士多德的逻辑学原理中提到,事物有“本质性质”和“附属性质”的区别。例如,单身汉的本质性质是“未婚”,而“棕色眼睛”则是附属性质。我们无法通过附属性质推导出事物的本质。例如,不能由“所有单身汉都有棕色眼睛”推断出“所有单身汉都未婚”,因为眼睛的颜色与婚姻状况无关。
这一思想对计算机编程的启示是:在解决问题时,我们应当区分问题的“本质复杂性”和“附属复杂性”。本质复杂性是指问题的核心难点,例如在软件开发中,如何处理复杂的数据结构、算法优化等。而附属复杂性则是指那些与问题解决没有直接关系的、但不得不处理的事项,例如数据库的访问权限管理、跨平台的兼容性问题等。
例如,考虑一个简单的需求——从网页抓取数据并将其存入数据库。虽然这一问题在本质上相对简单,但在实际开发中,常常会被附属复杂性所拖累:可能需要连接 ...
DRY(Don't Repeat Yourself)原则在软件开发中的应用与实践
DRY(Don’t Repeat Yourself)原则在软件开发中的应用与实践在软件开发中,避免重复是一项至关重要的原则。Andrew Hunt 和 David Thomas 在《The Pragmatic Programmer》一书中提出的 DRY(Don’t Repeat Yourself) 原则,意在避免在不同地方编写重复的代码或信息。这三句话虽然简单,却深刻影响了软件开发的方式。Glenn Vanderburg 曾指出,“重复是软件开发中最大的阻力”。而 DRY 的核心目标是消除这种重复,减少冗余,提升代码质量和可维护性。
DRY 背景介绍在软件开发的早期,重复的代码和冗余的资源分散在项目的各个方面。每当我们需要修改某个功能时,我们不得不在多个地方做相同的修改。这种做法不仅浪费了时间,也带来了出错的风险,尤其是在大型项目中,频繁的重复操作可能会导致难以追踪的 bug 或更新失效。
DRY原则 的核心思想就是:尽量将信息源集中管理,避免在多个地方重复相同的内容。通过重构和抽象,我们可以将信息和逻辑提取到统一的地方,减少冗余,提高代码的可维护性和可扩展性。
三个典型的 DRY 场 ...