天天看点

万物互联开发平台NSDK

万物互联开发平台NSDK介绍

第一章 概念

  1. 纳信 ── 北京纳信科技有限公司的简称。
  2. NC ── 纳信C & C++语言和编译器的简称,也是文件扩展名。
  3. NSDK ── 万物互联开发平台的简称,平台所有模块可演示。

第二章 万物互联开发平台简介

万物互联开发平台NSDK,是北京纳信科技有限公司研发团队历时八年自主研发的开发平台,NSDK的开发目的是为了提升软件的研发效率、软件企业的软件产品质量。

众所周知,随着近几年互联网经济的发展,软件企业越来越承受不住高额的人力资源成本,而如何既能降低软件开发人员的成本,仅仅靠简单的降低工资肯定是行不通的,必须让软件人员手中掌握一种“利器”,能大大提高他们的开发效率,NSDK应运而生。

NSDK内嵌自主开发的编译器(NC),对原本的C/C++语言、HTML语言改进后融入开发平台,既支持原有的语法规则,又在原有基础上做了更进一步的改善,采用C语言语法规则开发了纳信脚本语言NScript,并且NSDK拥有一套完整的软件质量保证体系。具体而言,NSDK主要包含以下方面:

1、 NSDK包含纳信标准数据类型、数据结构,比原有的数据类型、数据结构更丰富;

2、 NSDK包含对标准NSC语法、标准NSH语法、标准指令、标准API的支持;

3、 NSDK包含了一整套内存处理方案,产品所用到的内存,每一块内存是什么数据类型,具体数据是什么都是清晰的;

4、 NSDK包含了纳信自动化测试和Dbug方案;

5、 NSDK包含支持多种开发语言的解决方案;

6、 NSDK包含纳信C语言NC;

7、 NSDK包含了纳信脚本语言NScript;

8、 NSDK包含了纳信实时库方案;

9、 NSDK包含了纳信NHTML方案。

最近,美国对中国的制裁簇生了现在轰轰烈烈全民搞国产化替代的趋势,需要格外说明的一点的是:NSDK区别于许多的国产化替代软件,NSDK的开发没有借助任何的开源SDK或编译器,完全是纳信软件开发团队智慧的结晶。

开发平台NSDK拥有完善的质量保证体系,加上NSDK降低了开发的难度(如直接用struct就可以生成数据库表,类似的手段和方法还有很多),可以说是能明显提高软件生产力的基础。基于NSDK来开发产品有着得天独厚的优势。**NSDK的数据类型标准化、接口形式标准化、平台指令标准化、Access数据库与SQL Server数据库双支持、二次查询、二次统计、非结构化数据的处理、大数据处理、录制宏(应用层自动化测试脚本)、防止利用NC/NScript攻击服务器。**举例:可以记录产品运行过程中的函数调用(例如IO调用),产品涉及几块内存,每一块内存是什么数据类型,具体数据是什么都是清晰的。这些为产品研发提供了质量保障。

NSDK可以轻松应对软件开发企业目前面临的许多难题,例如:如何开发没有内存泄漏的应用程序?如何应对难以复现的bug?如何轻松简单地开发出多语言应用软件?如何应对灵活的跨行业解决方案?如何进行自动化测试?如何通过代码覆盖率指导测试?诸如此类的问题,NSDK都有完善的解决方案。

第三章 万物互联开发平台的价值

优秀的软件企业(或软件团队)需要建设自己的开发平台(简称企业开发平台),企业中软件开发人员的规模越大,对平台的需求越迫切,建设企业开发平台是保证产品质量和提升软件开发效率的必经之路。软件企业只有通过构建企业开发平台才能慢慢积累企业的软件生产力从而做强做大。

NSDK是由纳信首席架构师亲自设计和开发,用于提升产品开发效率和提高产品质量。经过培训的研发工程师具有强大的单兵作战能力,一人之力相当于多个中级研发人员的能力。如果一个团队用平台,将至少提升50%以上的效率。也许你会觉得不可思议,但这绝不是危言耸听,是经过一些实践得出的结论。

下面简要介绍一下NC的先进性以及NSDK之所以能保证产品质量、提高软件开发效率的方法:

1. NC的先进性

纳信的接口层自动化测试和应用层自动化测试都是通过NC和NScript完成的。

 NC是站在现有开发平台(例如vc)的肩膀上;

 NC从一开始就被设计为跨平台的编译器;

 NC统一了b/s架构和Form架构的软件开发项目;

 NC可以将NSDK的优势完全发挥出来,也就是说NC是 NSDK质量保证体系以及NSDK提升人员的开发效率关键因素。

2. NSDK是如何保证产品质量的?

目前软件企业的产品质量保证现状:

(1)有些企业没有测试团队;

(2)有些企业只做部分黑盒测试以保证用户正常使用;

(3)有些企业做了比较充分的黑盒测试;

(4)有些企业有不错的管理方法:bug管理 + 各种review。

产品质量分为站在研发者角度的产品质量和站在用户角度的质量。

所谓用户角度就是普通用户是看不到研发企业内部,接触不到研发人员和研发过程。普通用户只能通过使用产品来了解和感受产品质量。

所谓开发者角度就是要站在研发人员角度全面看产品质量,其中也包含了从用户角度看软件质量。不仅如此,还包含了研发过程掌控、质量保证和质量掌控的手段、软件和系统架构、开发效率、测试效率、源代码质量、源代码的复用性、软件性能、算法与数据结构等。

单纯的黑盒测试能够保证产品使用起来没有问题,也就是说,站在用户的角度看,产品是不错的。我们对此的评价是“质量还可以,达不到高质量,没有开发效率”。

NSDK质量保证手段(可在平台中演示):

软件开发过程管理、黑盒测试、开发者测试、开发平台优化系统、复查、复盘等等。

(1) 开发模块有“单元测试 + 代码覆盖”;

(2) 利用NScript对接口层做“自动化测试 + 代码覆盖”;

(3) 利用NScript对应用层做“自动化测试 + 代码覆盖”;

(4) 如何应对内存泄漏?如何开发没有内存泄漏的产品?这个问题很复杂,NSDK对此问题的解决方法可以简言为:内存池+数据类型+数据列表+追踪;

(5) 应对难以复现的bug:NSDK有完整的LOG记录(Logging);

(6) ASSERT的合理利用,有助于提升产品质量;

(7) 研发测试的配合;

(8) 平台是顶级的架构师开发(附录中有对NSDK灵魂架构师的简介);

(9) 使用C/C++编程的,大多数bug与内存相关。NSDK将内存池、数据类型、数据结构、具体数据内容融为一体。对于软件调试过程,对于数据处理层,可以做到产品的每一块内存,每一个变量,每一个数据结构,每一个字节都是透明的,这也是NSDK相比目前流行的其它编译器所拥有的巨大优势。

(10) 使用NSDK可以获得内存池列表、数据结构列表、数据列表、函数调用列表、IO调用列表等信息。

(11) NSDK提供了强大API,你可以直接使用它。这些API是由高级架构师研发的,从而降低了产品的开发难度,同时保证了产品的质量。

(12) NSDK的Logging模块保证了在不能调试的情况可以解决部分bug或问题。

a) 在不能调试的环境采用Logging来定位错误发生的原因;

b) Logging不能解决所有的问题;

c) 应该能够关闭Logging;

d) Logging在被关闭状态应该保证对系统的性能几乎没有影响,即最低的调用成本。

(13) 代码优化的原则

a) 尽量精简代码,合理的压缩代码行;

b) 重复的代码COPY应尽量合成一份;

c) 减少没有必要的数据冗余;

d) 提升代码的执行效率。

3. NSDK为什么能够提升产品的开发效率?

质量体系是开发效率的基石,质量体系加合理规划成就强大的生产力。

影响开发效率的因素有许多,比如:

(1)各种原因引起的不能调试;

(2)小到API,大到模块、产品、平台应有尽有;

(3)企业标准:标准数据类型、标准数据结构、标准NC语法、标准NSC语法、标准NSH语法、标准指令、标准API系列等;

(4)分析MEM,STR常用API分析生产效率的来源;

(5)Sharelog(虚拟设备);

(6)WriteMemDetailToDevice(查泄漏+多次分配一次释放);

(7)RailTime变量用途;

(8)Input类型;

(9)API分类。

NSDK之所以能提高开发人员的效率主要在于:

(1)可以自定义数据;可以自定义界面,有些产品不需要编写代码就可以定制出来,

有些产品(例如b/s架构)只需要少量的、简单的编码就可以定制出来;

(2)NSDK有强大的数据处理能力,例如:通过调用API,NC可以根据struct创建数据库表,可以为该数据库录入数据、修改和查看数据,这些都无需编码;

(3)降低了应用的开发难度(调用简单+案例充足);

(4)NSDK强大的数据处理机制。

基于NSDK提供的强大数据类型、数据结构和API,NSDK一行代码所完成的功能相当于许多公司开发人员的多行代码,甚至几十行上百行,这是研发效率的基础。

整个公司一个平台,降低了学习成本,降低了沟通成本,统一了产品研发思维模式。

第四章 NC - 纳信C语言

NC是由源代码直接生成机器码的。任意环境下的NC/NScript都可进行调试、代码覆盖、禁用部分API、记录NC运行背后发生的行为、循环移位运算(<<>和<>>)等。NC的语法集合 = 标准C语言语法集合 + 常用C++语法集合 + 纳信规范的数据类型及数据结构。

NC支持标准C语言数据类型:void, char, short, int, long, short int, long int, long long, unsigned, unsigned char, unsigned short, unsigned int, unsigned long, unsigned short int, unsigned long int, unsigned long long, float, double, long double

NC还支持纳信公司标准数据类型:_bool, _byte, _wchar, _i08, _u08, _i16, _u16, _i32, _u32, _i64, _u64, _f04, _f08, _f16, _date, _time, _datetime, _timespan, _guid, _string, _ascii0, _bin

以上所有这些数据类型都有标准的数据内存映像,属于纳信公司标准之一。

NC的程序起始执行点是main函数。

第五章 NScript - 纳信脚本语言

NScript的语法与NC兼容,NC的程序起始执行点是main函数,而NScript的起始执行点是第一条语句。

NScript是纳信的脚本语言;NScript从最底层开始完全由纳信自主研发;NScript采用C语言语法规则。

纳信应用层的自动化测试都是通过NScript完成的。例如NScript自身的自动化测试、NJudge自动测评系统核心算法的自动化测试等。

  1. 下面列举一些NScript的具体用法:

    // 经典hello

    PrintLine("hello!");

    // 输出结果:hello

    // 读取文本文件,并显示到控制台

    string str;

    ReadAsText(“test.txt”, str);

    PrintLine(str);

    // 输出结果:this is a test file.

// 读取二进制文件,并显示到控制台

binary bin;
ReadAsBinary("test.dat", bin);
PrintLine((string)bin); 
           

// 输出结果:01 02 03 04 05 …

// 比较两个文件是否完全相同

binary bin1, bin2;
ReadAsBinary("test1.dat", bin1);
ReadAsBinary("test2.dat", bin2);
PrintLine(bin1 == bin2 ? "完全相同" : "不相同");
           

// 一条语句即可计算并显示某人的年龄(假设出生时间为1999-9-19 17:54)

PrintLine((string)(int)(TotalDays(Now() - #"1999-9-19 17:54") / 365) + "周岁"); // 输出结果:16周岁
           
  1. NScript的应用案例

    NJudge自动测评系统2016版(纳信的另一产品)的代码检查、批量导入等功能基于NScript脚本,因此NJudge自动测评系统2016版的代码检查具有强大的功能和扩展性。

第六章 NSDK实时库

数据类型、数据结构、内存模型、NC和NScript构成了NSDK强大的实时数据系统,简称纳信实时库。

数据库插入数据的性能优化,以SQL Server为例:

(1)"INSERT…"的效率和"INSERT…; INSERT…; 20到30个INSERT; INSERT…;"的性能约差一个数量级;

(2)20到30个INSERT和SQL Server的BulkCopy插入数据的性能约差一个数量级;

(3)BulkCopy和将数据存储到文件中的性能数据约差一个数量级。

第七章 NSDK内存方案和数据结构

NSDK内存方案和数据结构是NSDK实时库系统的基石。NSDK的内存实现方案为:

(1)内存方案和数据类型形成了一个整体,可以通过遍历内存查看系统中所有的实时数据,进而分析系统数据,查找系统内存泄漏。

(2) 纳信数据类型和数据结构能够使用系统中的所有内存,不受缺省堆的限制。

(3) 可以用同样的方法使用共享内存和普通内存。

(4)开发平台可以做到主动控制内存分配+释放+明细,具体是:

1) 可以做统一释放;

2) 可以进行根节点释放,内存泄漏双保险;

3) 可以查看内存明细;

4) 可以查看数据明细及分工;

5) 可进行数据跟踪;

6) 统计内存分配释放次数—性能的理论数据。

第八章 多语言方案

纳信多语言解决方案的特点:

(1)实时切换语言环境,不需要重新启动应用程序;

(2)增加语言不需要修改代码、不需要重新编译资源(.rc)和代码(.cpp;.c;.h)。

第九章 Debug体系、自动化测试

1. NSDK Debug体系

NSDK万能Debug场景:

(1)NSDK可进行单文件Debug;

(2)多文件(NC a.app b.app)调试;

(3)Nproj(单文件或多文件)Debug;

(4)Nsln(单nprj或多nprj)调试;

(5)任意打开一个文件(NC/NSC/NH),设置断点,运行任意形式的进程或线程,进入断点调试;

(6)绝密开发:打开zip中的nc/nh/nprj/nsln,设置断点,调试。

2. NSDK 自动化测试

NSDK具有高效的自动化测试体系。在Windows平台,NSDK将自动化测试和代码覆盖结合起来,这样可以更合理的对接口、模块进行自动化测试。

自动化测试是软件质量和高效开发的重要基础,同时也是站在源代码层面上对系统进行优化的重要手段之一。自动化测试是指利用计算机自动进行的测试,一般自动化测试都是用代码(或脚本)完成的。NSDK的自动化测试方法有:

(1)源代码级的自动化测试;

(2)NC/NScript级自动化测试系统(包括应用场景自动化测试)。

C. NSDK通过代码覆盖改进单元测试、提高代码覆盖率

(1)提高代码的覆盖率实际上就是进行了更完整的单元测试;

(2)充分利用代码覆盖的好思路;

(3)有些IDE不支持代码覆盖,如果语言是C/C++,尽量编写适合于该IDE和Visual Studio通用的代码,这样前期看是麻烦,实则是高效的方法。

第十章 NHTML模块

NSDK开发了自己的NHTML,NHTML 是HTML与NC、实时库结合的产物,可以动态生成.NHTML页面,具有强大的动态HTML页面生成能力。不需要编码,就能定制各种形式的.NHTML页面。

第十一章 部分基础API(摘录)

// 路径处理API

_ZAPI _bool     PathIsValid(_string szFileName);
_ZAPI _void     PathReplace(_string szPath, _string szFileName, _string szExt);
_ZAPI _void     PathRegular(_string szPath);
_ZAPI _IntPtr   FileOpen(_i32 iFileType, _string szFileName, _i32 iOpenMethod = OPEN_METHOD_NORMAL);
           

// 文件操作API

_ZAPI _IntPtr   FileCreate(_i32 iFileType, _string szFileName);
_ZAPI _void     FileClose(_IntPtr hFile);
_ZAPI _i32      FileRead(_IntPtr hFile, _void *pBuffer, _i32 bytes);
_ZAPI _i32      FileWrite(_IntPtr hFile, _void *pBuffer, _i32 bytes);
_ZAPI _i64      FileGetSize(_IntPtr hFile);
_ZAPI _i32      FileSetSize(_IntPtr hFile, _i64 size);
_ZAPI _i64      FileSeek(_IntPtr hFile, _i64 offset = 0, _u32 iMoveMethod = ZFILE_SEEK_CURRENT);
_ZAPI _byte     *FileGetPtr(_IntPtr hFile, _i32 offset = 0);
_ZAPI _i32      FileGetUsed(_IntPtr hFile);
_ZAPI _i32      FileGetTag(_IntPtr hFile);
_ZAPI _bool     FileSetUsed(_IntPtr hFile, _i32 used);
_ZAPI _bool     FileSetTag(_IntPtr hFile, _i32 tag);
_ZAPI _i32      FileSaveAs(_IntPtr hFile, _string szFileName);
           

// 文本处理API

_ZAPI _i32      Length_UnicodeToUTF8(_string szUnicodeText, _i32 iUnicodeLen);
_ZAPI _i32      Length_UTF8ToUnicode(_ascii0 szUtf8Text, _i32 iUtf8Bytes);
_ZAPI _i32      UnicodeFromAnsi(_ascii0 szAnsiText, _i32 iAnsiBytes, _string szUnicodeText, _i32 iUnicodeLen);
_ZAPI _i32      UnicodeToAnsi(_string szUnicodeText, _i32 iUnicodeLen, _ascii0 szAnsiText, _i32 iAnsiBytes);
_ZAPI _i32      UnicodeFromUTF8(_ascii0 szUtf8Text, _i32 iUtf8Bytes, _string szUnicodeText, _i32 iUnicodeLen);
_ZAPI _i32      UnicodeToUTF8(_string szUnicodeText, _i32 iUnicodeLen, _ascii0 szUtf8Text, _i32 iUtf8Bytes);
_ZAPI _i32      UnicodeFromUnicodeBE(_string szUnicodeBEText, _i32 iUnicodeBELen, _string szUnicodeText, _i32 iUnicodeLen);
_ZAPI _i32      UnicodeToUnicodeBE(_string szUnicodeText, _i32 iUnicodeLen, _string szUnicodeBEText, _i32 iUnicodeBELen);

_ZAPI _DynStr   TextFileRead(_string szTextFile, _i32 *p_ret = NULL);
_ZAPI _i32      TextFileSaveAs(_string s, _string szTextFile, _i32 encode = UNICODE);
_ZAPI _i32      TextFileLogging(_string msg, _string szTextFile);
           

// 自动化测试API

_ZAPI _void     TestRemoveOutputFile();
_ZAPI _IntPtr   TestCreate(_DynPtr &szOutputCollection, _i32 iTestOption = TEST_OPTION_PRINT_ALL);
_ZAPI _i32      TestGetOption(_IntPtr hAutoTest);
_ZAPI _void     TestSetOption(_IntPtr hAutoTest, _i32 flag);
_ZAPI _i32      TestGetPassCount(_IntPtr hAutoTest);
_ZAPI _i32      TestGetNotPassCount(_IntPtr hAutoTest);
_ZAPI _i32      TestGetTotalCount(_IntPtr hAutoTest);
_ZAPI _void     TestClose(_IntPtr hAutoTest);
_ZAPI _void     TestReport(_IntPtr hAutoTest, _string szTestName = NULL);
_ZAPI _void     TestOutput(_string s, _IntPtr hAutoTest);
           

// 内存处理API

_ZAPI _i32     MemInit(_string szModuleFile);
_ZAPI _IntPtr  MemCreatePool(_i32 iPoolType, _i32 size, _bool bKeepReserved = _true);
_ZAPI _IntPtr  MemOpenPool(_i16 iAppNo, _i16 no);
_ZAPI _IntPtr  MemGetDefaultPool();
_ZAPI _DynPtr  MemAlloc(_i32 size, _IntPtr hMemPool = NULL, _i32 reserved_size = 0);
_ZAPI _DynPtr  MemReAlloc(_DynPtr pBuffer, _i32 iNewSize);
_ZAPI _void    MemFree(_DynPtr pBuffer);
_ZAPI _i32     MemGetSize(_DynPtr pBuffer);
_ZAPI _void    MemSetFlag(_DynPtr pBuffer, _i32 flag);
_ZAPI _void    MemSetDataType(_DynPtr pBuffer, _i32 iDataType); 
_ZAPI _void    MemSetExpandMethod(_DynPtr pBuffer, _i32 iExpandMethod, _i32 iExpandValue);
_ZAPI _void    MemWalk(_IntPtr callback, _IntPtr pContext = NULL);
_ZAPI _void    MemWalkPool(_IntPtr hMemPool, _IntPtr callback, _IntPtr pContext = NULL);
_ZAPI _i32     MemStatistic(_IntPtr hMemPool, _i64 &used, _i64 &free, _i64 &reserved);
_ZAPI _void    MemClosePool(_IntPtr hMemPool);
_ZAPI _void    MemPrintDetail(_string s = NULL);
_ZAPI _void    MemSetOwner(_DynPtr pBuffer, _IntPtr pOwner);
_ZAPI _i32     MemCopy(_DynPtr pBuffer, _i32 offset, _void *pData, _i32 iDataSize);
_ZAPI _i32     MemCopyEx(_DynPtr pBuffer, _i32 offset, _void *pData, _i32 iDataSize);
_ZAPI _i32     MemMove(_DynPtr pBuffer, _i32 offset, _void *pData, _i32 iDataSize);
_ZAPI _i32     MemMoveEx(_DynPtr pBuffer, _i32 offset, _void *pData, _i32 iDataSize);
……
           

附录:NSDK灵魂工程师简介

《周氏软件开发思想体系》 ── 周国兵,纳信首席架构师,是具有综合能力的高级软件架构师。有25年软件研发经验,有十五年自动化测试经验,有软件研发的天赋,自1994年大学毕业以来一直从事软件研发工作,酷爱编码,并把编码作为一生挚爱,从未间断过编码,对软件开发质量和效率有着不懈的追求,组织开发过大型软硬件嵌入式产品和大型组态软件。通过25年的实践、学习(研究微软研发生产力十五年)、研究和深入思考改进积累了一整套企业软件研发思想体系,该体系包括软件研发(质量+效率)、软件管理(绝密开发、版本管理、源代码管理)、软件测试、软件研发人员绩效管理及软件安全。

对系统底层和软件算法有深入的研究;精通8086汇编、C、C++和C#语言;擅长掌控软件的质量和进度;擅长软件架构和性能优化;擅长编码和调试;擅长提升企业的软件生产力。

善于深度思考,极其注重时间和效率。事业心极强。每天所做所想,一切为了事业,心无旁骛,精神高度集中,并且非常热爱自己的事业,虽付出接近716,但不觉得累,在事业上是一个有深度思想的人。虽然50岁了,但仍然有充沛的精力,非常好的记忆能力和非常强的脑力。

至诚至刚,责任心强;工作狂;做事追求完美,能把软件做到极致,把问题当机会,通过一个问题挖掘同一类问题的最优解决方案,适合开发精品平台及软件。

爱好广泛:围棋,业余三段;象棋,善下盲棋,中高等水平;台球,中高等水平,年轻时喜欢打篮球,善于指挥团队作战,擅长滑旱冰,运动爱好者。

研究人的性格特点五年,对人的洞察力很强,性格黄蓝(黄色:行动者·支配者·外向·理性·意志坚定·喜欢挑战·实用主义·灵活高效·有恒心·坚持原则·天生的领导者;蓝色:思考者·内向·理性·有天赋有才能·客观公正·追求完美·注重细节·坚持原则·高度自律·有恒心·喜欢安静·真诚关怀他人·追求性价比·甘愿幕后),勤奋好学,谦虚严谨,善于学习,具有快速学习能力,深度学习能力和深度思考能力,灵活多变,举一反十,意志坚定,善谋略。

继续阅读