加班内卷的IT行业,我选择躺平:用实战项目找回编程初心

爬虫不想爬
2025-12-19 02:49
阅读 1931

大家好,我是小林,一名985毕业的全栈工程师,也是掘金上写过几十篇入门教程的老讲师。今天这篇教程有点不一样——它不讲“如何卷赢别人”,而是想和你聊聊:在加班成常态、内卷成风气的IT行业,如何通过做有意义的小项目,找回对技术的热爱,实现“清醒躺平”

我当初学编程时,也经历过每天加班到凌晨、周末被紧急需求打断的阶段。但后来我发现:真正的技术成长,不在于工时长短,而在于是否亲手做出能解决问题的作品。于是,我开始用业余时间做小而美的实战项目,比如今天要带你一起做的这个——一个基于区块链思想的“工作量证明”后端服务(别担心,不需要懂加密货币!)。

这篇文章会手把手教你搭建一个极简后端项目,融入区块链的核心理念(去中心化、不可篡改),全程代码清晰、逻辑简单,零基础也能跟着敲。你会发现:写代码不是为了应付老板,而是为了创造价值


一、我们要做什么?一个“反内卷”小项目

项目目标:开发一个简单的 RESTful API 后端服务,记录每日“有效工作时间”(比如专注编码2小时),并通过类似区块链的机制保证数据一旦提交就无法被篡改。

听起来很高大上?其实核心就两点:

  1. 用 Node.js 写个后端接口
  2. 模拟区块链的“链式结构”存储数据

为什么选这个项目?

  • ✅ 不涉及复杂密码学,只用哈希函数
  • ✅ 全程本地运行,无需部署服务器
  • ✅ 代码不到100行,适合新手
  • ✅ 理解后可扩展为个人时间管理工具

二、环境准备:5分钟搭好开发环境

我们只需要安装两个工具:

工具 作用 安装方式
Node.js 运行 JavaScript 后端代码 官网下载 LTS 版
VS Code 代码编辑器(推荐) 官网下载

验证安装

打开终端(Mac/Linux 用 Terminal,Windows 用 PowerShell 或 CMD),输入:

node -v  # 应显示 v18.x 或更高
npm -v   # 应显示 8.x 或更高

初始化项目

在你想存放代码的文件夹中执行:

mkdir anti-burnout-blockchain
cd anti-burnout-blockchain
npm init -y
npm install express crypto-js
  • express:轻量级 Node.js 后端框架
  • crypto-js:提供哈希函数(如 SHA256)

三、核心概念:用大白话讲“区块链”

很多教程一上来就讲“去中心化”“共识机制”,把新手吓跑。其实区块链最核心的思想就一条:

每个新数据块,都包含前一个块的“指纹”(哈希值),形成链条。改任意一块,后面所有块都会失效。

类比理解

想象你有一本手账:

  • 第1页写:“今天专注编码2小时”
  • 第2页写:“昨天那页的指纹是 ABC123 + 今天专注1.5小时”
  • 第3页写:“昨天那页的指纹是 XYZ789 + 今天摸鱼0.5小时”

如果你偷偷把第1页改成“今天专注5小时”,那么第2页记录的“ABC123”就对不上了,整本手账作废!

关键术语解释

术语 通俗解释 本项目中的体现
区块(Block) 一页手账 一个包含时间、描述、前区块哈希的对象
哈希(Hash) 数据的唯一指纹 用 SHA256 生成字符串
链(Chain) 手账本 数组,按顺序存所有区块

四、实战项目:一步步写代码

步骤1:创建基础后端服务

新建文件 server.js,粘贴以下代码:

// server.js
const express = require('express');
const app = express();
app.use(express.json()); // 解析 JSON 请求体

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`✅ 服务启动成功!访问 http://localhost:${PORT}`);
});

运行:

node server.js

看到 ✅ 提示即成功。

步骤2:定义区块结构

server.js 顶部添加:

const CryptoJS = require('crypto-js');

// 创建新区块
function createBlock(data, previousHash) {
  const timestamp = new Date().toISOString();
  const hash = CryptoJS.SHA256(timestamp + data + previousHash).toString();
  
  return {
    timestamp,
    data,          // 例如:"专注编码2小时"
    previousHash,  // 上一个区块的哈希
    hash           // 当前区块的哈希
  };
}

步骤3:初始化区块链

createBlock 下方添加:

// 创世区块(第一个区块)
const genesisBlock = createBlock("创世区块:拒绝无效加班!", "0");

// 区块链数组
let blockchain = [genesisBlock];

步骤4:添加 API 接口

app.listen 前添加两个路由:

// GET /chain - 查看所有记录
app.get('/chain', (req, res) => {
  res.json(blockchain);
});

// POST /add - 添加新记录
app.post('/add', (req, res) => {
  const { data } = req.body; // 从请求体获取 data
  
  if (!data) {
    return res.status(400).json({ error: "请提供 data 字段" });
  }

  const lastBlock = blockchain[blockchain.length - 1];
  const newBlock = createBlock(data, lastBlock.hash);
  blockchain.push(newBlock);
  
  res.json({ message: "✅ 记录成功!拒绝内卷,从记录真实工作开始", block: newBlock });
});

完整代码

// server.js
const express = require('express');
const CryptoJS = require('crypto-js');

const app = express();
app.use(express.json());

// 创建区块
function createBlock(data, previousHash) {
  const timestamp = new Date().toISOString();
  const hash = CryptoJS.SHA256(timestamp + data + previousHash).toString();
  return { timestamp, data, previousHash, hash };
}

// 初始化区块链
const genesisBlock = createBlock("创世区块:拒绝无效加班!", "0");
let blockchain = [genesisBlock];

// API 路由
app.get('/chain', (req, res) => {
  res.json(blockchain);
});

app.post('/add', (req, res) => {
  const { data } = req.body;
  if (!data) {
    return res.status(400).json({ error: "请提供 data 字段" });
  }
  const lastBlock = blockchain[blockchain.length - 1];
  const newBlock = createBlock(data, lastBlock.hash);
  blockchain.push(newBlock);
  res.json({ message: "✅ 记录成功!拒绝内卷,从记录真实工作开始", block: newBlock });
});

// 启动服务
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`✅ 服务启动成功!访问 http://localhost:${PORT}`);
});

五、测试你的“反内卷”系统

测试1:查看初始链

浏览器访问 http://localhost:3000/chain,你会看到创世区块。

测试2:添加新记录

用 curl 或 Postman 发送 POST 请求:

curl -X POST http://localhost:3000/add \
  -H "Content-Type: application/json" \
  -d '{"data": "今日专注编码3小时,拒绝会议轰炸"}'

返回结果应包含新生成的区块,其 previousHash 等于创世区块的 hash

验证“不可篡改”

尝试手动修改 blockchain 数组中某个区块的 data,再访问 /chain —— 虽然数据变了,但后续区块的 previousHash 仍指向旧哈希,系统使用者一眼就能发现异常!

💡 这就是区块链防篡改的核心:不是不能改,而是改了会被立刻发现。


六、新手常见问题解答

Q1:这真的算区块链吗?

A:这是简化版教学模型,省略了 P2P 网络、挖矿等复杂机制,但保留了“链式+哈希”的核心思想。正如学开车先从模拟器开始,理解原理比追求“正宗”更重要。

Q2:数据存在内存里,重启就没了怎么办?

A:完全正确!生产环境需持久化存储(如 SQLite、MongoDB)。但作为入门项目,内存存储让你专注理解逻辑。下一步可尝试加数据库。

Q3:SHA256 是什么?安全吗?

A:SHA256 是一种哈希算法,输入任意文本,输出固定长度的“指纹”。它具备雪崩效应(改1个字符,哈希大变),适合教学。真实区块链还需考虑更多安全因素。

Q4:我能用这个记录什么?

A:任何你想“诚实记录”的事情:

  • “今日深度工作2小时”
  • “拒绝无意义加班,准时下班”
  • “学习新技术1小时”

重点不是技术多酷,而是你开始关注自己的真实产出


七、学习建议:躺平≠放弃,而是高效成长

我当初学的时候,也曾以为必须熬夜刷题、接外包才能进步。后来才明白:可持续的学习节奏,远胜于透支健康的冲刺

给你的三个建议:

  1. 每天30分钟实战 > 每周突击8小时
    像今天这样,做一个小功能,跑通、理解、改进。

  2. 用项目驱动学习
    想学后端?就做个 API;想学前端?给这个项目加个网页界面。

  3. 保护自己的精力
    技术是工具,不是枷锁。学会说“不”,把时间留给真正重要的事。

下一步可探索方向:

方向 学习内容 推荐资源
数据持久化 将区块链存入 SQLite better-sqlite3 库文档
前端展示 用 Vue/React 显示链 Vue 官方教程
真实区块链 了解 Ethereum 开发 CryptoZombies 互动教程

结语:你的代码,值得为热爱而写

在这个鼓吹“狼性文化”的时代,选择“躺平”不是消极,而是清醒地把精力用在刀刃上。通过今天这个小项目,你不仅学会了后端开发、理解了区块链思想,更重要的是——你开始用技术为自己发声

记住:优秀的程序员,不在于写了多少行代码,而在于解决了多少真实问题

下次当你被无意义的需求压得喘不过气时,不妨打开这个小项目,加一条记录:“此刻,我选择专注自己”。

代码已开源在 GitHub(可自行创建),欢迎 fork、修改、分享。我是小林,我们下篇教程见!

附:完整项目目录结构

anti-burnout-blockchain/
├── package.json
└── server.js

评论 0

最热最新
暂无评论
爬虫不想爬Lv.1
0
影响力
0
文章
0
粉丝