svdu - Development
type: channel
link: https://svdu.me/category/dev/
items: 被岗位保护的程序员，正在被 AI 淘汰
items: 使用 atlas 进行数据库迁移管理的实践
items: 数字化簿记系统设计（上）：会计学的古往今来
items: 物联网的标准通信协议：MQTT的介绍和快速上手
items: 软件开发中的心智负担
items: Setup my Debian
items: Setup my development environment

被岗位保护的程序员，正在被 AI 淘汰
type: item
date: 2026-02-01T19:41:00+08:00
description: 当我们谈论 AI 对程序员的冲击时，问题往往被简化成：程序员会不会被取代。但真正被取代的，也许并不是“程序员”这个职业，而是十几年来我们所熟悉的岗位划分与组织形式。或许 AI 会将整个计算机软件开发行业，带回到应属于它的样子，“全能开发”与“领域专家”将会这个行业仅需的两种人才。而那些被岗位划分保护着的程序员们将会被淘汰。过去的软件开发行业是什么样的？为什么同样是编程工作却会被细化为如此之多的岗位？未来的软件开发行业又会变成什么样？希望通过这篇文章与读者们一同分享，作为从业者的我，在 AI 冲击下的一些思考。过去: A programmer上个世纪 60 年代，大型计算机在西方的企业、大学和政府的普及，使得程序员这一职业进入了主流视野。这个时期程序员们的工作与现在有着极大的不同：程序员们根据业务部门的需求，对照着如同字典一般厚度的手册，在纸带上打孔，或者是在电传打字机上打字，将程序和数据一同送入计算机中。计算机会按照程序处理数据，然后将结果打印出来，再由程序员们“翻译”后转交给业务部门。随着集成电路技术的发展，70年代末，以 Apple II 而为代表的个人电脑走入普罗大众的家中，编程这一活动不再仅限于企业雇员，而是一项所有人都可以参与的活动。这一时期有一群热爱编程与计算机的人，例如 Guido van Rossum1（吉多·范罗苏姆), Linus Torvalds2（林纳斯·托瓦兹）, Bill Gates（比尔·盖茨）, Steve Jobs（史蒂夫·乔布斯）等等，他们塑造了我们如今所熟悉的计算机与编程开发工作，也塑造了计算机软件开发领域的文化——开放与共享。而到了90年代到新世纪的第一个10年，无论是为企业信息化提供软件方案，亦或是给 Windows 图形化桌面系统开发个人软件，也或许是开发一个互联网的网站服务。这一时期程序员的需求达到了一个极高点，而程序员的高薪资待遇也吸引了许多人前赴后继投入这个行业之中。过去那种因为热爱才去做的时代，不复存在。在这一时期，程序员之间的工作差异并没有那么明显，一个程序员通常会承担许许多多的工作，包括但不限于程序的文档资料、程序的界面开发、核心业务逻辑、服务器的运维、客服工作等等，甚至可能包含给老板修打印机。在这一时代，由于技术选项并不算多并且业务相对简单，因此以当下的眼光来看，人人都是全栈人才。除了一些特殊行业（例如：游戏开发），程序员之间的分化并没有那么严重。现在: 无形壁垒2008 年 iPhone 3G 发布，其首次搭载了 3G 网络，并允许用户通过 App Store 安装第三方软件。这一款手机的发布，标志着信息时代进入了第二个时期：移动互联网时代。新的互联网入口，极大的扩展了互联网服务的呈现方式，加之移动客户端、桌面客户端、网站的开发流程完全不同，因此岗位出现了分化——前端（客户端）开发、后端（服务端）开发。2008 年，我国的手机上网用户仅为 7305 万人3。到了 2013 年，已经达到了 4.64 亿人，占网民群体的 78.5%.互联网用户群体的暴增，带来了许多新的挑战：一个小小的程序错误，可能会导致成千上万人受到影响。为了提高系统的可靠性，在技术发展越发复杂，在管理上为了权责的划分，也将后端开发的岗位进行了进一步的细分：业务程序员、架构师、数据库管理员、运维人员、产品经理、专职测试 QA 人员。至此，我们所熟悉的行业组织形式已然出现：岗位不再承担具体的角色，而是为了达成某一目的的零件，个人所持有的技能被岗位的权责所限制。并且这些岗位并非技术上不可合并，而是管理上的“风险管控”。团队中的绝大多数人，可能根本不了解系统是如何运作的：前端开发人员不知道用户输入的数据在系统内是如何被处理和存储的，后端开发人员也不知道用户的交互是为何而设计且如何实现的。每个人只要负责足够小的一个模块，每个人都可以非常轻易地被另一个人所替代。塑造这一切的，既有客观原因：用户量的增加、软件组织复杂度的提高、安全与合规性的挑战等等。但不可忽视的，一些人为因素进一步加剧了整个行业的变化，从人才培养到职业晋升都变得如此畸形：公司经营的风险管控、HR 的评价体系简化、短期绩效考核带来的奖惩机制等。这样的工作组织形式，与工厂流水线无异，每个人只需要专心并负责自己手上的工作即可。无论是工业时代，还是信息时代都足以证明，这样组织形式，在生产力没有得到突破之前，一定是最优解。其成就便是这十几年来高度信息化的社会，与极为丰富的信息服务体验。未来: 全能技术与领域专家2022 年末，ChatGPT 问世，无比自然的交流与回答，颠覆了人们对于人工智能在过去二三十年的传统认知。但在信息技术领域，程序员们依然对其嗤之以鼻，认为其只是一个可笑的玩具。三年之后的 2025 年，氛围编程 (Vibe Coding) 这一编程范…

使用 atlas 进行数据库迁移管理的实践
type: item
date: 2025-11-11T19:00:00+08:00
description: 工作经历虽然不多，且都是开发基建不那么完善的小公司，因此在工作中经常会有各种不爽，其中一家连源代码管理都没有，那更是痛苦至极。现在这家公司在基建方面虽然不太完善，开发管理也不是那么完美，但总归来说还是比较不错的，至少有使用 Gitea 这种比较成熟的代码托管平台。我负责的项目在去年一直都没有正式上线，但也是给其中一个意向客户部署了测试版，在这期间项目也在快速迭代，在没有 CICD 的场合下，每一次在开发测试环境（是的，我们开发和测试是同一个环境）完成某一个需求后，在向客户推送更新时，迁移数据库表结构是一件非常痛苦的事情。在这件事情上，我的同事们使用了一些不那么合规的方法，通过图形化的数据库管理软件进行结构迁移。这对我来说有一些难以接受，另一方面我确实不习惯使用图形软件管理表结构。尽管我在公司被称为项目经理，但公司同事和团队成员普遍习惯使用图形化工具。因此引入语言绑定的迁移工具并强制统一使用并不现实，只能寻找外部独立工具作为折中方案。对于这个工具，我有一下几点要求：需要可以导出现有数据库的 DDL可以比对两个数据库生成 Migration 的 SQL可以像常规的迁移工具一样，通过 Migration 管理数据库版本最好是命令行工具，且尽可能不需要有额外的运行时要求实际上，这个需求的 1、3、4 都并不算复杂，市面上也有许多，例如 dbmate 和 goose 都能做到。但 2 这个需求就很难符合的产品，因为“根据对比生成 Migration”和“通过 Migration 管理数据库版本”本身是冲突的，绝大多数产品并不会同时支持两个方法管理。在我苦苦寻找之后，我找到了同时满足以上四点的产品 —— atlas迁移工具的不同形式市面上的迁移工具有两种形式，分别是：“描述、执行”和“声明、对比、应用”。类型代表软件描述、应用- phinx (主要用于 PHP 项目)- goose (通用，可与 golang 项目集成)- flyway (通用，可与 Java 项目集成)声明、对比、应用- alembic (与 ORM SQLAlchemy 集成，用于 Python 项目)- EntityFramework Core (本身就是 ORM，用于 .NET 项目)- atlas (通用，面向 CICD 设计)简单来说，“描述、执行”方式的迁移工具，符合 DBA （数据库管理员）的直觉，它的流程通常是：新建一个迁移文件，描述本次迁移执行的指令，然后迁移工具执行迁移文件，维护迁移的执行历史。但这对于开发人员来说比较繁琐，因为我们在设计或者调整表结构时，更多的是去关注整个结构是否满足需求，而不会去在意甚至是记录增删改了哪些字段。而“声明、对比、应用”更符合开发人员的直觉，它的流程是这样的：声明是指定义出期望的各个表（在 ORM 为 Entity/实体 或 Model/模型 ）的结构是什么样的；对比是指计算出当前数据库中的各个表（Entity）与期望的表（Entity）的差异；应用是指迁移工具执行差异并维护迁移执行历史而之所以这种方法能够与 ORM 高度集成，也是因为当开发人员定义 Entity（或模型）时，实际上就已经完成了绝大多数的表结构定义的工作了。这个时候再手动去维护表结构，就显得有一些多余了。但也正如前言所述，这类方法很多时候也都是与 ORM 高度集成的，对于一些编程语言而言，特别是一些弱类型动态类型语言而言，社区里面没有提供这样的 ORM，也就很难享受到这种面向开发者的迁移流程。不过好在，现在我们有了 atlas 。工作流atlas 提供了两种工作流，分别是 Declarative workflow 和 Versioned workflow 。他们分别对应了：数据库优先和代码优先，这两种工作流程。其中所谓数据库优先则是指对数据库进行相应操作，然后使用 atlas 将数据库直接迁移直接应用到目标数据库中， atlas 将比较两个数据库之间的差异，并生成、执行对应的 SQL/DDL 语句。而代码优先，则是通过定义数据库结构，通过生成迁移文件来实现可以管理和追踪的数据库版本。在本篇，我们将使用 PostgresSQL 进行演示，尽管 atlas 提供了 HCL 这样一个 DSL （领域特定语言）来完成相关工作，但仅为了数据库管理就引入一个 DSL 收益或许并不算太高。说明式的工作流/数据库优先 (Declarative workflow)迁移假设我们获得了一个名为 "original-database" 的数据库，它的 DDL 是这样的：CREATE TABLE book ( id SERIAL, title VARCHAR(1000) NOT NULL, author VARCHAR(1000) NOT NULL, isbn VARCHAR(…

数字化簿记系统设计（上）：会计学的古往今来
type: item
date: 2025-06-27T13:11:00+08:00
description: 随着时代发展，我们身边越来越多的事物都被纳入了数字化管理的领域之中，对于公司和组织来说更是如此。无论是公司的财产，还是公司所拥有的生产物资，甚至是公司所拥有的劳动力，一套可以进行审计、分析甚至可以进行预测的信息系统，对于一家具有一定规模的公司而言都是极具价值的。然而开发这样一套系统并非易事，要设计一个合理且稳健的资源管理系统充满了挑战。好在进入数字化时代之前，我们社会中就已经有许多工作在与大量的信息与数据打交道了，在这其中会计学以及一系列会计的工具和方法，可谓是资源管理的“集大成者”。在人类社会发展过程中，许多可以被量化的资源，都可以通过会计工具和方法进行管理。会计簿记通过最简单的方法和规则，构建了一套审计过去，分析当下和预测未来的系统。通过了解并掌握簿记的规则，有助于我们设计一套适用于绝大多数场景的资源管理系统。尽管现实世界通常更加复杂，通用的设计并不能完美满足各个企业的具体工作流程，但我们仍然能从中学习到设计一个可审计的系统的必要元素。本文将分为上下两个篇章，上篇将介绍会计学的历史，引导读者建立基本的会计意识，并介绍一些现代复式簿记的基础规则。下篇将会使用信息技术进行实战。希望对各位读者有所启发。会计的历史记账，是人类社会发展至一个阶段的必然需求。无论是记录食物的收获，还是记录人力的开销，亦或是金银的流通，当人类中某一事物数量的增减，复杂到无法再用双手去计算变化时，记账的需求会自然而生。在文明早期，纸张发明之前，记录文字的成本通常比较高，例如苏美尔文明使用石板作为媒介。因此人们不得不使用其他更易获取的事物来完成记账工作：在一小块粘土上刻上图案烧制成陶块，用以表达一个数目，通过若干个陶块就可以完成计数的工作。随着科技发展，各式各样纸张的诞生，让记录成为了一种稀疏平常的事情。但在很长的时间里，由于宗教、文化等多种因素影响，会计并不是一个专门的职业，它通常和一些文书类的职务有关，因为在这段时期里财产体现多是粮食等作物，并且很长一段时间里面财产的流动都是极为缓慢的。事情的转变发生在欧洲文艺复兴时期，由于宗教至上权威性的瓦解，加之亚平宁半岛（意大利半岛）各种政权林立，束缚人们思想的得以解放，政治格局充满机会，使得这一时期地中海附近的商业发展变得尤为繁盛，这其中以商业共和国威尼斯最为典型。在文艺复兴早期（公元13世纪前后），随着威尼斯的海上贸易的日渐繁盛，复杂的商业行为自然而生，这其中就包括“集资”和“分红”。在那个时期海上贸易是风险极大的商业行为，地中海的飓风、海盗以及目的地动乱的局势等等都可能会让一次出行成为泡影，轻则空载而回，重则一去不复返。但是如果能够进行一次顺利的贸易活动，那么收益也是相当客观的，高风险加之高回报，集资便成为了分担风险的手段。人类自古以来所使用的“流水账”，由于只关心单一账户下的数目变动，因而很难分清谁投资了多少金额的数目，之后又该为其分红多少。于是，记录账户之间数目变动的工具便诞生了。复式簿记法（复式记账法）的发展上图是最早的关于复式簿记的例子，他们出自于 1494 年由意大利数学家卢卡·帕西奥里(Luca Pacioli)出版的一本数学教材《概述：算术、几何、比例和比率》（ Summa de arithmetica, geometria, proportioni et proportionalità )。左侧是原文，右侧是来自于一本 1914 年出版的书籍《古代复式簿记》（ Ancient double-entry )1。尽管其排版与形制与如今的复式簿记有所不同，但其已经具备复式簿记法中最重要的一些要素如：日期、账户（人名）、金额、交易性质以及借贷平衡。下面的内容是由 AI 辅助得到一部分内容的翻译，其中的 L, S, D 是那个时期意大利地区所使用的货币的缩写：关于借方账簿的制作方法1493年。洛多维科，皮埃罗·福雷斯塔尼之子，应在1493年11月14日给出L 44, S 1, D 8，用于现金借贷，已记现金应在第2页有：L 44, S 1, D 8...关于贷方账簿的制作方法...西蒙内之子阿莱西奥·邦贝尼手中的现金，应在1493年11月14日拥有L 44, S 1, D 8，来自洛多维科·皮埃特罗·福雷斯塔尼，L 44, S 1, D 8；以及在11月22日，L 18, S 11, D 6，给马蒂诺，皮埃罗·福拉博斯基之子，第2页：L 18, S 11, D 6...随着文艺复兴影响的扩散，以及欧洲各国的贸易越来越频繁。上述这种用于私人记账或者少数几个人之间核对账户的记账方法，其局限性也愈发体现出来：每个人或者组织的记账格式都不一致；加之市场扩大，组织的形式从少数几个人的集资活动，演变成了股份制公司；同时国家也对财务管理有了切实的需求。其最典型的体现则是法国在 1673 年颁布的《商业条例》（Ord…

物联网的标准通信协议：MQTT的介绍和快速上手
type: item
date: 2025-04-14T22:40:00+08:00
description: 最近在给公司的物联网设备（自动售卖机）的控制体系架构进行改版。起因是由于新合作的设备厂商采用了完全不同的通讯协议（MQTT），为兼容新旧设备并尽可能降低对现有业务的影响，我决定重构现有的控制体系。之前厂家直接给的是串口通讯的协议，我这边还需要自己去写串口通讯的代码，然后在这个基础上去构造整个物联网的控制方案。新的厂家好像提供的解决方案更全面一些，只提供了 MQTT 协议的技术文档，没有涉及到串口通讯的内容，因此之前的方案可以说是完全不兼容了。虽然可以为新的设备重新开发一套，但是既然已经有在运营的设备了，对于业务影响最小的解决方案，反而是重构现有的设备控制体系，然后去兼容业务方面的接口。所以才决定重构，否则这么大的工作量，完全没有必要做……当然本文主要还是我在了解和学习 MQTT 之后的一篇（部分）应用费曼学习法的产出文章，如果对读者有帮助，那就再好不过了。什么是 MQTTMQTT 是一款由 IBM 的工作人员内部研发并使用近10年的协议，其最开始的定位是用于计算资源较少以及网络环境受限的场景。而之所以被叫做 MQTT 是因为 MQ 是当时 IBM 一系列的产品的名称的前缀，TT 在最开始是 Telemetry Transport（遥测传输）的缩写， MQTT 最初诞生的应用场景就是人造卫星检测石油管道连接时降低电池损耗以及带宽使用（... developed the MQTT protocol to enable minimal battery loss and bandwidth usage when connecting with oil pipelines via satellite.）2010 年 IBM 公司以免授权费的形式开放了协议（Opened with royalty free protocol）；2013 年全球非营利标准化组织 OASIS 接管 MQTT 协议，并于次年发布了 MQTT 3.1.1 版本。2016 年 MQTT 协议成为 ISO 标准。由于后续的发展与 IBM 再没关系，所以 MQTT 就从 MQ Telemetry Transport 的缩写，成为了正式的名称，即其正式名称就是由四个字母组成的 MQTT。在其后续的发展中，特别是随着 2010 年开始消费者相关的物联网设备极速发展， MQTT 最初设计的特性得到了很好体现，以至于在一些场景和需求下，MQTT 被称作是物联网设备通讯的标准协议。为什么选择 MQTT根据 ISO 标准的介绍，MQTT 的特性大概包含这些：标准轻量化、简单易于实现，并且可以基于其他网络协议实现使用“发布-订阅”方式提供一对多的消息传递数据载荷与无关的消息传递（协议不假设数据载荷类型，由订阅和发布两方自行约定）多种级别的消息传递 QoS (Quality of Service) 保证（服务质量保证）原始版本的 MQTT 是基于 TCP/IP 协议来实现的，实际上也可以基于其他协议如 WebSocket, UDP 甚至是蓝牙。而 MQTT 采用的消息传递是基于发布/订阅的，因此可以实现类似于同一个传感器数据可以同时发送给另一台服务器，或者另一个应用程序。当然 MQTT 最令人兴奋的还是消息传递的 QoS 保证（下简称 QoS），实际做过工程的都知道，消息传递失败是一个非常痛苦并且处理起来也非常麻烦的事情，而 MQTT 在协议层面就提供了三种 QoS: 最多一次、至少一次、精准一次 (Exactly once) 。而这三种 QoS 实际实现起来也非常简单，这部分内容我会在后面的章节中进行简述。核心工作原理以及配置MQTT 的核心工作模式是“发布-订阅”模式，一般采用该模式的架构都会有一个类似于消息总线、消息队列或者消息代理的组件存在，而发送消息和订阅消息的部分都被统称为客户端。 MQTT 也不例外， MQTT 的中间组件被称为 MQTT Broker ，下面这张图可以很好的阐述 MQTT 的整个工作架构。（图来自 EMQX 的文章《MQTT 协议快速入门 2025：基础知识和实用教程》）温度传感器作为客户端连接到 MQTT Broker，并通过发布操作将温度数据发布到一个特定主题（例如 Temperature）。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题（Temperature）的订阅者客户端。实际上可以看出来，只要一个设备或者程序实现了 MQTT 客户端的功能，那么它就可以被称为是一个 MQTT 客户端。这个客户端可以是一个库，也可以是一个单独的程序，甚至是一个嵌入式设备。发布-订阅模式MQTT 采用发布-订阅模式也就意味着客户端之间是对等的，且不同于客户端-服务端模式，双方没有直接关联。客户端之间发布消息和订阅消息都要基于一套额外的约定，就…

软件开发中的心智负担
type: item
date: 2025-03-14T11:32:00+08:00
description: 我常常喜欢将软件工程项目与土木工程项目视作相同的东西：客户是业主，领导是监理审计单位，产品经理是设计单位，开发是施工单位。互联网上的很多梗图都将开发团队视作上述三者的对立方，这和现实里的工程差不多，即施工单位在整个项目中属于“弱势群体”。当然，这并不是这篇文章讨论重点。本文实际上是以“施工”的角度出发，谈一谈软件工程项目中的一个难点——心智负担。什么是心智负担？简单来说心智负担是指完成一项工作所需要占用的大脑资源，包括但不限于你所拥有的知识、记忆力以及逻辑思维和数学能力。举个简单的例子，有一个100x100的抽屉的柜子，以及一个放着各种各样形状和各种大小的积木的篮子，然后依次给你一些纸条，上面有着许多的操作让你执行，执行完毕之后给你下一张。例如：从篮子里面选出3个小号蓝色圆柱形积木，其中的一号积木放到有红色的三角积木的柜子里面，如果有红色三角积木，则将其放在别处，二号积木放到空柜子，三号积木放到大号绿色方形积木往左数上方第三个柜子里面。完成后需要把所有柜子合上。把上一条指令中的一号小号蓝色圆柱形积木放到三号积木的右下方第五个柜子里。把柜子里面所有的拱形积木拿出来，并把柜子合上。把上一条指令中取出拱形积木的柜子里面放入紫色中号圆锥积木，并把柜子合上。......计算机的工作原理和工作内容大致也是如此：获得输入、执行操作、进行输出；从篮子里取出积木，按照条件找到对应的柜子，然后把积木放进去。但是如果把这个工作交给人脑来处理呢？一万个柜子，假设里面已经放了不少积木了，那么这些操作可能就变得非常复杂了，每一次操作我们可能需要记住上一次开合了哪些柜子，但注意，我这里使用的是“可能需要”，因此为可能之后的纸条上并不会让你用到之前你所记忆的柜子。但是因为你不知道到底需不需要，所以你还是必须记在脑子里。这就是心智负担的一种简单体现，当然，程序员所要面对的问题复杂度更高一些，并且所面对的并不是柜子和积木这类具象的东西，而是一堆抽象的根本不存在的1和0的信息。心智负担的另一个特点即它是动态的，可能一开始这份工作的心智负担并不算高，如果柜子一开始全部是空的，那么这些纸条上的操作都显得无比轻松。但是随着纸条越来越多，柜子里面的积木越来越多，你所需要记忆的在某个纸条中开合过的柜子越来越多，心智负担会逐步提升。超出心智负担会使得我们无法工作吗？就上面的例子来看，并不会，对于信息行业从业者来说也不会。但是这意味着你会花更多的时间，来处理一些本来就很简单的事情上——把上一个打开过的柜子找到，把里面的积木拿出来，把新的积木放进去。但是这些“愚笨的”解决问题的方法，会消费掉你有限的“脑力”，最终让你变得疲惫。这或许也是 AI 的意义吧。虽然它现阶段没法替代脑力劳动者，但是会释放更多的“脑力”，让劳动者更加轻松。如果你是非计算机技术人员，那么你的阅读大概也就到此为止了。因为接下来的内容将涉及到大量的专业术语。工具的心智负担现代软件开发离不开工具，毕竟不会有人从烧沙子开始编写计算机程序。软件开发工具由于工具的开发的需求、时代、人员水平等客观原因，不仅仅会在趁手与否有所不同，也会对使用工具的人造成不同的心智负担。下面是两个典型的例子：内存管理内存管理的心智负担主要出现在 C/C++ 这类需要手动管理内存的语言上，这类语言为了最大限度的去使用内存，将内存管理工作交付给了开发者决定。每一块内存有申请就必须有释放，假设是某个业务功能中临时申请的内存，则更有必要在业务功能结束后释放掉内存。如果没有正确释放，则会导致这块内存再之后可能再也用不了了，最终导致运算资源被浪费从而产生“内存泄漏”。那么我们简单的考虑，是不是只要在函数开头申请在末尾释放就可以了呢？对于简单的需求来说或许如此，但当你的业务需求变得复杂，又有多人一起参与其中，那么内存的释放可能就不一定是在末尾进行了。// The allocated data should be free outside void doSomething(char **input) { char *data = malloc(typeof(char) * 32); // The code you written // ... // ... *input = data; }当然，如果涉及到并发和数据竞争，那么内存管理的心智负担会更大。变量对于某些编程语言来说，变量也是一个会产生心智负担的东西，这主要出现在没有块作用域而且没有常量的语言中。通常来看似乎还好，但是当代码变得具有一定复杂度时，保证已经声明过的变量不会在各种分支和循环中不被修改，变成了一件非常难做到的事情。以 JavaScript 为例，JS 的 var 关键字变量是函数级作用域，并且这个关键字可以直接复写已经声明的变量。function doSomething() { var i …

Setup my Debian
type: item
date: 2024-08-22T21:42:00+08:00
description: I have a laptop - Thinkpad X1 Carbon 6th generation - with Intel Core i7-8550U, 16GiB RAM and 2K resolution display. It has the performance hardware and a incapable cooling system with only single one fans. After 6 years, the Microsoft Windows bring it terrible experience, the heavy heating make me feel so bad when I use it in the room without air-conditioning. To save this device, I choose to install a Linux on it.Why Debian?There has so many out-of-box Linux distributions with very good Desktop experience like Ubuntu, Fedora. But I finally chose Debian with the following reasons:Ubuntu is "Microsoft Windows (Linux Edition)", Canonical feeds user some features that a few user with non-good experiences.Fedora is good, easy to install and easy to use. Butthe servers I own are running on Debian. And there does not have a good enough rpm-based Linux distro, so I pass the Fedora.For decreasing the cost of learning, I chose Debian as my daily Linux distro.Fighting against the inconvenient networkI spent too many time on the installing Debian into the disk. The most problem is accessing the Debian security repository is bloody slow in China, the average download speed is 2-3KiB per sec and full installing will spend more than 24 hours. So the net-install with the small image is impossible choice.I use the "complete installation image" to install the necessary desktop environment without online package repository. Then I finally finish the installation after spending 4 hours.The problem of 2K resolutionBefore I chose Debian, I tried Fedora on my laptop. The default DE of Fedora workstation is GNOME, it does not have fractional scaling as default, everything is too big in the 200% scale on the 14-inch 2K screen. Then I enable the fractional scaling through the complicated configuring, but the fractional scaling on GNOME is not good, web browser and some applications are blurry.After the bad experience with 2K resolution, I installed the KDE spin of Fedora. Everything is bet…

Setup my development environment
type: item
date: 2024-05-04T06:14:00+08:00
description: I have 5 devices could be called computer of my own: 3 desktops, 1 laptop and 1 MacBook. One of the desktops became my homelab server and NAS. 4 computers for me may be too more to use, but they can make sure anyone of them down, that I can still work.The motivation to write this article is I want to install Linux on my laptop recently. Its CPU - Intel 8th gen i7-8550U - with terrible efficiency-energy ratio, makes me have no any interesting to use it. Then I spent one week (after work) to install and configure Linux on it. The desktop environments of Linux are not good, even though Gnome and KDE can out-of-box, but I still need to configure more things to make them look great and use conveniently. I do not want to spend more time on it.I back to Windows, the familiar platform with a more complete DE. With Windows Subsystem for Linux (WSL), I also can developing on Linux environment.So I wrote this article, for recoding how I setup my development environment. If I have a new device or re-installing OS, I can recover my workspace quickly.Also, I hope this article can decide my choice of development and production environment.Step 1: Resolve the network problemThe network problem is a big obstacle in China for any programmer. So the first thing for setup is to resolve the problem. For some reasons, I could not provide the detail of it.Step 2: Enable WSL on Windows# Enable the feature of WSL and Virtual Machine Platform dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart# Upgrade WSL wsl --update# Install Debian distro wsl --install DebianStep 3: Install package manager, git and necessary toolsetOn Windows# 1. Allow execution for local script # 2. Install scoop Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression# Install git, it will also install the dependency o…