软件编程技术水平的标志性关键点分析

Title: 软件编程技术水平的标志性关键点分析

刘振兴 / Liu Zhenxing

摘要:软件编程技术水平的考评与分级是困难的, 同时也是必要的。本文在相关文献检索和经验总结的基础上提出了软件编程技术水平的三个具有标志性的关键点并逐一对其进行简述和应用分析. 这三个分水岭一样的关键点是正则表达式、软件开发框架的掌握与运用和现实世界问题数学模型创建技能的掌握与运用。与之对应地我们称呼具备相应技能水平的人员为工程师、高级工程师和技术专家。

关键词:软件编程;技术水平;正则表达式;软件开发框架;数学建模

中图分类号:TP311.5                     文献标识码:

An Analysis on Key Points of Software Programming Technology Level

LIU Zhen-Xing[1]

【Abstract】It is not only difficult but also necessary for software programming technology level of assessment and classification in software industry and Internet+ sectors. Based on the related literature search and directional experience, this paper puts forward three key points of software programming technology level and analyzes them briefly on their applications one by one. The watershed-like three points are regular expression, the mastery and application of the software development framework and the mastery and application of the creation of skills in the mathematical model of the real world. Correspondingly, we call them with the appropriate level of skills as the engineers, senior engineers and technical experts.

【Key words】Software Programming; Technology Level; Regular Expression; Software Framework; Mathematical Modelling

1   引言

计算机专业及软件产业属知识密集型领域,其中最重要的资源是人力资源,软件开发人才的培养与甄选日益重要。同时,传统软件行业的快速发展叠加移动互联网、互联网+、人工智能战略布局稳步推进,催生了大量的软件开发从业人员。对软件编程水平及能力的评估是一件复杂而又严肃的事情( -R/02SI , [1] [2]),出于对自身或者同行技术能力的评估需求 [3],也需要在某些方面从某种程度上,对编程水平及能力有些大概粗略的感性认识。关于软件工程美国IBM公司的软件技术专家布鲁克斯(Frederick Brooks)在其论文中提到软件编程受目标任务的复杂度、一致性、可变性和不可见性的约束,在各种约束条件下取得均衡和达成目标就是对软件编程技术及水平的考察与验证 [4] [5]。

IT行业技术巨头往往会开展一些编程技术水平认证,如微软公司的MSDN,思科公司的CCIE等;一些行业学会、协会也会推出一些编程技术水平认证,如美国IEEE下计算机协会的各种认证和中国计算机学会的“CCF计算机职业资格认证” [6]。这些认证往往是基于某些厂商自家产品或者囿于特定领域的认证。是否有通用的可供参考的软件编程水平的参考标准?带着这个疑问,我们进行一些文献检索,同时结合我们多年学习、工作中编程实践、思考与经验总结,在本文如下部分提供如下三点作为软件编程技术水平的参考。

中国近代学者王国维将做学问的状况划分为三个境界,分别是“望尽天涯路”、“为伊消得人憔悴”和“那人却在灯火阑珊处”。写程序研发软件也有如下三个具有标志性的关键点,我们称之为软件编程的三个分水岭一样的标志性关键点,他们分别是正则表达式的运用、软件开发框架的掌握与运用和现实问题数学建模的掌握与运用。

余下的章节中,第二节我们讨论了正则表达式及模式识别相关的理论及技术应用,第三节讨论了软件开发框架在软件研发及其生命周期中的地位及作用,第四节讨论了针对现实世界问题进行数学模型创建的相关应用,然后是针对全文的总结和展望。

2   正则表达式

正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,可以视之为狭义上的模式识别(Pattern Recognition),也可以将其视作在某种编程语言下的子类语言——用来描述其他语言的“语法”。使用它有一定的难度,句法全由符号表达,看起来抽象,可读性差,不容易理解。比如,

/^([0-9]{1,6})$/g

表示任意1位到6位的数字,也即0~999999 ,在匹配结果集中,将反向引用被匹配到的数字串,

/^(\d{1,6})$/

表示与前文相关的语法。下图(图 1)展示一个正则表达式工作机制的应用程序 [6],将前述正则表达式输入到“Regular Expression”相关区域,在“Test String”里输入相应待检测、匹配的文字,则下面“Match Information”区域会显示匹配过程及结果。


图 1 正则表达式匹配样例
Figure 1 Example of Regular Expression

正则表达式被广泛的应用于很多软件中,包括 *nix(Linux, Unix等)、HP 等操作系统,PHP、C#、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。如对外部输入的校验、提取,对目标对象的格式化等。

每种编程语言在进阶开发和使用时都有不少需要特别关注的地方,如指针、内存、链表和树、正则匹配等,若在这些不同的语言之间寻找共性的进阶开发所需掌握的技能,则正则表达式是其中关键点之一。

掌握了某种编程语言的基本数据结构和流程控制之后,一名软件工程师(或称程序员)若能够运用某种编程语言进行读写文件、数据库和通过网络收发数据,则其就是一名合格的软件工程师。具备这样素质的人可以胜任一般的软件开发任务,能够面向任务较好地完成给定的软件开发需求,实现相应的功能。

由于计算机科学兴起之处,其主要应用是对数据和文本的处理,所以正则表达式成为进阶开发的必由之路也在情理之中。初阶的开发人员往往止步于使用字符串查找、分割等方式来部分地完成相应功能。

正则表达式本身就是一门学问,已经有很多书籍专门就此展开详述,其中有本《精通正则表达式》(Mastering Regular Expressions)的书 [8],在豆瓣网有一个广为赞许的评价为面向“愿意从一个代码工人向专家进化的” (-R/A2SI )。

相比较而言,掌握和熟练使用正则表达式工具的软件编程人员能够高效而准确地实现相应的功能,我们称之为第一个分水岭。

3   软件开发框架

软件开发框架(Software Development Framework)软件开发框架(Framework)是代码组织和软件逻辑实现的思考方式。这种思考更多的是“管理”的视角,而非计算科学技术的视角。这种管理的方式是建立在对软件编程技术较深入、全面理解的基础上的。一般意义上的软件框架,是指为解决一个开放性的计算问题而设计的具有一定约束性的软件支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的IT技术方案 [9] [10] [11] [12]。软件框架本质上是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。简而言之,是构建结构及实例交互方法的结合体。

一名软件编程人员在掌握了某一种编程语言之后,随着所解决的单个、多个任务的积累,终将会面临一个复杂任务——任务复杂到不能通过一个或几个小程序能够实现和满足其功能,这时候就需要从整体上思考,需要多少个程序(模块),这些程序和模块之间如何交互?软件框架就是要回答这些问题。

3.1          软件开发框架的特征

软件框架是成功软件项目的一般化实现。进入视野或者进行开源的多数软件框架都经历过一个或者多个成功项目的检验,是成功经验的积累。软件编程者当完成一个项目后,如果发现项目本身有可以进行一般化处理的代码段或功能模块,会对其进行封装以便后续使用,软件的组成架构设计也是这样,当发现所用的设计具有一般性后,就可以在随后的项目中继续使用,继而形成“框架”。框架不一定都开源,一些私有的或者基于开源定制的框架可能在某些方面具有更好的表现。

软件框架普遍实现了关注点分离设计(Separation of Concerns)和代码复用(Code Resue)。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过侧面来封装、维护,这样原本分散在整个应用程序中的变动就可以很好的管理起来,如常见的MVC分层设计(模块Module、视图View和控制器Controller)。


图 2 架构设计中的关注点分离
Figure 2 Separation of Concerns in Framework Design

代码复用本质上就是对曾经编写过的程序代码的一部分甚至全部重新加以利用,从而构建新的程序。使用这种方法就可以将程序员从费时费力的重复劳动中解放出来。框架(类库)是一种代码复用的很好的形式。编程人员可以创建内部抽象以便程序的部分代码可被复用,或者直接创建一个自定义库给自己使用。一个规划和设计良好的框架应该是实现了上述两点。

清晰的关注点分离和高效的代码复用是避免软件项目陷入泥潭(the ball of mud)的基础和前提,也是软件项目成功的保证。

3.2          跨语言的软件开发框架

各种编程语言分别有许多不同的软件框架。例如,C++编程语言的框架(类库)有.Net、STL、Boost、Qt、MFC等;Java编程语言的框架有Structs、JSF、Spring MVC、Wicket、Stripes、Seam、GWA2等;PHP编程语言的框架有Zend Framework、Yii、Code Igniter、Lavarel、Symfony2、GWA2等;JavaScript编程语言的开发框架有Angular.js、Backbone.js、D3、jQuery.js、React.js等。

一个软件开发框架一般都与所使用的某种编程语言高度绑定。这一方面是框架需要高度复合利用了编程语言的特性,使之能够在该框架下将其性能发挥至极致;另一方面是框架的开发者和使用者需要具备指定开发语言的软件编程的基本知识。在此之外,也有为数不多的跨编程语言的软件开发框架,比如上文提到的“通用网络应用架构(GWA2) [13]”——提出一种软件架构思路,然后分别使用Java、PHP、Perl、C#等语言进行实现,从而有了针对各个编程语言的软件开发框架的版本。软件开发人员在其中一门编程语言下使用GWA2之后,可以无缝平滑地切换到另外一种开发语言继续使用对应版本的GWA2进行开发,重新学习成本降低为几乎为零。


图 3 GWA2 多层架构设计(DBA)
Figure 3 Multiple Layers in GWA2 (DBA)

通常软件编程对软件框架的应用可以分为两类:学习和使用一种软件框架,或者自行开发一套软件框架。学习有学习的成本 [14],开发也有相应的开发风险。显然,前者会更多一些,许多软件编写都是遵循某种软件框架而进行的。对软件框架和类库应该持有某种谨慎的态度,我们在早前针对JavaScript编程的框架做过一些分析(《自行创建类jQuery的JavaScript库》, -R/02SH , [15]),在学习成本、需求匹配度和框架性能三个方面需要做一些权衡。

相比较而言,我们推荐使用具有跨语言特性的软件开发框架,由于软件技术自身发展和开发人员自身成长是日新月异的,所处的时空变换要求每一名开发人员要掌握两种以上软件开发语言,相应地,如果其所依赖和学习的软件开发框架没有跨语言特性,则软件开发人员就需要付出两倍的学习成本;相反地,如果开发人员使用的是具有跨语言特性的开发框架,如上所述的GWA2,则可以平滑无缝地切换到新编程语言中去,无需再从零开始学习另外一种软件开发框架。

像武学的拳术一样,一招一式组成一套拳法,也像文学的八股一样,起承转合组成一篇文字,软件编程中的这套拳法就是“框架”。软件框架没有好坏,或者都是“好的”,使用者所需工作是寻找“合适的”,因时因地使用能够满足业务需求的框架就是合适的,是好的,既要避免不足(Underqualified),也要考虑不会多余(Overqualified)。 

我们将软件编程的第二个分水岭视为使用软件框架进行开发。无论是学习一个现有的软件框架或者开发一个全新的框架,都需要完整的软件框架知识。开发一个全新的框架需要知识、勇气和精力,而学习一个现有的框架其应用水平该如何来衡量呢?是否对原软件框架的源代码递交过Bug或做过修改、打过补丁,这是在读懂源代码的基础上对软件框架有进一步提升的动议。

4   现实问题数学建模

学习计算科学与技术,在掌握了基本的学科知识之后,应用层面所面临的专业细化就是使用计算机进行文本分析与处理,进行图像的分析与处理,对音频的分析与处理。对文本、图像和音频的计算是三个主要方向,后续可能还有机器学习或者人工智能,这些是使用计算机技术解决现实客观世界的主要方法和途径。本质上看,作为人工智能的代表方法之一机器学习就是计算机利用输入的样本,调整一个通用数学模型的参数,使得这个模型能正确地回应新的输入 [16]。

在掌握了某一种编程需要的单个程序应用,熟悉了由多个程序组成的软件项目的组织结构和运行流程,接下来就是使用这些知识和技能解决现实世界的问题。对现实世界的问题进行数学建模是主要方法之一,这样才能对问题进行计算。

具有一定的数学思维是进行数学建模的前提。观察客观世界的现象,抓住其主要特征,抽象出概念或者建立模型;进行探索,通过直觉判断或者归纳推理、类比推理以及联想等作出猜测;然后进行深入分析和逻辑推理以及计算,揭示事物的内在规律,从而使纷繁复杂的现象变得井然有序。这其中进行分析、推理和计算的过程,就需要借助计算机进行软件编程。

计算机领域的实际问题数学建模(Mathematical Modeling)需要根据现实问题设计相应的算法(计算过程),求解描述实际问题的数学公式、函数等,进而通过这些数学公式、函数解释、验证实际问题,对当下进行计算,对未来进行分析、预测等 [17]。这类知识、规律的发现越来广泛应用到各种个性化、智能化服务当中。


图 4 数学建模的逻辑表述
Figure  Mathematical Modeling in Logic Representation

基于全样本的大数据集,运用测试分析方法开展的机器学习、人工智能等越来越多的被应用到各种软件编程应用场景。利用机器使用测试分析方法逐渐取代人工的机理分析,成为发现知识和规律的主要途径之一。

问题建模是将现实问题简化,使其变成“可计算”,然后使用编程将可计算的部分以软件功能的形式表现出来。编程是建模实现的一种重要工具和手段,针对问题进行数据建模后的拟合、仿真和计算过程才是软件编程大展身手的地方。在数学建模的实践中,几乎没有哪个模型是不需要用到如MatLab、SPSS、Lingo、C/C++或Python这样的编程工具的。这些将我们用数学语言描述的问题再通过计算机来实现,编制良好的程序确实能极大地帮助我们模型的实现,甚至取得更好的效用。

网络发展的如此迅速,一些IT公司会面临各种实际问题需要进行数学建模,而这些互联网公司往往没有数学专家,只有计算科学与技术专家,这就需要此前从事软件编程工作的人员对实际问题进行数学建模,并使用软件编程来实现它。IT公司面临的问题既有其本身发展的需要产生的,也由全社会发展面临的难题。机器翻译是这样的,人脸识别、人工智能都是这样的。逐渐多的,面向各种问题的“算法”工程师、技术专家的需求量增加,正是这一趋势的发展现象。

能不能对现实世界的实际问题进行数学建模,成为我们称之为第三个分水岭的关键点。 

5   结论与展望

本文简要分析了软件编程技术水平的三个具有标志性的关键点——正则表达式、软件开发框架和数学建模。这些分水岭似的关键点有助于软件开发人员甄选,也对软件开发人员自身水平认识起到一定的参考作用。同时,这些知识点也能够从另外一些方面引导软件编程、开发人员尽快、尽早的掌握这些知识和技能,提升自身知识水平。

对软件编程的技能对计算科学与技术的水平进行分层分级是困难的,我们就此列出的三个具有标志性意义的考察点在某些场合并不适用。然而,在一般意义上来说,能够熟练掌握正则表达式、能够掌握并对已有软件框架进行修正或者开发一种软件框架我们将之视为高级计算技术人员;能够对现实世界需求问题进行数学建模,并将其映射为软件应用,我们称之为技术专家。

计算机及软件行业在不断发展变化中。一些编程语言或者编程工具会随着整体发展或日益完善或日渐凋零,只有那些隐藏在编程技能背后的原理与思想保持不变,并随着技术的进步以另外一种编程语言或表现形式再次出现在软件研发行业。

因此,对软件编程技术水平的考评既不能以某一个厂商的某种产品为基准,也不能以一时的技术平台或编程工具为依托,从技术或技能背后的编程原理、编程思想来设计相应的考评体系更能够全面整体地反映出从业人员的真实水平,也许未来可能有其他等同于正则表达式等这三点的参考标志出现。

[参考文献] (References)

[1]

中国计算机技术职业资格网, “计算机技术与软件专业技术资格(水平)考试简介,” 10 2015. [联机]. Available: http://www.ruankao.org.cn/focusExam/ksjs/detail/news-00005/. [访问日期: 09 2017].

[2]

李二霞, 软件编程高端人才效标群体研究, 西南大学, 2010.

[3]

冯向科,邓莹,彭勇, “高职软件技术专业学生的面向对象分析、设计和编程能力培养的研究,” 科教导刊, 卷 28, pp. 41-42, 2011.

[4]

布鲁克斯(FrederickP.Brooks.Jr.), “没有银弹-软件工程中的根本和次要问题,” 出处 人月神话, 北京, 清华大学出版社, 2002.

[5]

李娜, “浅谈软件工程技术发展,” 软件, pp. 204-205, 03 2014.

[6]

中国计算机学会, “CCF计算机职业资格认证简介,” 02 2014. [联机]. Available: http://cspro.org/lead/info.do?__action=info_view&catalog=notice&id=hrvnsypp-1gg&__forward=true. [访问日期: 09 2017].

[7]

F. Dib, “Regular Expression 101,” 08 2012. [联机]. Available: https://regex101.com/. [访问日期: 09 2017].

[8]

J. E·F·Friedl, 精通正则表达式(Mastering regular expressions), 第三版, 北京: 电子工业出版社, 2007.

[9]

D. Riehle 和 T. Gross, “Role Model Based Framework Design and Integration,” 出处 Proceedings of the 1998 Conference on OOP Systems, Languages and Applications, ACM Press, 1998.

[10]

袁立国, 陈中育, 李方 和 郭婷, “一种软件开发框架的设计优化,” 计算机系统应用, 卷 22, 编号 5, pp. 70-74, 2013.

[11]

O. Vogel, I. Arnold, A. Chughtai 和 T. Kehrer, Software Architecture: A Comprehensive Framework and Guide for Practitioners, Heidelberg, Germany: Springer Science & Business Media, 2011.

[12]

张合 和 刘小红, “面向对象的对象建模技术及其应用研究,” 软件, pp. 66-68+72, 03 2011.

[13]

刘振兴, “GWA2,” UFQI.COM, 11 2011. [联机]. Available: https://ufqi.com/dev/gwa2/?_via=-naturedns. [访问日期: 09 2017].

[14]

金旭亮, “如何学习复杂的软件技术开发框架?,” 07 2017. [联机]. Available: https://weibo.com/ttarticle/p/show?id=2309404135192531986821#_0. [访问日期: 09 2017].

[15]

刘振兴 和 张楠, “自行创建类jQuery的JavaScript库,” 中国计算机学会通讯, 卷 06, 编号 6, 2013.

[16]

应行仁, “什么是机器学习,” 中国计算机学会通讯, pp. 42-45, 04 2017.

[17]

谢金星 和 姜启源, “清华大学公开课:数学模型-现实世界的理性视角,” 网易公开课, 04 2013. [联机]. Available: http://open.163.com/movie/2013/4/9/6/M98EVI91I_M98PE9E96.html. [访问日期: 09 2017].

 

作者简介:刘振兴(1977-),男,硕士研究生,原人民网研究院网络技术研究员,中国计算机学会会员(14229M),主要研究领域包括计算机网络通信协议、互联网后台支撑技术和网络架构与安全等.

(原文登载于 《软件》(Computer Engineering & Software),2017年11月号,有改动)

This entry was posted in -GWA2, 编程技术, 计算机技术 and tagged , , , , . Bookmark the permalink.

One Response to 软件编程技术水平的标志性关键点分析

  1. Pingback: 软件编程技术水平的标志性关键点分析 | -wordpress-wadelau

发表评论

电子邮件地址不会被公开。 必填项已用*标注