Blog | Phodal 全栈工程师

Blog

Latest articles

第三个系统

最近,我刚好在和我的同事一起重写 VSCode 的一部分小功能,重写过程中有一些特定的感受。正好就着最近流行的操作系统话题,写写我的想法。因为某种协议的存在,不想为自己寻找麻烦,我这里就称为第三个系统。 系统是由一些相互联系、相互制约的若干组成部分结合而成的、具有特定功能的一个有机整体(集合)。这些要素可能是一些个体、元件、零件,也可能其本身就是一个系统(或称之为子系统)。 所以,如果是一类操作系统的话,那么以系统来定义为更加合适。 三个系统 提及到第三个系统的时候,我想到的是一本很不错的小册子(书),其名为《Linux/Unix 设计思想》。这本书主要是在讲 Linux/Unix 相关的哲学(实际上,我一直觉得这样的书很容易写,学好 Linux 和哲学,然后将哲学套到 Linux/Unix...

构建的抽象

最近,在研究 Gradle 和 Java 相关构建的实现,让我对不同编程语言的应用构建燃起了一点点的兴趣。 不同编程语言编写的应用,在它运行的状态下,会有不同的运行机制,有的是以二进制的方式运行的,有运行在编程语言的虚拟机之上。而构建所做的事情呢,就是将那些我们写给人类看的代码,转换为机器/程序能看懂的代码。所以,构建的本质就是翻译(~~复读机~~)。 PS:本文旨在尝试性的整理我所了解的构建知识。部分内容限于对某一些编程语言的理解有限,并非非常准确。如有偏颇之此,希望大家指正。 引子 1:从 Java 的编译说起 绝大多数程序员都是从 hello, world! 开始自己复制、粘贴的人生生涯。对于那些刚上手 Java 的程序员也是类似的: javac HelloWorld.java...

Rust OO:多态与继承

学习编程语言的最好方式最反复练习。 最近在用 Rust 重写 VSCode-Textmate 库:scie。原有的代码中,大量地使用了 OO 相关的东西,而 Rust 要实现 OO 也需要一些奇技淫巧,而我本身对 Rust 也不是非常熟练,所以我写了这一篇笔记来记录如何实现一个复杂的 OO 场景。 至于 Rust 是不是 OO 语言,这个场景我不擅长讨论,我只是需要一个使用 Rust 实现 OO 的场景。不过呢,引用 Rust 官方文档对于 Rust OO 的介绍中,的 GOF 的引用部分: 面向对象的程序是由对象组成的。一个对象包含数据和操作这些数据的过程。这些过程通常被称为方法或操作。 PS:我使用 Rust 的时间并不长,里面一些对于相关的描述并非非常准确,如果有不合理地地方,欢迎读者指正。...

『头破血流』学编程语言(Rust 篇)

学习 Rust 已经有一段时间了,断断续续地在业余时间造了一些轮子。通过这一系列的练习和仿造,对于如何学习新的编程语言有一些新的感悟。这篇文章讲的方式并非是捷径,也不是什么 7 天精通,而是继续使用笨办法地方式来进行学习。 关于编程语言学习,我已经写过两篇相关的文章: 『学习的艺术——如何学好一门技术、语言』,文章的主旨是:介绍如何通过造相似的轮子、进行相关内容输出的方式,来提升对于编程语言的理解。 『如何同时学会两门编程语言?』,介绍的则是用硬核的方法:造语法、词法解析的方式,来掌握新的编程语言。同时,如果我们是对新的编程语言的解析,那么我们就等于学习了两门新的语言。 从我的角度来看,前者的介绍过于简单,只是告诉了你应该这么做,但是没有说要怎么做。而后者则难度太大,对于大部分的人来说,几乎是不会想着去做这样的事情。而本文的难度呢,刚好介于两者之间,至于是不是中间嘛,也不好说。难度,因人而异,因时间也有区别。...

Gradle Debug:基于 Composite Build 的方式

最近,在研究 Gradle 的编译和插件相关的东西,配置了两次 Gradle Composite Build,结果还是忘了。所以,我决定写一篇文章记录一下:如何使用 Gradle Composite Build 调试 Gradle Plugin。 常规 Composite Build 对于一般项目来说,采用 Gradle 官网的配置方式即可:Composing builds 在 settings.gradle 中添加模块: rootProject.name = 'my-composite' include ':plugin-example' includeBuild 'some-plugin' 如果没有的话,需要创建一级父目录,并将插件(some-plugin)和插件示例(plugin-example)放置在同一级目录。然后修改一下插件示例(plugin-example)的...

大型开源软件的阅读技巧

最近的一段时间里,我在研究 Android 配套工具和 Android Studio 相关的实现,以及它们如何配合完成一个 APK 的构建。因为整个系统各个模块之间的关系过于复杂,除此,不同模块之间也包含了大量的代码 —— 无论是从行数上,还是从函数长度上来说。(PS:顺便吐槽一句, @google.com 的一部分人写的代码也是又臭又长) 从总体的思路上来说,在进入代码阅读之前,我们需要: 理解代码背后的业务流程 理解架构设计的思想 从而我们才能理解主流程(脉络)。针对于此,我们会发现一些不同的模式: 借鉴他人。从他人的学习笔记中,理解整体的思路和过程。如 Android APK 的构建,Android 资源如何优化,从中理清代码阅读的思路。 源码学习。 借助测试调试。...

自制 Gradle 依赖格式及转换插件

在我们使用 Java + Gradle 开发各类应用的过程中,会发现我们声明的一些包不是 jar 包,诸如 zip、war、aar 等。它也会下载下来,并转换到我们所需要的格式。 这个过程蛮有意思的: 注册对应的 DependencyHandler Transform 创建自定义的 configuration 在接收到对应的 configuration 时,进行依赖转换 在使用时,通过 configuration 获取到对应的制品(artifacts) 在编译的时候,取出这些制品的路径 在我找了好久之后,终于在官方项目的 issue 里找到了一个示例:https://github.com/gradle/gradle/issues/13200 。这里就基于这个示例来进行讲解。...

自制简易 Gradle 的 Java 编译器插件

最近,因为兴趣 + 项目的需要,研究了一下 Gradle 相关源码中关于 Java 编译的实现。也顺便按照相关的 Gradle 插件,做了一个简单的插件,了解了相关的原理。 主要步骤如下: 创建、配置 Gradle 的 configurations 创建 task 在 task 中,获取 configurations 在 task 中,配置编译参数 调用 Gradle 插件中的 JavaCompile 完美 相关的文档主要在:Defining custom configurations 创建自定义的 Gradle Configuration 如果是使用 build.gradle 的话,那么步骤相当的简单: configurations { jasper...

六年之后:回到底层编程

一个月以前,我加入到 ThoughtWorks 已经进入了第 7 个年头。我本来不想再花时间写一篇相关的文章。只是呢,最近发生的一些事情,或许和每个 IT 人息息相关。我便想着,再花点时间思考一下:我们的行业以及行业背后的 IT 体系。 从某种程度上来说,我更可能是在弥补一块重要的短板 —— 一来,不是从事相关的领域;二来,平时的开发中真的用得少。 Web 开发的核心:CRUD? 在我先前的文章《项目初期的最优技术实践》里,我把产品开发的生命周期分为了: 技术准备期 业务回补期 成长优化期 从技术维度来看待的话,我们会发现随着时间的推移,整个项目对于人能力的要求会越来越低,直至大家都变成 CRUD、Copy/Paste 程序员。唯一经常还被提及的难点就是:对于数据库的各种优化,又或者是对于遗留系统的迁移,又或者是对于某个开源软件的优化。...

微服务治理:自动化分析方式

关于『设计一个微服务治理的工具』这个想法,我已经酝酿很久了。但是,你懂的,又是因为种种原因,我搁置了蛮久了。最近,刚好因为在研究『架构适应度函数』,所以,我有了一个新的想法。微服务架构治理,看似和架构适应度函数并没有啥关系。但是,我设想的是一个用于『微服务治理的架构适应度函数』。 你可以把它想象为一个用于帮助更好开发微服务应用的工具。顺便一提,因为手头上并没有这样的场景。所以,我先把我的相关思路记载下来,方便于后续集成。而且大部分功能已经在 Coca 中实现,我会将部分的功能再交由 Coca 来实现。如对于,数据库的自动化分析 —— 已经有 Tequila 进行了大量的自动化。 微服务粒度适应度函数 对于微服务架构来说,最令人头疼的一个问题就是微服务粒度。从最源头上,我们应该遵循『两个披萨团队』这个定律,即:...

Discover, share and read the best on the web

Subscribe to RSS Feeds, Blogs, Podcasts, Twitter searches, Facebook pages, even Email Newsletters! Get unfiltered news feeds or filter them to your liking.

Get Inoreader
Inoreader - Subscribe to RSS Feeds, Blogs, Podcasts, Twitter searches, Facebook pages, even Email Newsletters!