从硬件到软件的全栈折腾

引言

说出来你可能不信,我入坑技术这行,纯属是因为一块树莓派。大四那年,在室友桌上看到一块绿油油的小板子,上面插着散热片,还外接了个显示屏。当时我完全不知道这是啥,室友轻描淡写地说:“就是个小型电脑,可以跑Linux,还能控制GPIO。”就这一句话,彻底点燃了我的好奇心。

后来我发现,自己折腾的东西越来越杂:从焊电路板到写后端API,从刷固件到部署Docker容器,从买元器件到搭CI/CD流水线。朋友们都叫我“全栈工程师”,但我更愿意把自己叫“全栈折腾选手”。今天就把这几年踩过的坑、挖过的坑、填过的坑,跟大家好好唠唠。

第一阶段:硬件入门——从焊锡味道开始

真正让我入坑硬件的,是一块Arduino UNO。为什么要选Arduino?因为便宜啊!淘宝上三十多块钱一块,还送一堆线和小配件。想想看,三十块钱就能让你控制LED灯、驱动电机、读取传感器数据,这性价比还要啥自行车?

我的第一个项目是个简易温湿度监测。用的是DHT11传感器,加一个1602液晶显示屏,代码也就几十行。白天上课,晚上回宿舍焊电路、敲代码,折腾了整整一个礼拜。当看到液晶屏上终于显示出“温度: 25°C 湿度: 60%”的时候,那种成就感,比考试拿高分还爽。

#include <dht.h>

#include<LiquidCrystal.h>

dht DHT;

#define DHT11_PIN 7

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){

lcd.begin(16, 2);

lcd.print("Temp & Humidity");

}

void loop(){

int chk = DHT.read11(DHT11_PIN);

lcd.setCursor(0, 1);

lcd.print("T:");

lcd.print(DHT.temperature);

lcd.print("C H:");

lcd.print(DHT.humidity);

lcd.print("%");

delay(2000);

}

后来就开始不满足了。Arduino虽然好玩,但性能太弱,玩个图像处理都卡成PPT。于是我把魔爪伸向了树莓派。这玩意儿就是个小型Linux主机,4核CPU、4GB内存,还能跑完整的Python环境,瞬间打开了新世界的大门。

第二阶段:嵌入式Linux——在树莓派上跑服务

有了树莓派,我开始尝试在ARM架构上跑各种服务。第一个尝试的就是Home Assistant——一个开源的智能家居平台。

装系统、配置WiFi、安装依赖、启动服务,这一套流程走下来,我对Linux命令行的熟练度直接提升了好几个档次。什么systemctlapt-getpip install,玩得越来越溜。

后来干脆在树莓派上搭了个小型NAS。用的是一块外接的2TB硬盘,通过Samba共享文件夹。这样宿舍里四个人都能往里存电影、存资料,别提多方便了。

# 安装Samba

sudo apt-get update

sudo apt-get install samba samba-common-bin

配置smb.conf

[share]

comment = Raspberry Pi NAS

path = /home/pi/shared

writable = yes

guest ok = yes

create mask = 0777

directory mask = 0777

再后来,玩起了Docker。在树莓派上跑Docker容器,简直是懒人福音。一个docker-compose up下去,Nextcloud、Pi-hole、Portainer全都起来了,一个小小的卡片电脑瞬间变成家庭数据中心。你说这不比买成品NAS香?

第三阶段:后端开发——从嵌入式到服务器

玩硬件久了,总会想:能不能让自己写的东西被更多人用到?于是开始学后端开发。

Python是首选,谁让它生态好、门槛低呢。先是Flask,写了几个小项目练手,后来觉得不过瘾,转战Django。Django自带的ORM、管理后台、用户认证,用起来确实省心。

第一个正经做的项目是个简单的博客系统。功能很朴素:注册登录、写文章、评论、点赞。但从需求分析、数据库设计、API实现,到前端页面调接口,前后端联调,这一套流程走下来,对“全栈”有了更深的理解。

# Django REST Framework 写的文章列表API

from rest_framework import generics

from .models import Article

from .serializers import ArticleSerializer

class ArticleList(generics.ListCreateAPIView):

queryset = Article.objects.all()

serializer_class = ArticleSerializer

def perform_create(self, serializer):

serializer.save(author=self.request.user)

再后来学了Go。起初是被它的并发模型吸引Goroutine写起来是真的爽。后来用Go重写了博客的后端,性能提升了不是一星半点。现在我的个人网站前后端都是自己写的,部署在阿里云的学生机上,每个月9块钱,穷学生也能玩得起的。

第四阶段:前端与DevOps——自己动手,丰衣足食

前端我是真的菜。CSS写得稀烂,JavaScript也是半吊子。但架不住项目需要啊,硬着头皮学Vue。还好有Element UI这种组件库,套一套、改一改,倒也能看。

最头疼的是响应式布局。移动端、桌面端、平板,每种屏幕都要适配,那段时间头发掉了不少。后来学乖了,直接用Tailwind CSS,utility-first的写法虽然一开始不习惯,但写多了是真香。

DevOps这块 тоже折腾了不少。CI/CD流水线用GitHub Actions,自动化测试、构建、部署,一条龙服务。服务器用Nginx反向代理,HTTPSLet's Encrypt免费证书,域名DNS解析到阿里云。虽说都是些基础操作,但自己搭建一遍,踩踩坑,收获比看十篇教程都大。

结尾:折腾才是最好的学习方式

回顾这几年的折腾历程,从三十块的Arduino到几百块的树莓派,从几行的Python脚本到完整的前后端项目,从只会ls命令到能自己搭一套CI/CD,我走的每一步都是“折腾”两个字。

有人问我:你搞这么多不累吗?累啊,当然累。但当你看到自己写的代码在服务器上跑着,自己做的硬件项目正常工作,那种满足感是无法替代的。

我的建议是:别管什么“科班出身”、“专业对口”,想学什么就去折腾。硬件好玩,那就买来玩;代码有意思,那就写起来。技术这东西,动手永远比只看强。

最后送大家一句话:别怕折腾,折腾着折腾着就成了。