当前位置: 首页 > news >正文

撸代码时,有哪些习惯一定要坚持?

我从2011年开始做单片机开发,一直保持以下撸代码的习惯。

1.做好代码版本管理

有些人,喜欢一个程序干到底,直到实现全部的产品功能,我以前做51单片机的项目就是这样。

如果功能比较多的产品,我不建议这样做,迟早有一天,有一个项目,会让你崩溃的,特别是还不具备模块化编程能力的时候

之前我就踩过几次这种坑,一个程序版本实现了很多个功能,后面新增功能的时候,突然发现了一个BUG,怎么都调不出来。

这时候,如果有上一个版本,可以用上一个版本的代码,一点点代码复制过去看看,到底是哪个代码造成的。

从那次以后,我就养成了做代码版本管理的习惯,比如V1.0,V1.1,V1.2.....

然后每个程序版本里面,我都会写一个文档,描述下历史版本实现的功能记录,以防后面忘了。

2.多学习优秀的代码和思维

刚工作那会,主要用STC的51单片机做项目,主要维护之前工程师遗留的代码,升级产品功能为主,基本是一堆屎山代码,实现功能就行了。

不会考虑怎么把代码写得更好,主要是自己当时也没那能力,项目又急,能改出来应付工作就不错了,有时项目急,我逻辑又理不清,甚至用了goto语句走了捷径,可能很多人都没见过。

工作了几年,一直是维持在这种水平,没有提升,因为接触不到更复杂的项目,接触不到好的编程思维和代码。

后面跳槽到一家公司,接收了一个网关项目,需要自己从0到1,完成整个项目的代码。

这个项目难度,已经超过了我的知识范围,主要有两个问题:

第一,很多功能没做过,不知道啥原理

第二,功能太多了,不知道怎么很好地把它们整合协调起来。

我是怎么解决这两个问题的呢?

第一个问题,最快的方式就是问同部门的研发同事。

不过不要指望别人会手把手教你,哪怕领导发话,别人也没这义务。

最关键的,不是指望让领导去给他下发命令,就能让他带你,而是看自己懂不懂得做人的。

举个例子:有些老铁来找我领单片机入门到高级的教程+工具包,我都是无套路直接发链接。

为什么要在我的朋友圈才发?

因为我是卖课佬,我觉得我们的项目课确实能帮到一些人,成就一些人,万一哪天你需要,我们又正好专业,各取所需共赢,我觉得没毛病。

但,我也深知,要让别人认可你,那就先贡献价值出来,所以我就不断输出自己经验和送粉丝教程+工具包了。

我感觉人和人之间,挺有意思,也差别挺大。

有些人很懂得感恩,还会给我发个小惊喜,收不收看我有没有给到他对应的价值了。

有些人,趾高气昂,理所当然,像我欠了他的一样。

我就想,怎么会有这种傻杯,然后拉黑了。

扯远了。

回到找同事帮忙的问题,也是同理,你得付出相应的价值,得请吃饭、得请喝奶茶、帮的忙多了得送礼....这不是潜规则,是对别人起码的尊重。

不能因为领导发话了,叫他去带你,你就能像个伸手党一样,一直索取他的价值,不信?你试试多问几个问题以后,看他鸟不鸟你。

第二个问题,功能太多了,不知道怎么很好地把它们整合协调起来。

这个其实最难,因为涉及到程序架构的问题,不是某个功能点,更多的是经验积累到一定程度后,再学习别人优秀的程序架构,突然开悟了。

我是参考别人工程师写的代码,一点点积累起来的,然后根据时间片轮询原理,设计了一个程序架构,我在2019年也录过这个程序架构的教程。

老规矩,有礼貌的粉丝,可以找我安排。

编程思维、高阶代码技巧、程序架构这些,如果能冲我们无际单片机项目特训营,系统把我们几个项目做完,那直接就是走捷径了,都是我们踩坑10年以上总结出来的精华。

3.重视模块化

我第一次重视程序模块化,项目代码量编译完大概70kb+。

什么是模块化?

举个例子,以下两段代码,分别是非模块化写法和模块化写法:

非模块化写法:

C
#include <reg51.h> // 假设是51单片机

void main() {
    //
硬件初始化
    P1 = 0xFF; // 设置P1口为输入
    IT0 = 1;    // 设置外部中断0为下降沿触发
    EX0 = 1;    // 使能外部中断0
    EA = 1;     // 开启全局中断

    // 主循环
    while(1) {
        //
功能实现
        if(P1_0 == 0) {
            P1 = ~P1; //
如果P1.0被按下,翻转P1口的状态
        }
    }
}

//
外部中断0服务程序
void exint0() interrupt 0 {
    //
中断处理
    P1 = P1 << 1; // 每次中断,将P1口的值左移一位
}

在这个例子中,硬件初始化、主循环和中断服务程序都混合在同一个.c文件中,阅读和维护起来会困难很多,特别是后期随着代码越来越多。

模块化写法:

C
// hardware.h
#ifndef HARDWARE_H
#define HARDWARE_H

void init_hardware();

#endif

// hardware.c
#include "hardware.h"

void init_hardware() {
    P1 = 0xFF; //
设置P1口为输入
    IT0 = 1;    // 设置外部中断0为下降沿触发
    EX0 = 1;    // 使能外部中断0
    EA = 1;     // 开启全局中断
}

// main.c
#include "hardware.h"
#include <reg51.h>

void main() {
    init_hardware(); // 初始化硬件

    while(1) {
        // 主循环功能实现
        if(P1_0 == 0) {
            P1 = ~P1; // 如果P1.0被按下,翻转P1口的状态
        }
    }
}

// exint0.c
#include <reg51.h>

// 外部中断0服务程序
void exint0() interrupt 0 {
    // 中断处理
    P1 = P1 << 1; // 每次中断,将P1口的值左移一位
}

在这个模块化的例子中,我们将硬件初始化放到了hardware.c和hardware.h中,主循环放在main.c中,而中断服务程序放在exint0.c中。这样,每个文件都有一个明确的作用,代码的结构更加清晰,也更好阅读和维护。

稍微复杂点的单片机项目,需要处理很多硬件接口和复杂的时序逻辑,还有各种产品业务逻辑组合,所以模块化尤其重要。

上面只是举了两个入门级模块化写法,高阶的模块化,远不止这些,首先是程序文件架构的模块化,分硬件层、中间层、应用层。

怎么实现多层之间依赖最少,这样后期万一需要更换单片机,只需要修改硬件层驱动代码就好了。

然后是里面每个功能模块化,怎么写方便后期增减功能。

这些其实都是系统的学问,所到之处全是细节,我们无际单片机特训营,都是通过这些思维和编程方式做的,特别是项目3和6。

提升这块的能力,主动学习意识和机遇都很重要,有些工程师做了4,5年,如果公司一直做简单的项目,那也是提升不了的,需要自己通过业余的时间,不断看别人代码摸索。

4.有条件,换个好点的椅子

撸代码的,长时间对电脑,经常一坐就是几个小时,好点的椅子能缓解颈椎、腰椎的疲劳。如果能换个立式办公桌就更好了。

5.不要做一个看完不点赞的冷漠青年

不知不觉,又写了两个多小时,原创不易,发财小手点起来...


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

相关文章:

撸代码时,有哪些习惯一定要坚持?

我从2011年开始做单片机开发&#xff0c;一直保持以下撸代码的习惯。 1.做好代码版本管理 有些人&#xff0c;喜欢一个程序干到底&#xff0c;直到实现全部的产品功能&#xff0c;我以前做51单片机的项目就是这样。 如果功能比较多的产品&#xff0c;我不建议这样做&#xff0…...

【leetcode面试经典150题】17.罗马数字转整数(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

前后端开发之——文章分类管理

原文地址&#xff1a;前后端开发之——文章分类管理 - Pleasure的博客 下面是正文内容&#xff1a; 前言 上回书说到 文章管理系统之添加文章分类。就是通过点击“新建文章分类”按钮从而在服务端数据库中增加一个文章分类。 对于文章分类这个对象&#xff0c;增删改查属于配…...

第12届蓝桥杯省赛 ---- C/C++ C组

文章目录 1. ASC2. 空间3. 卡片4. 相乘5. 路径6.时间显示7.最少砝码8. 杨辉三角形9. 左孩子右兄弟 第12届蓝桥杯省赛&#xff0c;C/C C组真题&#xff0c;第10题不是很清楚&#xff0c;题解不敢乱放&#x1f601;&#x1f601;&#x1f601; 1. ASC 额。。。。 #include <i…...

IVS模型解释

核心思路 【Implied volatility surface predictability: The case of commodity markets】 半参数化模型&#xff1a;利用各种参数(或者因子)对隐含波动率进行降维&#xff08;静态参数化因子模型&#xff09;&#xff0c;对参数化因子的时间序列进行间接的建模 基于非对称…...

通用开发技能系列:Git

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能Git进行学习 1.为什么使用版本控制系统 版本控制系统可以解决的问题 代码备份很重要版本控制很重要协同工作很重要责任追溯很重要 常见的版本控制系统 Gi…...

最新怎么订阅OnlyFans上喜欢的博主,详细教程

大家好&#xff0c;本文教大家如何用虚拟信用卡在 Onlyfans 订阅&#xff0c;链接在浏览器打开地址https://bewildcard.com/i/GPT310&#xff0c;虚拟卡开好之后&#xff0c;用支付宝充值就可以进行订阅OnlyFans平台的博主了。 什么是OnlyFans&#xff1f; OnlyFans 是一个提…...

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化&#xff1a; 2.数据库设计与规划 1.提前估计数据量&#xff0c;使用什么存储引擎 2.数据库服务器专机专用&#xff0c;避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器&#xff0c;以达到稳定、高效的效果。主从同步、…...

Windows系统C盘空间优化进阶:磁盘清理与Docker日志管理

Windows系统C盘空间优化进阶&#xff1a;磁盘清理与Docker日志管理 文章目录 Windows系统C盘空间优化进阶&#xff1a;磁盘清理与Docker日志管理磁盘清理工具 使用“运行”命令访问磁盘清理利用存储感知自动管理空间清理WinSxS文件夹结合手动清理策略 小结删除临时文件总结&…...

14届蓝桥杯 C/C++ B组 T7 子串简写 (字符串)

采用存储目标字符下标的方法&#xff0c;此题的想法比较新奇&#xff0c;故予以记录。 存好下标之后&#xff0c;可以先定位好启始的字符&#xff0c;然后去搜结尾字符符合长度k并且最靠近启始字符的下标&#xff0c;找到之后可以直接取到这个下标之后的所有下标&#xff0c;因…...

Android 系统大致启动流程

Android启动流程大体为&#xff1a;BootRom -> BootLoader -> Kernel -> Init -> Zygote -> SystemServer ->Launcher 1、Loader层 1.1、Boot ROM 电源按下&#xff0c;引导芯片代码开始从预定义的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0…...

【Web】2024红明谷CTF初赛个人wp(2/4)

目录 ezphp playground 时间原因只打了2个小时&#xff0c;出了2道&#xff0c;简单记录一下 ezphp 参考文章 PHP filter chains: file read from error-based oracle https://github.com/synacktiv/php_filter_chains_oracle_exploit 用上面的脚本爆出部分源码&#xff…...

stable-diffusion-webui安装教程

现在AI开始进入绘画领域,并且能自动根据文本来创建图片出来,这是一个划时代的进步。 这时候,我也不能落后,要紧跟上时代的步伐,那么也来学习一下stable-diffusion的使用,这样也算多一项对技术的认识,提高对AI的认知。 从网上看到很多stable-diffusion-webui的安装,其…...

如何魔改 diffusers 中的 pipelines

如何魔改 diffusers 中的 pipelines 整个 Stable Diffusion 及其 pipeline 长得就很适合 hack 的样子。不管是通过简单地调整采样过程中的一些参数&#xff0c;还是直接魔改 pipeline 内部甚至 UNet 内部的 Attention&#xff0c;都可以实现很多有趣的功能或采样生图结果。 本…...

解放办公室的利器!让证卡打印机轻松应对繁忙工作场景

在现代办公室中&#xff0c;证卡打印机已经成为不可或缺的工作利器。但是&#xff0c;在繁忙的工作场景中&#xff0c;我们经常忽视了它的保养和清洁。然而&#xff0c;正确的清洁和维护不仅可以延长打印机的寿命&#xff0c;还可以提高工作效率&#xff0c;确保每一次打印都是…...

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现&#xff1a; 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域&#xff0c;蜘蛛准备在这个区域&#xff08;或其一部分&#xff09;上结一张网。   问题一&#xff1a; 在区域的边界上安置有若干…...

ES学习日记(七)-------Kibana安装和简易使用

前言 首先明确一点&#xff0c;Kibana是一个软件&#xff0c;不是插件。 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic stack 成员之一&#xff0c;设计用于和Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索&#xff0c;…...

react 父子组件的渲染机制 | 优化手段

文章目录 父子组件的渲染机制优化手段与实践写法父组件&#xff1a;下发stateprops.children 传递无状态组件props传递组件 React.memo缓存子组件与useCallback结合 父子组件的渲染机制 渲染分初次渲染和重新渲染 React组件会在两种情况下发生重新渲染 当组件自身的state发生…...

elementPlus el-table动态列扩展及二维表格

1、循环列数据源&#xff0c;动态生成列 <template><div><el-table ref"table" :data"pageData.tableData" stripe style"width: 100%"><el-table-column v-for"column in pageData.columns" :key"column.p…...

vitepress系列-04-规整sideBar左侧菜单导航

规整左侧菜单导航 新建navConfig.ts 文件用来管理左侧导航菜单&#xff1a; 将于其他的配置分开&#xff0c;避免config.mts太大 在config目录下&#xff0c;新建 sidebarModules文件目录用来左侧导航菜单 按模块进行分类&#xff1a; 在config下新建sidebarConfig.ts文件&…...

golang slice总结

目录 概述 一、什么是slice 二、slice的声明 三、slice的初始化、创建 make方式创建 创建一个包含指定长度的切片 创建一个指定长度和容量的切片 创建一个空切片 创建一个长度和容量都为 0 的切片 new方式创建 短声明初始化切片 通过一个数组来创建切片 声明一个 …...

MySQL 数据库的优化

目录 一. 常见故障 单实例常见故障 1. 故障一 2. 故障二 3.故障三 4. 故障四 5. 故障五 6.故障六 7.故障七 8.故障八 主从环境常见故障 1.故障一 2. 故障二 3. 故障三 二. 优化 1.硬件方面 1.1 关于CPU 1.2 关于内存 1.3 关于磁盘 2. 配置文件优化 关于引擎…...

Redis 的主从复制、哨兵和cluster集群

目录 一. Redis 主从复制 1. 介绍 2. 作用 3. 流程 4. 搭建 Redis 主从复制 安装redis 修改 master 的Redis配置文件 修改 slave 的Redis配置文件 验证主从效果 二. Redis 哨兵模式 1. 介绍 2. 原理 3. 哨兵模式的作用 4. 工作流程 4.1 故障转移机制 4.2 主节…...

Unity进阶之路(2)UI Toolkit

UI Toolkit是Unity内置的一个游戏UI解决方案。借鉴了web前端的设计模式。 web前端使用css&#xff0c;html&#xff0c;js。 其中css定义样式 html定义层级 js处理逻辑 UI Toolkit则是使用uss&#xff0c;uxml&#xff0c;C# 如果直接使用Unity提供的可视化UI创建工具创建…...

实现Hello Qt 程序

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、使用 "按钮" 实现 1、纯代码方式实现 2、可视化操作实现 &#xff08;1&#xff09…...

若依 ruoyi-vue 接口挂载获取Resources静态资源文件权限校验

解决小程序图片打包过大&#xff0c;放置后端&#xff0c;不引用ngnix、minio等组件&#xff0c;还能进行权限校验 package com.huida.web.controller.common.app;import com.huida.common.core.controller.BaseController; import com.huida.common.utils.file.FileUtils; imp…...

【STM32嵌入式系统设计与开发】——16InputCapture(输入捕获应用)

这里写目录标题 STM32资料包&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码&#xff1a;8888 一、任务描述二、任务实施1、工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#…...

「论文阅读」还在手写Prompt,自动Prompt搜索超越人类水平

每周论文阅读笔记&#xff0c;来自于2023LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS code:https://github.com/keirp/automatic_prompt_engineer 手写prompt确实很费脑筋&#xff0c;但其实本身大语言模型就是一个很好的自动prompt工具&#xff0c;APE文章提出自…...

安全测试概述和用例设计

一、安全测试概述 定义&#xff1a;安全测试是在软件产品开发基本完成时&#xff0c;验证产品是否符合安全需求定义和产品质量标准的过程。 概念&#xff1a;安全测试是检查系统对非法侵入渗透的防范能力。 准则&#xff1a;理论上来讲&#xff0c;只要有足够的时间和资源&a…...

JavaScript 超详细学习思路

JavaScript 是一种轻量级的编程语言&#xff0c;它可以在网页中嵌入&#xff0c;用来实现网页的动态效果和用户交互功能。它是 Web 开发中不可或缺的一部分&#xff0c;与 HTML 和 CSS 并称为 Web 技术的三大基石。下面我会根据您的要求&#xff0c;对每个部分进行详细的讲解。…...

温州地区做网站/seo培训中心

云计算等技术极大地促进了服务器资源的分配和系统的部署&#xff0c;但随之而来的是资产管理中的安全风险。有些人没有及时回收资源和更新资产&#xff0c;在网上形成了僵尸主机&#xff0c;很容易成为攻击者的肉机。为有效保障企业工作的发展&#xff0c;相关法律法规明确要求…...

北京装饰网站建设/网络营销策略的定义

CentOS 5.5的内核版本是2.6.18-194.e15 GCC版本是4.1.2 (20080704) CentOS 5.5自带的boost 1.33&#xff0c;这个版本比较老了&#xff0c;几年前的版本。主要是&#xff0c;这个版本没有ASIO。所以决定重新编译一个boost。 首先去http://www.boost.org/下载一个最新的boost 1.…...

做网站应该会什么软件/刷粉网站推广马上刷

转&#xff1a;http://www.cnblogs.com/irelands/p/3433628.html 1、Touch事件简介pc上的web页面鼠 标会产生onmousedown、onmouseup、onmouseout、onmouseover、onmousemove的事件&#xff0c;但是在移动终端如 iphone、ipod Touch、ipad上的web页面触屏时会产生ontouchstart…...

公司网站建设价格低/哪些店铺适合交换友情链接

jenkins通过fir插件实现ipa的自动发包 上一篇文章讲了通过蒲公英发包 jenkinsXcode蒲公英实现ipa自动打包发布全攻略 http://www.jianshu.com/p/ed124917d6c6# 那么怎么发布到fir呢&#xff1f; 官方说明文档&#xff1a;http://fir.im/tools Paste_Image.png官方提供了一个jen…...

自己建网站做app/b站好看的纪录片免费

今天8:50-9:20由于程序问题&#xff0c;引起不能正常访问博客园&#xff0c;在此向大家表示歉意&#xff0c;请大家谅解&#xff01; 引起问题的原因&#xff1a;由于缓存的原因&#xff0c;目前服务器内存占用很大&#xff0c;超过了物理内存&#xff0c;昨天晚上改写了代码&a…...

joomla 2.5:你的网站建设_使用与管理 下载/全媒体广告代理

该话题的继续延伸主要就是 SQL 的语法了, 草草收场的原因是现在的脑筋已经进入了 IntraWeb 的世界.相关备忘会随时补充在下面://连接多个数据库的参考代码: FDConnection1.ExecSQL(ATTACH c:\hr.sdb AS hr); FDConnection1.ExecSQL(ATTACH c:\cust.sdb AS cust); FDQuery1.Open…...