博客

我的博客覆盖了前端、后端、客户端以及系统编程等领域,以构建高效、弹性、可维护的应用程序为目标。这里记录了我对一些新技术、新工具以及在项目中的开发实践,往前翻翻还有很多不着调的诗歌。

一个 Java 开发者的 iOS 入门指北

武汉的九月中旬,虽已入秋,树叶也渐黄了,但天气还是热的。夏天的夜晚依旧漫长且乏味,我已记不清楚是什么动机 —— 可能是闲得无聊,或者是偶然间在 B 站看到有人分享开发 SwiftUI 的视频觉得好玩,便阴差阳错的开始啃一本《iOS 与 Cocoa 开发指南》。

应用设计的 Figma 入门指南

软件开发的本质是对于想法和需求的不断澄清和最终实现的过程,在这个过程中会逐步调整需求和实现,以及考虑各种场景和边界条件。通过将应用设计和实际实现进行区分,可以让需求在前期尽可能的缩减设计-反馈路径循环周期,快速和准确的澄清需求,避免过早实现以导致应用交互模型和目标用户的心理模型差异过大而造成失败。

日常产品的设计指北

这是我阅读《The Design of Everyday Things》(作者为唐纳德·诺曼)一书的读书笔记。此书详细介绍了自然匹配设计的模型以及背后的深层次原因,由于作者原是认知心理学家,因此本书较多的涉及了知觉、记忆、注意等方面的内容,这些知识是作者用于说明其设计模型的基础。作为认知科学的在读学生,我也从另一个方面重新认识了基础认知过程对于人的心理感知、设计原则造成的影响。

TDD 实践:基于 clojure.test 的 Maven 工程测试环境

每个人都知道自动化测试的重要性,但却很少有人真正去做。而其原因归根结底,是没有意识到自动化测试的重要性,或者被裸奔的、快速迭代和迅速变质的代码带来的伤害了解不足,教训不够深刻之故。

对 Kafka 的一些见解

有两种角度看待寄存器机器:其一更关心 CPU 解码执行的指令,其二则更执着于数据是如何流过指令产生变化的。程序语言作为对计算机操作的抽象,大体也分为这两种流派:命令式编程语言以及其变体 —— 面向对象思想(C、SmallTalk)和函数式编程语言(LISP、Haskell)。

我的 Flutter 之旅

相比较原生移动应用,跨平台 GUI 的劣势如何?在这个时代,Web 开发还有吸引力吗?

谈谈 Clojure/Script

技术没有“银弹”,即便是再趁手的模型或工具,也偷偷的在暗中标好了价码,只待使用者在某个窘迫的场景下无奈的发现或默默接受它。

Clojure(Script) 的编程乐趣

Clojure 绝对不是“另一门”编程语言,它足够的老,可以追溯到 1972 年,又足够的现代,不论是前端的消息总线还是后端的不可变数据库。它不依赖重型的框架,提倡简单就好的理念,面向不可变的数据开发。它足够的优雅和有趣,以至于 Uncle Bob 选择 Clojure 作为他二三十年职业生涯最推崇的选择。

SICP 106 - 寄存器机器里的计算

本章是 SICP 的最后一章,包含了必要的习题解答。首先使用 Scheme 实现了一个寄存器模拟器,然后手动把一些 Scheme 代码翻译成了汇编代码执行,之后用汇编代码写了一个直接控制的解释器,探讨了这个寄存器机器存储分配的方法并使用汇编代码实现了 LISP 经典的分半垃圾回收机制,最后我们使用 Scheme 代码写了一个编译器,使其可以自动将 Scheme 代码翻译为汇编代码。作为最终的结果,Scheme 代码可以编译执行(比如过程定义),也可以在解释器中解释执行(比如过程调用),这种方式充分利用了编译的性能和解释的开发调试灵活性。

SICP 105 - 元语言抽象

本文是对 Structure and Interpretation of Program - SICP 一书第四章“元数据抽象”的总结,包含了(几乎)所有习题的答案。元数据抽象提供给开发者看待和解决问题的新视角,在领域相关问题上可提供相比较通用程序设计语言更加简洁且具有表现力的解决方案。本文将介绍如何实现一个(不包含错误处理的基于 Scheme 基本过程和控制能力)的基本 Lisp 解释器,并且基于这种解释器的变形实现惰性求值、非确定性问题解决,并且在最后介绍了如何从头实现一门具有基本结构、组合能力和抽象能力的逻辑语言(数据查询语言)。