程序员与工匠精神

2023-05-16

前几天和一个朋友聊天时说:我有强迫症,每次看到不符合自己审美的代码时,总想重构一下。朋友的观点与大多数人相仿,程序只要满足要求,运行正确就可以。
在现实的工作中一样,每当看到一段优美且高效的代码,我总是喜欢多看几遍,满心的享受。但是我们产品中的太多代码让我这个代码洁癖“患者”看了非常的烦躁:
1. 随便一个源文件都是上百行的函数,有些甚至超过500行(含空行和注释)。
2. 大量没有必要的临时变量定义。
3. 习惯性的把所有变量声明定义放到函数前面,一些大函数甚至超过20行都是函数局部变量的声明和定义。想想看,在第一个异常检查之后程序返回,而前面定义的十几个变量变得毫无价值。
4. 功能相仿的重复代码。
诸如此类的代码问题,给程序维护带来无尽的风险,而大多数技术管理者却认为代码重构根本毫无必要,甚至很多人认为只要设计文档写好,代码符合文档要求,顺利通过公司的各种质量评审,这段代码就最好不要动。要命的是,很多大型软件,很多团队共同开发,团队A要在团队B开发的代码中修改,为了省事,根本不考虑重构,甚至函数都不愿意增加一个,任由代码行数累加。
哎,如果我是一个技术管理者,我希望可以把敏捷中对于代码质量的要求贯彻和执行。程序开发者应该把自己看做一个追求极致的工匠,而不是一个累代码的民工。
之前完整的看了老罗的手机发布会,他最后一句话:我不是为了输赢,我就是认真。我当时真的打心底里感动,不管老罗的这次创业能否颠覆国内的手机市场,仅凭他的工匠精神,衷心的祝福他和他的公司取得成功,工匠精神配得上一次成功。
为了说明这个问题,我用一段代码重构结束这篇牢骚。
原代码:
http://www.cplusplus.com/reference/cstdarg/va_arg/?kw=va_arg
/* va_arg example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
int FindMax (int n, ...)
{
  int i,val,largest;
  va_list vl;
  va_start(vl,n);
  largest=va_arg(vl,int);
  for (i=1;i<n;i++)
  {
    val=va_arg(vl,int);
    largest=(largest>val)?largest:val;
  }
  va_end(vl);
  return largest;
}
int main ()
{
  int m;
  m= FindMax (7,702,422,631,834,892,104,772);
  printf ("The largest value is: %d\n",m);
  return 0;
}

这里并不是说原来的代码不好,仅仅是为了做说明之用。
有些重构并不一定可以减少总体的代码行数,但是可以改善代码的可读性和可重用性。假设上面的代码时作为API接口,具体的实现函数声明为static,仅仅对外开放FindMax函数声明。代码的开放封闭原则,应该在最初编码的时候有一个清晰和严格的标准。
重构后的代码:
//findMax.h
#ifndef _FIND_MAX_H_
#define _FIND_MAX_H_
int FindMax (int n, ...);
#endif
//findMax.cpp
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
#include <iostream>
#include "findMax.h"
using namespace std;
static int getTheLargest(va_list vl, int n)
{
    int val;
    int largest =0;
   
    for (int i=0;i<n;i++)
    {
        val=va_arg(vl,int);
        largest=(largest>val)?largest:val;
    }
    va_end(vl);
    return largest;
}
int FindMax (int n, ...)
{
    va_list vl;
    va_start(vl,n);
    return getTheLargest(vl, n);
}
//va_list_example.cpp
#include <stdio.h> /* printf */
#include <stdlib.h>
#include "findMax.h"
int main()
{
    printf ("The largest value is: %d\n",FindMax (7, 702,822,631,834,892,104,772));
    system("PAUSE");
}
控制台输出:
The largest value is: 892
Press any key to continue . . .
PS:
最近两个月一直没有更新博客,一方面工作确实太忙,另一方面花了很多时间在做个人的微信工作号:瑜伽分享汇。希望喜欢瑜伽的朋友们,可以关注。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员与工匠精神 的相关文章

  • Orange's TTY

    一 TYY任务本质就是增加了一个进程 xff0c 并且运行在ring1 xff0c 且优先级调高了 并且设置了键盘中断用于接收键盘输入 xff0c 并将扫描码存放在缓冲区 task tyy也就是新加入的进程 xff0c 循环执行读写缓冲区
  • C语言指针强制类型转换

    一 举例说明 上图 对应函数调用为int printf const char fmt xff0c fmt为char 指针类型 xff0c 所以共占了32位字节 xff0c 但是 fmt执行的是一个字节 xff0c fmt 43 43 执行的
  • vimdiff 使用笔记

    vimdiff 是建立在 diff 命令之上的 启动方法 xff1a vimdiff file left file right 或者 vim d file left file right 只在某一文件中存在的行的背景色被设置为蓝色 xff0
  • Orange's 进程间通信

    新增一个系统进程 xff0c 和TESTA进行通信 xff0c 通信的流程是这样的 xff0c 如果首先执行到系统进程 xff0c 发送消息 xff0c 那么会触发内中断到ring0级 xff0c 完成发送所需要的动作 xff0c 之后回到
  • CDH启动tserver报错:java.lang.IllegalStateException: Multiple processes with same name

    现象 在CDH界面上重启kudu tserver时界面报错 xff1a 原因 1 首先查看cloudera scm agent的日志cm log cloudera scm agent supervisord log xff0c 看到 xff
  • 【FastRTPS】RTPS协议简介、创建第一个应用

    RTPS协议简介 Domain xff08 域 xff09 xff1a 定义了一个独立的通信平面 xff0c 多个域是同时独立存在的 域包含了多个Participant和发送接收数据的元素 Participant xff08 参与者 xff
  • putty time out超时

    解决方案 xff1a 关键是虚拟机网络 设置为桥接模式
  • Intel Realsense Tracking Camera T265上手测试与总结

    首先在官网 https www intelrealsense com zh hans get started tracking camera 上认真阅读使用教程 xff0c 让自己对 Realsense T265相机有一个初步的认识 了解过
  • C++ 标准模板库(STL)——迭代器、迭代器类型以及序列式,关联容器迭代器失效问题(iterator)

    迭代器iterator 迭代器iterator1 定义2 iterator中typedef的型别 xff08 iter traits xff09 3 iterator的五种类型3 1 Output iteator xff08 只写 xff0
  • 关于x11vnc在ubuntu14.04服务器版上开启远程桌面的使用(作为自己备忘)

    先上一个最后的结果图 xff08 配了好几个小时 xff0c 到处找资料 xff09 如题 xff0c 仅仅作为自己的一个备忘 xff0c 如果能顺便帮助到你 xff0c 我将非常开心 xff01 主要目的 xff1a 利用命令行开启远程服
  • 2021CVPR-Cross Modal Focal Loss for RGBD Face Anti-Spoofing

    用于RGBD人脸反欺骗的交叉模式焦损 摘要 xff1a 自动检测呈现攻击的方法对于确保面部识别技术的可靠使用至关重要 文献中提供的大多数用于呈现攻击检测 PAD 的方法都无法将其推广到看不见的攻击 近年来 xff0c 人们提出了多通道方法来
  • 带你走进EJB--EJB和Spring对比

    通过对 EJB 系列的总结和学习我们已经对 EJB 有了基本的了解 但是为了更进一步的去深入学习 EJB 我们很有必要将它拿出来跟之前非常熟悉的 Spring 进行一下对比 通过对比来了解这两个内容的相同与不同之处 更有利于我们对两者进行深
  • Dubbo之旅--Provider示例

    在本篇文章中我们将通过集体的示例来对 Dubbo 的提供和消费进行代码层面的认识 这里所介绍的是基本的提供者和消费者通过 Spring 容器来进行相关的提供和消费的服务 首先看整个示例的项目结构如下 我们通过 Maven 的方式来进行示例
  • 用EditPlus配置MASM汇编

    最开始写汇编程序 xff0c 是打开一个记事本就写 但是记事本不是专门的程序编辑器 xff0c 格式不好控制 xff0c 更容易写错程序 于是想到 xff0c 能有一个简单的文本编辑器 xff0c 能控制好ASM的格式 xff0c 有关键字
  • Dubbo之旅--问题汇总

    在工作和学习的过程中 具体运用 Dubbo 的时候遇到了很多的问题 这些问题一方面让自己进一步了解所谓的 dubbo 另一方面通过对它们的总结和分析能够在工作中加倍的提高效率 接下来将会对遇到的和别人总结的一些常见的问题进行汇总 1 增加提
  • Dubbo之旅--集群容错和负载均衡

    当我们的系统中用到 Dubbo 的集群环境 因为各种原因在集群调用失败时 xff0c Dubbo提供了多种容错方案 xff0c 缺省为failover重试 Dubbo 的集群容错在这里想说说他是因为我们实际的项目中出现了此类的问题 因为依赖
  • 我和敏捷开发的故事--敏捷角色-SM

    通过上篇文章我们已经知道了敏捷角色中 PO 的角色内容 接下来的一个敏捷角色在敏捷开发中非常关键 但是往往很多项目实践中都没有很好的把控好这个角色 让他或多或少的没有起到相应的作用 这个角色就是 ScrumMaster Scrum Mast
  • backup

    backup
  • backup

    backup
  • backup

    xfeff xfeff backup

随机推荐

  • 工程硕士考试复习小结

    工程硕士考试复习到现在已经接近尾声 后天就要奔赴省城石家庄赶考了 整个工程硕士的复习过程从十月初开始到现在将近一个月的时间 对所需要进行考试的科目进行整体复习 复习的形式前阶段主要是视频讲解中间阶段是看相应的文档和知识点 最后就是进行专项练
  • 我的2011----再见2011!你好2012!

    今天本来是 特别平常的一天 但是因为位置排在了 2011 年的最后 平常也就变得不平常了 一年就在这么转眼即逝中度过了 虽说一年比较短暂 但是回头在看看自己所拥有的这一年 留下的很多 在 2011 我把 ShortBrain 英语进行着 英
  • 中国的教育我们每个人都有责任

    这篇文章将我带入了深深的思考之中 给将要进入大学的你们 xff1a 一个已毕业两年的学长的人生感慨 xff01 面对中国的教育现状 很多的学生 老师 甚至校长 采取的态度是接受 所做的行动是适应和顺从 非常钦佩作者有着自己独立的思想 思想者
  • Eclipse下启动tomcat报错:/bin/bootstrap.jar which is referenced by the classpath, does not exist.

    1 错误 xff1a 在 Eclipse 下启动 tomcat 的时候 xff0c 报错为 xff1a Eclipse 下启动 tomcat 报错 xff1a The archive C Program Files x86 Java jdk
  • Java文件名及其他命名规则

    http bbs csdn net topics 70157841 关于JAVA 源文件命名的问题 Java文件命名 xff1a java程序是由类组成的 xff1b java应用程序必须有一个包含main方法的public类 xff0c
  • (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程

    变分自编码器 xff08 Variational Autoencoder VAE xff09 通俗教程 转载自 http www dengfanxin cn p 61 334 amp sukey 61 72885186ae5c357d85d
  • docker 镜像导入导出 删除 改名

    镜像的导入与导出 假如有2台主机 xff0c 我们在主机1上做了一个镜像 xff0c 主机2想用这个镜像怎么办呢 xff1f 我们可以在主机1上push镜像到镜像仓库中 xff0c 然后在主机2上pull把镜像拉下来使用 xff0c 这种方
  • 面试后HR让你等通知的真相

    面试后 xff0c 被HR告知 回去等通知 是大多数求职者会遇到的情况 前程无忧论坛曾经有过的调查显示 xff0c 在众多面试答复中 xff0c 求职者最痛恨的就是这个答复 求职者心声 xff1a 要还是不要 xff0c 给个痛快 xff0
  • 女程序员过三奔四,你的名字是迷茫???/孩子是我幸福的源泉

    Leo 博客 周一 周五固定更新 我的邮箱 xff1a Careerdesign 64 foxmail com 上次讲的是我的博客点击过百万 xff0c 写了 假如生活欺骗了你 今天说说 xff0c 过三奔四的女程序员的职业规划 Leo 您
  • QT 开发---QGroundControl地面站V2.6--环境搭建(详解)

    QT 开发 QGroundControl 地面站 环境搭建 xff08 文档更新日期 xff1a 2018 05 10 xff09 1 镜像下载 QT5 4 0 首先找到中国科学技术大学镜像网址 xff1a http mirrors ust
  • 基于STM32的FreeRTOS实时操作系统1

    本开发是基于STM32CUBEIDE1 4 0 与STM32CUBEMX相同FreeRTOS的组件在 xff1a 在Interface中选择CMSIS V1 选择这个界面适合STM32的开发 xff0c 接下来选择合适的任务进行设置 对与这
  • 免费方案:Kibana 监控 windows server 服务器系统资源,内网穿透

    kibana 监控服务器 目录预览 1 需求说明 1 1 工具选择 2 metricbeat工具介绍 3 安装部署 3 1 下载 3 2 配置 3 3 安装 3 4 启动 4 验证 5 性能 6 维护 7 Troubleshooting 一
  • MAC OS X10.9.5下成功驱动独立显卡"影驰Nvidia GeForce GTX 760大将(4GB)--非公版"

    我的机器是台式机 自己组装的 xff0c 硬件参数如下 xff1a 操作系统 Windows 7 旗舰版 64位 SP1 DirectX 11 处理器 英特尔 Core i7 4770K 64 3 50GHz 四核 主板 华硕 Z87 PR
  • 结构体继承自结构体

    C 43 43 Code 功能 xff1a 结构体继承自结构体 结论 xff1a 1 结构体可以继承自结构体 2 结构体同样有构造函数和析构函数 include lt iostream gt using namespace std stru
  • 【STM32L4】FreeRTOS消息队列三串口接收发送

    环境 STM32L476G DISCO 开发板STM32CubeIDE 1 1 0STM32CubeMX 5 4 0 STM32CubeIDE配置 移植FreeRTOS xff0c 选择CMSIS V2 FreeRTOS的所有配置的选择默认
  • OpenCV如何获取视频当前的一帧图像

    xff08 OpenCV读取视频 OpenCV提取视频每一帧 每一帧图片合成新的AVI视频 xff09 CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture cap IplImage cvQuery
  • 无人机、无人车仿真器AirSim中激光雷达Lidar设置

    1 在车辆或无人机中激活激光雷达 默认情况下 xff0c 激光雷达是不开启的 xff0c 如果需要开启激光雷达 xff0c 则需要在settings jason文件中进行激活 xff0c settings jason 文件位于 Docume
  • 软件项目产品化之路

    软件项目产品化之路 2 产品化之路 2 1 困惑 软件项目产品化是大量软件企业 xff0c 特别是应用型软件研发企业所必须面临的问题 不论是小型的软件公司和中大型的软件企业 xff0c 在面对软件项目和软件产品 xff0c 都有诸多困惑 到
  • 软件产品化的一些见解

    软件产品化的定义 软件产品化 即客户无需为软件添加或调整代码和语句即能完成软件的安装配置 应用初始化 系统管理 用户使用的全过程 并且软件至少能满足80 以上的用户某一组应用需求 软件产品化只是完成了产品的生产环节 后面的产品销售 市场推广
  • 程序员与工匠精神

    前几天和一个朋友聊天时说 xff1a 我有强迫症 xff0c 每次看到不符合自己审美的代码时 xff0c 总想重构一下 朋友的观点与大多数人相仿 xff0c 程序只要满足要求 xff0c 运行正确就可以 在现实的工作中一样 xff0c 每当