编程漫谈——问题,套路与工具


title: 编程漫谈——问题,套路与工具
date: 2017-12-27 13:21:11
tags:

  • 心得
    categories:
  • 编程漫谈

  本文是我在2017年12月团队Workshop上所讲内容的底稿。为方便各位同学学习交流,发布于此。

主题1:系统设计-信息管理与算法实现

视角:科研VS产品

  在科研过程中,我们经常需要自己动手实现一些算例验证算法。我们通常会进行多组算例的验证,这些算例的背景可能大不相同。例如,如果我要实现开行求解开行方案编制问题的算法,而我此时有两套数据:公交网络和铁路网络。这两套网络的数据结构不相同,以构建网络中的弧为例:

公交网络弧段:前序弧段,后续弧段...设计速度,道路宽度,道路长度...
铁路网络弧段:前序弧段,后续弧段...运营速度,长度,坡度,信号制式...

  当然,如果就算法实现而言,我们只要把这两个网络相同的部分建模实现就好。即:

抽象弧段:前序弧段,后续弧段

  但是,当我们需要把算法包装成产品(推向市场或者完成实际项目),这样做是不够。如果一个产品仅仅实现一个算法,对于使用者来说,学习的成本太高(这里的使用者包括企业用户和科研用户)。所以通常我们还需要在产品中集成另一部分功能——信息管理。

  这里说的信息管理根据对不同项目有不同的含义。以我亲身参与的几个项目来说:

项目名称 项目维护的信息 采用的算法
项目A:铁路货场管理 货位,股道 状态机模型
项目B:工务管理 钢轨,道岔及其相关配件的状态数据 HMM
项目C:地震管理 地震,铁路路网,列车时刻表 插值算法
开行方案评估项目 铁路路网,时刻表信息

  通常,这些信息可以存放在文件系统或者数据库中。通常信息管理要实现的功能就是对这些信息记录的增删改查(CURD)。信息管理的功能单一,而且一般来说在不同编程语言下都有比较好的工业化实现(Java 的 SSH框架 .NET 的 Entity Framework)。

  所谓“大“系统,无非就是集成了信息管理算法实现这两个功能的系统。同时在此基础上再提供良好的交互和丰富的接口,使之能为更多不同目的的使用者服务。

挑战:如何设计一个大系统

  那么如何设计这样一个“大”系统呢?其中的主要问题是,相对于比较成熟的信息管理系统,算法的实现占了更大的比重,这也就要求有更好的方式将两者集合起来。以时刻表管理功能为背景,需求如下:

  • 实现时刻表在数据库中的增删改查。

  • 从时刻表中计算指标,如车数、平均旅行时间、可达性等等。

回顾:开行方案评估系统

  评估系统主要功能有:

  • 维护路网、时刻表、和客流信息。

  • 时刻表分析和指标计算

  • 客流分析和指标计算

    评估系统主要采用的是三层结构,一个具体的例子如下:

评估系统分析.png

  这种结构好处很明显:每个模块结构紧密,易于理解。

  缺陷:

  • 算法复用性问题

   在这个结构中,算法是在manager中实现的。对于不同项目数据模型model大不相同。由于manager对model的依赖。导致增加了model后也需要对manager进行修改,违反了“开闭原则”(对扩展开放,对修改关闭)。而事实上算法的核心功能并未改变。

      public class ShortestPathSearcher
      {
        public Path DoSearch(RailwayNetwork net)
      }

   如果上述网络中的 RailwayNetwork 被替换为 AirNetwork 那么整个ShortestPathSearcher类都要被修改。而这种修改显然是不受欢迎的。

  • 充血模型问题

   在这个结构中,从设计上来说是要放manager的。但是实际中,业务逻辑有时被放到model中,有时也被放到manager中。

   例如在计算列车收入指标中,某tjn同学在TTtrainInfo类中加入:

public class TTtrainInfo
{
  ...
  double TotalRev { get; set;}
  ...
}

   虽然这个错误的产生于充血模型无关,但是这种结构允许了错误发生的可能性。

设计:DDD驱动架构

   领域模型驱动设计(Domain-Driven Design, DDD),是一种更加贴近业务实现的设计方式。在此基础上,我将算法需要的输入和算法实现分别抽出,成为两层。

系统层次.png

具体来看:

包关系.png

从应用实现的角度上来讲(还是以时刻表为例):

DDD驱动设计.png

应用:客票销售仿真系统

每一层要实现的功能:(以客票销售仿真系统为背景)

  • 表示层:这一层主要负责与用户的交互逻辑,实现可以是Winform\WPF\ASP.NET
表示层.PNG
  • 应用层:这一层有两个任务:

    • 整合核心算法和领域资源
    • 提供访问各功能的接口


      功能实现.png
  • 领域层:要维护的信息对象的结构

  • 基础设施层:信息对象的持久化,与数据库、文件系统交互。

主题2:一个套路 OO+Matlab+Yalmip+Cplex

   虽然大系统的愿景很美好,但是付出的时间成本也是很多的,对于交通专业的硕士生同学来说,独立开发一个大系统难度确实太大。而且大部分时候,为了验证一个模型去开发一个大系统也是得不偿失的(没有人会这么做)。

   那么,如何应对这种快速开发的需求呢?

   解决这个问题的关键就是尽量用“胶水”而非造“轮子”。Matlab/Python都是不错的“胶水”,而Cplex或者一些第三方C++/.net库都是好用的“轮子”。

套路.png

主题3:一个重要代码工具 Git 与合作平台 Coding.Net

Git是什么?

  • 一款免费、开源的分布式版本控制系统

  • Git是文件管理系统

  • Git以目录的方式管理文件

Git.jpg

为什么使用Git?

  • 简单、高效
  • 适合团队协作

工作流程

git工作流程.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容