박성범 Simon Park

RSS: https://parksb.github.io/feed.xml
Simon Park 的个人博客。

是什么让软件开发成为工程

这篇文章从“软件工程”一词的历史出发,讨论了什么让软件开发成为工程。作者回顾了 1968 年 NATO 软件工程和 ALGOL 68 之争,指出软件工程并非天然等同工程,而是通过系统性、可量化、迭代的决策流程(估算—比较—实现—测量—反馈)才具备工程属性。 文中用一个电商页面加载慢的 Redis 缓存优化案例展示工程方法:从测量 FCP、定位数据库瓶颈,到估算缓存命中率、验证结果偏差并迭代优化。 作者还引入 Peter Naur 的“心智理论”、bricoleur 和软件园艺等视角,认为组织需要工程方法拉平个体差异,保证一致质量。最后回应 AI 是否会终结软件工程的争论,认为在可预见的未来,人类工程师仍需提供上下文、验证 AI 输出,并建议读者警惕“AI 自动写代码、人类不再负责”的自我实现预言。
评论点赞收藏21 小时前

将软件开发变成工程学

<p>KO | EN 制作软件的职业有多种称谓。最常见的称谓是“开发者”,而“程序员”这一称谓则显得中性且略带传统色彩。“编码员”顾名思义是指从事编码工作的人,但由于其在软件开发的众多环节中往往仅承担被动的代码编写任务,因此有时也被用作贬义词。<br><br>与之相对的是“软件工程师”。这一称谓给人的感觉截然不同:不知为何,它似乎比“编码员”更专业,也让人觉得其数学能力可能强于“程序员”,仿佛……</p>
评论点赞收藏1 天前

为函数式编程辩护:从范式约束到工程实践

作者通过亲身经历和理论分析,论证了函数式编程在错误处理和代码可维护性上的实际优势。Rust 的 Result 类型强制处理异常,Option 类型消除 null,纯函数实现引用透明性使代码更易读。 文章对比 Java 与 Haskell 的范式差异,指出语言生态约束比语法特性更能决定编程风格。推荐《Functional Programming in Scala》等学习资源。
评论点赞收藏63 天前

CPU 缓存工作原理的具体解析

文章详细拆解了 CPU 缓存(Cache)的硬件实现原理,包括局部性原理、命中率计算、组相联映射(Set Associative)及替换策略(LRU/FIFO)。 特别通过具体地址示例演示了 Tag 匹配过程,并结合代码展示了如何通过调整循环顺序利用空间局部性优化性能。虽然指出编译器常自动处理此类优化,但深入底层机制有助于理解现代计算机体系结构的核心瓶颈与权衡。
评论点赞收藏70 天前

用 Arch Linux 复活一台 15 年前的上网本

作者用 Arch Linux 32 重装了 2009 年的华硕 Eee PC 1000HE 上网本。文章详细记录了在 1GB 内存和老旧 Atom 处理器上安装 Arch 的全过程,包括解决 32 位支持、分区策略(特别是 Swap 大小调整)、GRUB 引导配置及网络设置。 对于喜欢折腾旧硬件、关注轻量级 Linux 发行版或 Arch 安装原理的技术读者来说,这是一篇极具参考价值的一手实战指南。
评论点赞收藏77 天前

铁路时刻表如何演变为Unix时间

从太阳时、原子时讲到操作系统与应用程序的时间处理。解释了Unix时间戳起源、2038年问题、闰秒陷阱及单调时钟的重要性。提供Python、Rust、Java等多语言处理时间的最佳实践与避坑指南。
评论点赞收藏86 天前

但“剃牛刀”(Yak Shaving)确实很有趣

文章以作者从零构建博客系统为例,探讨了工程师文化中“剃牛刀”(yak shaving)现象——即为了一个小目标而陷入无限的技术衍生开发中。 作者引用了该术语在MIT AI实验室的起源、卡通《Ren & Stimpy》中的典故,以及Donald Knuth因排版需求发明TeX及Literate Programming的著名案例。 尽管承认从底层构建往往效率低下且容易偏离初衷,但作者认为这种探索过程本身充满乐趣,且是深入理解计算机体系结构的有效学习方式。
评论点赞收藏105 天前

为什么Web变得如此复杂?

文章回顾了从2000年代简易建站到现代Web开发极度复杂的演变过程,探讨了Web技术栈膨胀背后的原因。
评论点赞收藏440 天前

打造智能手机作为PC的运动控制器

作者分享了自己拥有多平台设备(MacBook, Ubuntu, iPhone, iPad)时,发现跨平台协同(如Universal Control)的局限性。文章指出手机传感器被闲置是一种浪费,提出了将智能手机作为PC运动控制器的构想,旨在解决不同平台间设备联动的问题。
评论点赞收藏981 天前

用 Arch Linux 复活一台服役15年的老式上网本

作者使用Arch Linux成功复活了一台2009年的Asus Eee PC 1000HE老式上网本。文章对比了老旧Intel Atom N280处理器与现代入门级芯片的性能差异,分享了在极低配置硬件上运行现代Linux发行版的实践经验与技巧。
评论点赞收藏1114 天前

函数式编程为何难以真正说服开发者?

<p>如今,函数式编程已当之无愧地跻身主流。许多编程语言都借鉴了函数式编程的核心理念,像 Green Labs 这样的企业也在企业级规模上树立了成功的实践标杆。<br><br>关于函数式编程的书籍和资料也随处可见。近来,就连编程初学者似乎也开始意识到函数式编程的重要性。然而,真正将其视为严肃课题的程序员仍然不多。<br><br>那些刚刚开始了解函数式编程为何物的程序员,往往会对自己产生怀疑……</p>
评论点赞收藏1409 天前

从铁路时刻表到Unix时间:计算机如何处理时间

文章探讨了计算机工程中处理时间的复杂性,从历史背景下的地方平均时(LMT)到现代标准时间的演变,解释了太阳时、原子时等时间体系,以及这些历史和技术因素如何影响了Unix等系统中的时间处理方式。
评论点赞收藏1681 天前

通过服务端驱动UI设计实现界面灵活化

<p>与网页不同,原生移动应用在构建并发布后便无法再进行修改。如果在将应用上架至应用商店时误将按钮放置于错误位置,且用户已安装了该版本的应用,那么就再也无法更改按钮的位置。<br><br>唯一的办法只能是让用户自行前往应用商店,将其更新至包含修复后的版本。发布后不可修改这一特性还会带来另一个问题,那就是 A/B 测试。<br><br>由于用户在使用软件过程中的行为与体验会因界面布局或文案措辞的不同而发生显著变化,因此设计出最优的界面显得尤为重要……</p>
评论点赞收藏1909 天前

打造易读网页的排版设计指南

<p>本文旨在介绍在网页上呈现长篇文字时,如何通过设计使其更易于阅读的原则。以传统的排版法则为基础,探讨在网页环境中如何高效地编排文本,但不涉及对字体本身的剖析。<br><br>对于文中提出的这些原则,与其一味照搬,不如根据具体情境灵活运用;若有意进行实验性的尝试,则不妨选择不遵循。首先需要明确与字体相关的术语。<br><br>由于排版学的诸多内容源自昔日金属活字的排印工艺,了解其历史背景有助于加深理解。例如,大写字母“…”</p>
评论点赞收藏2086 天前

互联网运作的非常具体的原理

<p>我们来考察一下在学校里用笔记本电脑访问谷歌(www.google.com)的过程。本文中出现的KT、Google Fiber,以及谷歌的网络架构、节点的IP地址和MAC地址,均为简化或假设的情况。<br><br>此外,为了概览客户端与服务器之间完整的报文交互过程,文中省略了代理和缓存机制。学校网络中部署了多个接入点(AP),这些AP又连接到交换机;交换机则与网关路由器相连,而该路由器又通过SK Broadband或KT等互联网服务提供商(ISP)...</p>
评论点赞收藏2438 天前

你不知道Rust的魅力,真为你感到遗憾

<p>我遇到过的开发者大多对自己使用的编程语言并不特别满意(极端一点的,像 JavaScript 和 PHP 就属于这一类),而唯独 Rust 的开发者们却会积极地推荐 Rust。<br><br>不过,我起初也只是把它当作“嗯,有这么一种语言罢了”来看待。然而,在 Rust 2018 版发布之后的近一年里,诸如“Rust 代码可以编译成 WebAssembly”“Deno 的核心用 Rust 编写”之类的消息便充斥着我的信息流。<br><br>甚至在参加了 Sprint Seoul 六月聚会、见识了 RustPython 的人气之后,Rust 似乎已经成了一个无法回避的时代……</p>
评论点赞收藏2497 天前

我在军营里做的每日新闻自动推送工具

作者因在军事训练中感到与外界隔绝,且现有服务体验不佳,决定开发一个自动化程序,将每日新闻摘要通过特定平台发送给战友。这是一篇典型的个人项目分享,结合了真实的生活痛点与工程实践。
评论点赞收藏2557 天前

但剪牦牛毛很有趣:从零构建静态博客系统的经历

作者因现有静态站点生成器定制受限,决定从零开发一套包含Markdown转换和部署工具的完整系统。文章以“剪牦牛毛”比喻这种在底层工具链上重复造轮子的过程,探讨了开发者在构建基础设施时的体验与乐趣。
评论点赞收藏2618 天前

CPU安全漏洞解析:MDS攻击的具体原理

文章详细解释了MDS(微架构数据采样)漏洞的原理,指出其利用CPU内部的Line Fill Buffers、Load Ports和Store Buffers泄露隐私数据。 作者回顾了此前著名的Meltdown和Spectre漏洞,旨在深入理解这些底层硬件安全缺陷的具体攻击机制。
评论点赞收藏2677 天前

用一个类型装下狗和猫

<p>这里有一只小狗和一只小猫。data class Dog(val name: String) data class Cat(val name: String) identity 函数是一个恒等函数,它总是原样返回参数。<br><br>identity(dog: Dog) 函数接收一个 Dog 类型的参数并将其返回,而 identity(cat: Cat) 函数则接收一个 Cat 类型的参数并将其返回。<br><br>fun identity(dog: Dog) = dog fun identity(cat: Cat) = cat val dog = Dog("Jake") identity(dog...</p>
评论点赞收藏2698 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。