谈谈我的博世hackathon感受

一年一度的博世黑客马拉松要开始了,极客圈的小伙伴们都在跃跃欲试。好些个朋友都来问我这个参加过的选手,诸如xdk是啥啊,容易上手吗等问题,我干脆写到我自己的技术日记,要看随取。这里的确要吐槽下博世,的确宣传力度和技术社区培养不够,资料的确难找,不像STM32啊,Arduino啥的开源智能硬件,有强大的社区支持,例程和开发人员非常多。这也让xdk这个好东西让极客们有些陌生感。

粗暴的说,XDK是博世推出的IoT平台开发套件,它包含一个高度集成化的硬件终端,一些中间件,IDE和云平台。XDK秉承德国人一贯的严谨性,慢工出细活,东西是真TMD的精致,耐操。为啥这么说呢,大家都来IoT领域布局,所以都得有自己的独门绝技吧,比如,阿里拿手活儿是云计算,腾讯么靠强大的社交能力,这不Robin Li 要转型,祭出哥要扛起AI大旗杀手锏,结果一瓶矿泉水披头而下。那么德国博世的杀手锏则是传感器,传感器,传感器!

这个小盒子就是xdk的终端设备,它不是原型,它是一个实实在在的产品,而且是工业级的!工业级什么概念呢,自行百度吧。按产品设计的苛责级别是这样的:军工级别>车规级别>工业级别>消费电子级别。哥也参加过不少类似编程活动,现场给各种传感器模块,都是几块到几十块钱的廉价传感器,什么光敏电阻光传感器,PIR人体传感器,温湿度等等,我觉得和这个比起来呢,就是小孩玩具与成人级电子产品的差距,那些只能拿来玩一下丢掉,就是一个字,飘….。这个小盒子里集成了微机电加速度计,磁力计,陀螺仪,以及温湿度,压力,声光的传感器,还有2.4G蓝牙和WIFI互联方案,天线,卡槽和锂离子电池。这些都在一个指甲盖大小的电路板上集成!我比赛那会儿问专家,这么小,那诸如温度传感器自身的热量导致的数据准确怎么保证呢?专家说,我们有专门的补偿算法,可以直接用。请收下我的膝盖,瑟瑟发抖。这玩意儿除了贵,没其他毛病。我估计这个设备要卖一到两千元,因为它是面向工业级的。随贴随用,低功耗。

另外我简单看了下,板子上跑的应该是FreeRTOS,USB上电后,自动识别设备,直接可以和PC上的开发套件通信。PC的开发套件呢,其实就是基于eclipse CDT做的插件开发,细心的德国人几乎把你能想到的用户需求都给你做了,开发套件里面集成好了交叉编译链,烧写和调试等工具,而且包含大量的例程,每种外设都有例程,现场编程基本只需要把例程代码给copy出来通过编译,然后简单配置下外设即可一键烧写,开始调试,寄存器watch,断点等等,十分方便。这里截几个图给大家体验下。

开发时,你的数据总得上云啦。去年呢,博世时选择了物联网供应商sigfox,sigfox会发给你一个基于Arduino的EV板,然后给你提供了一个USB doogle的模拟基站,把Arduino和xdk板随便找几个rxtx杜邦线一戳,数据就来了,Arduino随便把示例程序改一下,烧一下,就可以和USB doogle的模拟基站通信了。PC上的模拟基站呢,其实很简单,用nodejs写的一个中转程序,通过浏览器配置好后,数据自动会被模拟基站利用PC的网络以HTTP方式发送出去。你只要配置发送目标例如:http://youip:port/youapi?name=$0&….$1..$2,用占位符就把数据传出去了。一次http get请求可以传152字节(记不太准确了)。今年好像没用这个了,这让你发挥空间更大,请极客们自行携带你的爱板,随便玩。

至于云端嘛,博世的云端时和微软Azure合作的,部署在微软云上,叫Bosch IoT Suite,这个其实你可以用可以不用,如果你对服务器熟悉,你完全可以随便把你自己的阿里云,腾讯云啥的http服务搞一个在那里,写几行php啊,nodejs或者servlet就行了。坦白讲,微软云的东西吧,用户接口很不好,不符合中国人的使用习惯,资源入口很难找,中文网站像机器翻译的一样。

我觉得博世的赛题也挺好的,可以充分发挥其传感器的作用。这里给小伙伴们点建议,比如电梯场景,可以利用加速度计检测电梯的运行速度,因为电梯可以调节运行加速度,商场等场所就很快,住宅楼则慢很多,可以用陀螺仪检测意外的轿厢抖动,还有可以利用光线传感器检测开门关门次数啊啥的,再检测些温湿度等工作环境啥啥。随便组合一下,做个电梯运行健康估值啊,异常情况预警啊,老化预测啊等等。我保证你带1万奖金回家。哈哈。。。。

(XDK_Getting_Started_v2 附上一份getting started指南,拿走不谢)

 

 

需求分析与设计阶段的区别

一、需求分析

需求分析是指开发人员要进行细致的调查分析,准确理解用户的要求。将用户非形式的需求陈述转化为完整的需求定义,再由需求定义转换到相应的形式功能的过程

1、需求分析的基本原则

  • 可以把一个复杂问题按功能进行分解并可逐层细化。
  • 必须能够表达和理解问题的数据领域和功能领域。
  • 建立模型。

2、需求分析的基本任务

是要准确地理解旧系统,定义新系统的目标。回答系统必须“做什么”的问题。

  • 问题明确定义;
  • 导出软件的逻辑模型;
  • 编写文档;

3、需求分析方法

1)结构化分析

  • 建立现行系统的物理模型;
  • 抽象出现行系统的逻辑模型;
  • 建立 目标系统的逻辑模型;
  • 进一步补充和优化;

2)数据流图

(数据流、加工、数据流原点和终点)、数据字典、加工逻辑的描述(结构化语言、判定表、判定树)

二、需求阶段

1)找出领域模型
2)在需求分析阶段,先找出用例,画出用例图,一开始,用例的粒度不宜太细,以免看不清主线。
3)需求分析先要确定业务上的需求,业务规则,有哪些约束条件。
4)描述“为什么”
5)抓住主线,列出用例。
6)对用例进行扩展。
7)列出可能的扩展需求

三、设计阶段

1)画出用例图
2)画出状态图
3)画出实体类图
4)画出序列图
5)定义数据字典和ER图
6)对照用例,每个用例都走一遍,看是否能走通,有没有什么问题
7)设计要做到什么程度:自己心中非常有底,非常有信心,而不能自己心里都是虚的,没什么底。

四、需求分析学习笔记

在可行性分析阶段,主要是对新系统的基本思想和过程进行初步的分析和论证,对系统的基本功能,性能,开发时间的限制,人员安排,投资情况做一个客观的分析。
在需求分析阶段,要对在可行性分析阶段确定的系统目标和功能作进一步详细的描述,确定系统“做什么”的问题。

1、需求分析一般的实现步骤

(1)获得当前系统的物理模型。物理模型是对当前系统的真实写照。首先要对现行系统进行分析,理解,了解它的组织情况,数据流向,输入输出,资源利用情况等,在分析的基础上画出它的物理模型。
(2)抽象出当前系统的逻辑模型。逻辑模型是在物理模型的基础上,去掉次要的东西,建立起反映系统本质的逻辑模型。
(3)建立目标系统的逻辑模型。分析目标系统和当前系统逻辑上的区别,建立符合用户需求的目标系统的逻辑模型。
(4)补充目标系统的逻辑模型。对目标系统进行补充完善,加上一些次要的因素,例如出错处理。

2、需求分析的具体任务

1)确定系统的综合要求

(1)确定系统功能要求。这是最主要的需求,确定系统必须实现的所有功能。
(2)确定系统性能要求。应就具体系统而言。例如可靠性,联机系统的响应时间,存储容量,安全性能等。
(3)确定系统运行要求。主要是系统运行时要求,如系统软件,数据库管理系统,外存,数据通信接口等。
(4)将来可能扩展的要求。对将来可能的扩充作预准备。

2)分析系统的数据要求

软件系统本质上是信息处理系统,因此,必须考虑:
(1)数据(需要哪些数据,数据间联系,数据性质,数据结构等)
(2)数据处理(处理的类型,处理的逻辑功能等)
(3)导出系统的逻辑模型。通常系统的逻辑模型用DFD(Data Flow Diagram)图描述。
(4)修正系统的开发计划。通过需求分析对系统的进度和成本有了更精确的估算,因此可以进一步修改开发计划。

2、需求分析的过程

(1)问题识别:双方确定系统的综合需求。包括功能需求,性能需求,运行时需求,扩张需求,用户界面需求,安全需求,可靠性,保密性,可维护性,可移植性等需求。
(2)分析与综合:导出系统的逻辑模型。
(3)编写文档:
。需求说明书
。初步用户使用手册
。确认测试计划
。修改完善项目开发计划
(4)分析评审:对功能的正确性,完整性,清晰性和其它需求进行复查和评审。

函数式编程介绍

最近在研究JDK8的新特性,一直熟悉面向过程和面向对象的编程模式,突然发现没怎么了解过函数式编程,于是最近乘这个机会,研究了一下函数式编程。

bg2012040601

定义
简单说,”函数式编程”是一种”编程范式”(programming paradigm),也就是如何编写程序的方法论。
它属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数,大家应该都了解,就是一个功能逻辑单元,它没有特定的属性和归属。
函数式编程(FP)的核心就是一切都是函数,也就是说”活“的不再是对象,而是函数。函数本质是x到f(x)的变换,所以FP的元素就两种,一种是函数(”pure function“的概念,表现为命名句柄或表达式,所以独立性->并发性),一种是状态(immutable,因为只要发生变换,就通过函数表现)。 函数的独立性,导致了我们没法记录函数内部运行的状态,怎么解决呢,把状态放在参数里呗,然后用递归来搞定。

函数式编程的特点

    函数式编程的三大特性:
  • immutable data 不可变数据:像Clojure一样,默认上变量是不可变的,如果你要改变变量,你需要把变量copy出去修改。这样一来,可以让你的程序少很多Bug。因为,程序中的状态不好维护,在并发的时候更不好维护。(你可以试想一下如果你的程序有个复杂的状态,当以后别人改你代码的时候,是很容易出bug的,在并行中这样的问题就更多了)
  • first class functions:这个技术可以让你的函数就像变量一样来使用。也就是说,你的函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。这个有点像Javascript的Prototype(参看Javascript的面向对象编程)
  • 尾递归优化:我们知道递归的害处,那就是如果递归很深的话,stack受不了,并会导致性能大幅度下降。所以,我们使用尾递归优化技术——每次递归时都会重用stack,这样一来能够提升性能,当然,这需要语言或编译器的支持。Python就不支持。
    函数式编程的几个技术
  • map & reduce :这个技术不用多说了,函数式编程最常见的技术就是对一个集合做Map和Reduce操作。这比起过程式的语言来说,在代码上要更容易阅读。(传统过程式的语言需要使用for/while循环,然后在各种变量中把数据倒过来倒过去的)这个很像C++中的STL中的foreach,find_if,count_if之流的函数的玩法。
  • pipeline:这个技术的意思是,把函数实例成一个一个的action,然后,把一组action放到一个数组或是列表中,然后把数据传给这个action list,数据就像一个pipeline一样顺序地被各个函数所操作,最终得到我们想要的结果。
  • recursing 递归 :递归最大的好处就简化代码,他可以把一个复杂的问题用很简单的代码描述出来。注意:递归的精髓是描述问题,而这正是函数式编程的精髓。
  • currying:把一个函数的多个参数分解成多个函数, 然后把函数多层封装起来,每层函数都返回一个函数去接收下一个参数这样,可以简化函数的多个参数。在C++中,这个很像STL中的bind_1st或是bind2nd。
  • higher order function 高阶函数:所谓高阶函数就是函数当参数,把传入的函数做一个封装,然后返回这个封装函数。现象上就是函数传进传出,就像面向对象对象满天飞一样。
    函数式编程的优势
  • 代码简洁,开发快速。函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快
  • 接近自然语言,易于理解。函数式编程的自由度很高,可以写出很接近自然语言的代码。
    比如表达式(1 + 2) * 3 – 4,如果用函数式编程格式,如下:

    add(1,2).multiply(3).subtract(4)

    它更接近我们人的表达方式,更容易理解。其实好的程序是人更容易理解,而不是让机器更容易。
  • parallelization 并行:所谓并行的意思就是在并行环境下,各个线程之间不需要同步或互斥。
  • determinism 确定性:所谓确定性的意思就是像数学那样 f(x) = y ,这个函数无论在什么场景下,都会得到同样的结果,这个我们称之为函数的确定性。而不是像程序中的很多函数那样,同一个参数,却会在不同的场景下计算出不同的结果。所谓不同的场景的意思就是我们的函数会根据一些运行中的状态信息的不同而发生变化。因此函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。

参考
https://en.wikipedia.org/wiki/Programming_paradigm
http://coolshell.cn/articles/10822.html
http://www.ruanyifeng.com/blog/2012/04/functional_programming.html

我是一个Coder

我是一个Coder,毕业七八年,写的语言从C, C++, Java开始,熟练掌握的也不下十几种了。我不是什么大神,顶多算是个代码熟练工。作为一个代码搬运工,在公司年复一年的耕耘,带着码农固有的宅,下班在家之余也七七八八写了不少代码,乐此不疲。

一日,和朋友聊到此事,作为极度的代码爱好者,大有同感。于是我们自己掏腰包,购买了个阿里云服务器,成立了这个网站。我们本着开放的态度,把我们的代码与大家分享。或者,心血来潮,会出一些技术视频教程。