从硬件到软件的全栈折腾
引言
说出来你可能不信,我入坑技术这行,纯属是因为一块树莓派。大四那年,在室友桌上看到一块绿油油的小板子,上面插着散热片,还外接了个显示屏。当时我完全不知道这是啥,室友轻描淡写地说:“就是个小型电脑,可以跑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命令行的熟练度直接提升了好几个档次。什么systemctl、apt-get、pip 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,我走的每一步都是“折腾”两个字。
有人问我:你搞这么多不累吗?累啊,当然累。但当你看到自己写的代码在服务器上跑着,自己做的硬件项目正常工作,那种满足感是无法替代的。
我的建议是:别管什么“科班出身”、“专业对口”,想学什么就去折腾。硬件好玩,那就买来玩;代码有意思,那就写起来。技术这东西,动手永远比只看强。
最后送大家一句话:别怕折腾,折腾着折腾着就成了。
从硬件到软件的全栈折腾
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法