惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs
博客园 - 叶小钗
P
Privacy International News Feed
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
IT之家
IT之家
博客园 - 聂微东
Know Your Adversary
Know Your Adversary
Help Net Security
Help Net Security
罗磊的独立博客
I
Intezer
S
Schneier on Security
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
Cisco Talos Blog
Cisco Talos Blog
宝玉的分享
宝玉的分享
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
P
Privacy & Cybersecurity Law Blog
T
The Exploit Database - CXSecurity.com
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest
H
Heimdal Security Blog
S
Secure Thoughts
Hacker News: Ask HN
Hacker News: Ask HN
Y
Y Combinator Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
SecWiki News
SecWiki News
The GitHub Blog
The GitHub Blog
A
Arctic Wolf
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
T
Threat Research - Cisco Blogs
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
关于增量式开发
2015-06-04 · via 夜行人

增量式开发是我最喜欢的开发方式之一。

##1 在读《The Django Book》时,十分震惊,技术书籍居然可以写得这般清晰,清晰如阳光照射下,清水中的鹅软石。技术类书籍中好书是向来不缺的,对新手友好的书却也并不多见。《The Django Book》算是其一,后来我再翻这本书,想它为何能把知识说得这般清晰,发现书中讲解知识的方式是增量式的:每次的讲解的内容都尽量做到只包含主题相关部分,基本不添加额外的知识干扰(打击)你,即便有些不可避免的后向引用,也会明确告诉你它的作用是啥,你目前只要把它当成黑盒就行。每一段程序都尽可能简易简短,每一节都在上一节基础上加上一点新东西,这样学起来真如读小说一般连贯有趣。如果哪里不懂,基本可以确定,不懂部分就是这节多出的知识。

##2 《代码大全》里,在谈论隐喻部分时作者说道

  • 增量设计 / 构造 / 测试是软件开发的最强有力工具之一

  • 在增量开发中,你首先设计系统可以运行的最简单版本。它甚至不接受任何数据输入,或者对数据进行处理,他也可以不产生输出。只需要成为一个坚实的骨架结构。

Fred Brooks(《人月神话》作者)甚至认为

应做好建造一个扔掉一个的准备

##3 开源社区其实一直挺习惯这种做法的

《大教堂与集市》中提到

  • 优秀的程序员知道写什么,卓越的程序员知道改写(和重用)

  • “建设性懒惰”,他们知道人们要的是结果而不是勤奋,而从一个部分可行的方案开始,明显要比从零开始容易得多

  • 虽然Linux中所有Minix代码最终都被移除或重写,但它在Linux成长初期确实起到了类似脚手架的作用

以上是我做的读书摘记。

你看,以上谈论的几点,如果你平时都混迹github的话,也许就是这样做的,当有某个需求时,用关键字去github搜下是否有类似项目,有的话,clone下来,以其为脚手架,先跑起来,在此基础上增量地做些自己的定制,如果跑不起来,就checkout回去,成功的话,又继续往前多迈一步,因为使用的是增量式开发,你能知道每次的错误肯定是新增的代码造成的,这样一来你是信心十足的前进,毫无后顾之忧

##4 晚上在翻《How to Think Like a Computer Scientist: C++ version》 (中文版《像计算机科学家一样思考 C++版》)

第5章谈到程序开发时,作者建议大家使用增量式开发。书中举得一个例子很棒,摘录过来,适合帮助新手理解增量式开发的过程

我们面临这样一个任务:计算两点(x1,y1)和(x2,y2)之间的距离

公式是简单的:distance = √((x2-x1)^2+(y2-y1)^2)

###4.1 好的,我们开始写下骨架代码

1
2
3
4
double distance(double x1, double y1, double x2, double y2)
{
	return 0.0;
}

在这一阶段函数并没有做任何实质性的事情,但是尝试编译可以让我们在把函数变得更复杂之前确认是否却在语法错误。

###4.2 为了测试这个新函数,我们需要调用它

1
2
3
4
5
6
int main(void)
{
	double dist = distance(1.0, 2.0, 4.0, 6.0);
	cout << dict <<endl;
	return 0;
}

一旦检查完函数定义的语法,就可以开始一次添加一行的代码进行增量开发了。在每次增量改变之后,就可以编译运行程序,用这种方法,在任何一个时间点我们都确切知道错误所在–刚添加的最后一行代码。

###4.3 编译,运行,一切正常。这时你的信心在不断累积。下一步是用两个临时变量dx和dy存储x2-x1和y2-y1的差值

1
2
3
4
5
6
7
8
double distance(double x1, double y1, double x2, double y2)
{
	double dx = x2 - x1;
	double dy = y2 - y1;
	cout << "dx is " << dx <<endl;
	cout << "dy is " << dy <<endl;
	return 0.0;
}

在此计算distance(1.0, 2.0, 4.0, 6.0)。其中参数的选择是有原因的,水平距离为3,垂直距离为4,所以两点间距离为5,当测试一个函数的时候,知道正确的结果是很有帮助的。在这里dx为3.0,dy为4.0

编写完函数时,会删除输出语句,像这样的代码称为支架代码,可以帮助正确地编写程序,但是它并不是最终代码的一部分。

###4.4 下一步是对dx和dy做平方计算,我们使用简单快捷的直接与自身相乘。

1
2
3
4
5
6
7
8
9
double distance(double x1, double y1, double x2, double y2)
{
	double dx = x2 - x1;
	double dy = y2 - y1;
	double dsquared = dx * dx + dy * dy;
	cout << "dsquared is " <<dsquared;

	return 0.0;
}

在这个阶段可以再一次编译和运行程序,检查中间值是否正确

###4.5 最后,用sqrt函数计算平方根,并返回结果

1
2
3
4
5
6
7
8
double distance(double x1, double y1, double x2, double y2)
{
	double dx = x2 - x1;
	double dy = y2 - y1;
	double dsquared = dx * dx + dy * dy;
	double result = sqrt(dsquared);
	return result;
}

至此,主要的工作就完成了。

###4.6 在main函数中,检查结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <math.h>
#include <stdio.h>

double distance(double x1, double y1, double x2, double y2)
{
	double dx = x2 - x1;
	double dy = y2 - y1;
	double dsquared = dx * dx + dy * dy;
	double result = sqrt(dsquared);
	return result;
}

int main(void)
{
	double dist = distance(1.0, 2.0, 4.0, 6.0);
	cout << dict <<endl;
	return 0;
}

熟练之后,一次可以编写和调试更多的行。

总结下:

  • 从一个可以运行的程序开始,做小步,渐进的改进。在任何一点,如果出错,可以清楚地知道错误发生的地方
  • 使用临时变量存储中间结果,便于输出和检查。
  • 一旦程序正常运行,可能需要移除部分支架代码。记得加上注释使程序保持可读性。

此外可以结合git来管理代码,将没有问题的代码入库,保证代码安全的同时,可以随时切换到任意时间点。这样在渐进前进的同时就可以无所顾忌了