开发者最佳实践2 – 继续下一步之前完成你的文档

我曾经弄砸了我的计算机与应用硕士学位,我当时特别喜欢写代码,即使没有完全弄明白也没有完整的文档。在软件开发过程中没有任何设计文档和测试用例文档……直接跳到了编码阶段。

在最后阶段,我发现自己遇到了大麻烦,很快我就意识到文档是成为成功的软件开发人员、测试员、架构师的钥匙。

当你开发大型软件的小部分前,你应该先回答下面这些问题:

  • 需求说明书在哪里?
  • 影响分析文档在哪里?     
  • 设计文档在哪里?     
  • 你是否已经把所有的假设、限制合理的文档化了?     
  • 你是否已经评审了以上这些文档?     
  • 你拿到了所有利益人(stockholders)对以上文档的签字吗?

继续阅读 »

最爱的 Catch Note 即将停止服务

CatchNote是一款非常好用的网络便签工具,手机app界面非常酷,操作也非常人性化。
 
可惜的是这样一个优秀的软件即将终止服务,终止日期为8月30号,届时将不能登录。不过这个公司还是非常负责任的,今天收到他们的邮件,告知即将停止服务,且他们已经提供了数据导出工具。为什么不敢轻易使用国内的云服务?看看国外的公司是怎么做的。
 
来自为知笔记(Wiz)

开发者最佳实践1 – 继续阅读现有的软件源码

在我们开始软件开发人员所需的最重要的一个练习之前,让我先问你几个基本的问题:
  • 你阅读电影杂志吗?
  • 你读报纸吗?
  • 你读路边的广告吗?
  • 你读各处写着的那些垃圾(信息)吗?
  • 你读……?

你的答案绝对是肯定的,但是如果我在这些问题增加一个呢:

  • 你阅读软件源码吗?  

只有少数软件开发人员的回答是肯定的,因为阅读和理解一个已经存在的软件源代码是一件最枯燥乏味的任务。

如果你也觉得阅读源码是一件枯燥的任务,那你就错失了最重要的最佳练习,而这种练习是软件开发人员生活中必须的。  

如果你想成为小说家,你能直接开始写小说吗?

我敢说这百分之百不可能,在你写出好的小说之前,你一定需要阅读数以百计的小说。  

如果你想成为一个电影编剧,你能在仔细研读大量优秀的剧本之前写出好的剧本吗?同样我的答案也是否定的。  

所以,如果你想写出好的代码,你不阅读上吨(大量)的代码怎么可能写得好呢?即使你写一些东西,你没有阅读大量的代码,你怎么知道你写的是不是最好的?  

阅读他人的代码可以让你有机会批判代码编写过程中的错误做法。你将会发现其他开发人员代码中的错误,而这些错误是你编写优秀代码时不应该犯的。  

你将从阅读现有代码中学到许多软件代码的特性,譬如缩进、注释、版本注释(history deader)、函数结构等,尤其是阅读那些由经验丰富的软件开发人员编写的代码。  

花点时间阅读他人的代码,我敢保证你将能在几天或几周后写出漂亮的代码,而且你还能发现之前在写代码时犯的错误。  

你可以试一试,只是阅读你几年前写的代码,你一定会发笑……因为你一直在通过练习来进步。  

注:本文由奔跑翻译,前往查看原文

软件开发者最佳实践 – 什么是实践(What is Practice)

什么是实践(What is Practice) 当我说Practice时,我实际上是在说:

  • 实践是一个习惯、一件例行公事    
  • 实践不是靠记忆    
  • 实践通过练习来获得    
  • 实践需要奉献和投入

说到练习,有成千上万的例子,譬如射击,开车,写作。

上面的列举的这些技能都是从练习中获得。当你开始学习开车是,你需要记住每一个步骤,而且做任何动作前都会先反复思考,但是当你有足够的训练后你就不需要记忆任何步骤了。这些都变成了你的习惯和例行公事,譬如当你看见红灯,你的就会自然而然地踩刹车,但是这绝对来自于大量的练习,需要大量的奉献和投入。

练习的一个最重要的特点就是:它强迫你从你的习惯(做法)中转变过来。

如果一个司机以20m/h的速度行驶,频繁遇到交通事故,在日常驾驶中给车辆带来很多刮痕,你会认为这是一个好司机吗?

软件开发和射击,写作,开车这些技能一样,要成为一名成功的软件开发人员,你需要大量的练习、奉献和投入。

在这份简短的文档中,我想告诉你一些最好的软件开发人员的练习(方法),可能你会觉得很有用。那让我们开始吧……

注:本文由奔跑翻译,前往查看原文

Word2007批注与修订功能

Word文档初步完成以后,需要进一步进行批注、修订等工作。Word 2007提供了更高级的修订和批注功能。用好这些功能,您将制作出更人性化、更准确的Word文档来。
 
这里只简单的介绍如何插入批注和如何开启修订功能。
在工具面板中选择审阅,可以看到批注和修订菜单栏,新建批注就不用说了,实际拿个文档操作下就明白了。
 
 
修订功能是可以开启或关闭的,如下图,选中修订后,开启修订功能,这样Word就会同时记录文档的修改记录。
 
 
更多更详细的介绍可以参考这里(来源天极网):Word 2007教程:处理文档的修订与批注
来自为知笔记(Wiz)

入门Python

曾经很多次我都想放弃一直使用的脚本工具AutoIt,换用Python,可以一直没有入门。

记得第一次知道Python是四五年前,那时候还在上大学,那时候就看到网络上很多人说python很强大,尝试了学习,可惜没有入门,可能那时候的学习能力不够吧。后来又几次三番的想学习Python,也都因为遇到各种各样的困难而放弃。

这一次我有旧情复燃,原因是买了树莓派后看到了更多关于Python的应用,加之前几天在网上搜到了一篇介绍Python入门书籍的文章。下载了这篇文章里介绍的书籍,最大的收获是,学习一门知识,选择一本好书非常重要。通过相关介绍,我知道了Python2.7.5是最合适的版本。记得之前我一直以为那些教程使用2.7.5(而不是3.0)是过时的表现,所以自己去折腾3.0,遇到各式各样的问题,又找不到帮助和解决办法,最后只能放弃。

所以这里我跟大家分享下我正在使用的入门资料,方便大家学习。 继续阅读 »

产品与艺术品

记录一点工作感悟和想法。
每个程序员都不乐意来来回回地修改设计,我也毫不例外。当然,我们应该清楚的知道设计时一定会反复修改的,敏捷开发的一项特点就是能快速响应客户的需求,及时作出修改。所以,我们应该说,好好反省吧,程序员,修改时避免不了的。真的是这样吗?
是的,用户的需求我们是一定要尽力满足的。但我这里讨论的是产品发布之前的反复修改。我不知道是不是大公司就不会出现这种情况,但我现在确实遇到了这种情况。我刚刚根据讨论好的方案实现了代码,完成了单元测试,又被通知方案要做出修改;刚刚完成修改,又被告知这种方案对于服务器会造成很大的压力,还需要修改。

继续阅读 »

STM32 要使用一个定时器需要做哪些工作

1.配置该时钟的中断优先级,NVIC
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //配置NVIC中断优先级编组
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM6中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //抢占优先级1级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
2.初始化该时钟的配置,包括:
开启该定时器的时钟源:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
清空配置:TIM_DeInit(TIM6);
配置时钟的自动重装计数器:TIM_TimeBaseStructure.TIM_Period=200;
配置时钟源预分频数:TIM_TimeBaseStructure.TIM_Prescaler= (1600 – 1);
配置时钟分频数:TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
配置计数模式:TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
让配置生效:TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
清空溢出中断标志:TIM_ClearFlag(TIM6, TIM_FLAG_Update);
设置溢出中断使能:TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
启动定时器:TIM_Cmd(TIM6, ENABLE);
3.编写该时钟的中断服务函数
void TIM6_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
    {
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
        sysClockCount++;                                //用于滚动显示字符
    }
}
来自为知笔记(Wiz)