• 作为公共组软件工程师如何工作


       
    1    为什么需要公共组
    1.1    专业化分工带来高效
    一    对软件开发而言,专业化分工的好处
    专业化分工使得每个软件工程师需要的知识和技能减少,这意味着:
        降低了软件工程师的成长难度,降低了学习成本和培训成本。
        招聘目标明确化,补充人员变得简单。
        每个软件工程师成长目标明确化,方便他们成长。
        专业化分工使得使得某些工具变得有用(如:pclint, logiScope)
        专业化分工,使得天赋不同的软件工程师都能发挥自己的特长。比如:大部分软件工程师都对界面和业务不敏感,让专人去做界面和业务相关的东西,不但可以提高效率,还可以减少其他软件工程师的痛苦。
    二    软件分工的想法
    子工种    分工理由
    公共组软件工程师    复用
    界面层软件工程师    方便新人工作,大部分软件工程师没美感。
    数据层软件工程师    方便新人工作。
    业务逻辑层软件工程师    大部分软件工程师都是内向型,所以由专职人员和产品经理甚至客户沟通比较合适。
    核心逻辑层软件工程师    核心所在,必须由最强的人员负责。
    公共组软件工程师在一人开发软件的时候也有价值,如提取多个软件(如:服务端、客户端、主程序、辅助工具)共用的功能。
    1.2    复用
    一    复用优点
        直接使用以前积累的组件,可以减少很多工作量。不但减少开发的工作量,还减少测试、售后的工作量。减少工作量意味着降低成本、缩短工期。
        更高的质量,公共库的组件往往经过了更多的测试(往往有自动化测试)和其它产品的验证。
        统一的风格。同一个团队的不同产品风格一致,可以降低用户的学习成本。
    二    复用实践
        2010年末到2013年中,萌芽阶段。简单的将服务端、客户端、单机版、辅助工具共用的内容封装成一个库。
        2013中到2013年末,将一个库拆分成多个库。
        2013年末到2017年六月,利用业余时间不断完善这些库。
        2017年6到10月,利用找工作的空隙,基本完成此库。
        2017年10到2018年11月,利用此库完成职位作品《CAD图纸大师》,此库得到了验证。
        2018年11月到现在,增加了新库三维算法库,完成了整个库重要功能的单元测试的自动化。
    2    公共组成员特点
    相对于其他开发组,公共组的工作更偏向底层,这意味着缺陷更容易暴露。这使得公共组成员往往具有以下特点:
        重视开发质量,轻视开发速度。
        重视开发技术,轻视业务逻辑
        较强的单元测试和自动化测试能力
    3    公共组成员职责
    3.1    一般团队公共软件工程师职责
        公共功能(多个开发组共用功能)
        自有类库的开发和维护
        辅助工具软件的开发
        第三方框架、类库的体验和学习
        常用的第三方框架、类库的扩展化
        代码重构。
        新技术跟踪、介绍、实验。新技术的跟踪必须上报给技术总监,以防不符合公司目标乱跟踪或跟踪方法和思路不对。
    3.2    小团队公共软件工程师职责
    一    职责
    如果可能,不分给他配具体的项目上的任务,让他专心做两件事:整理代码和写注释文档。
    其它组的软件工程师都忙,没时间整理代码。此人就算是新手,见的多了,翻的多了,就熟悉了。因为他要看别人的代码,而且他有充足的剩余时间去百度上搜索,研究,他的水平慢慢就会上去。
    仅仅从程序员的角度写,不管其他的项目文档什么的。
    二    好处
      用这个骨干的好处有很多,一个是,让他从框架的角度把握程序质量,有他在,出不了大乱子。第二个是他要维护程序文档,从模式或者组件或者思想的角度来写这个文档,即便公司里铁打的营盘,流水的兵,因为在他这有良好的文档,所以新来的人,都有据可循。第三个,因为他常常检查代码,就能总结出好和不好来。货比三家,有些程序员也就跟着提高了,总写不好的代码,他不好意思。第四个,这人是后备军,以后公司假如有成长壮大的时候,这个人就是骨干人才。
    4    已整理的类库介绍
    4.1    SNGraph
    一    点、向量
    基本运算
    二    直线(线段、射线)
    直线(线段、射线)用起点、方向(单位向量)、线段长度表示。
    包括如下功能:
        点是否在直线上。
        假定点在直线上,点到直线起点的有向距离。如果点在直线上,点到直线距离为n。如果n>=0,则点在射线上;如果(n>=0)&&(n <= 线段长度) ,则点在线段上。
        两直线是否平行或重合。
        两直线是否重合。
        两直线是否垂直。
        两直线交点。
        两非平行直线距离。
        求垂足。
    三    平面
    通过过平面一点和方向(单位矢量)表示平面。包括如下功能:
        点到平面的有向距离。通过平面标准法向量和距离,可以求垂足;通过点到平面的距离的正负,可以看出多个点是否在同侧;如果点到平面的距离为0,则点在平面上,否则不在平面上。
        直线是否在平面上
        平面和直线的交点
    通过调用其他功能可以实现的功能:
        平面的法向量平行于直线,则平面和直线垂直
        平面的法向量垂直于直线,则平面和直线平行
        平面的法向量平行(垂直)则平面平行(垂直)
        平行平面的距离等于平面任意一点到另一平面的距离
    四    矩阵
    包括以下功能:
        初始化为单位矩阵。
        为向x,y,z方向缩放建立矩阵。
        为任意方向缩放建立矩阵。投影平面,可以通过向平面法线方向缩放0实现。平面镜像,可以通过向平面法线方向缩放-1实现。
        为对一个点镜像建立矩阵。
        为对一条直线镜像建立矩阵。
        为对一条对称轴旋转建立矩阵。
        求对应行列式的值。
        求逆矩阵。
        求转置矩阵。
        左乘。
        求对应行列式的代数余子式。
        常见运算符。
    4.2    SN
    封装了许多基础的功能。
    一    接口
        读写锁。
    二    避免依赖其它类库
    有些类经常用于库间接口,所以需要避免依赖其它类库。
        字符串类、函数,比如:宽字符、多字符间的转换。
        时间类。
        数组的封装。
    三    其它
        将错误信息记录到全局变量中,应用场景:构造函数和析构函数中throw会引起不可预料的问题。
        安全缓存,额外开辟若干个字节的空间,并初始化为一个特定值,如果不越界,这些值不会改变。
        智能指针,为了将关联降为依赖。CAutoPtr<C> m_pC代替C m_c,头文件中不需要引用C类的头文件。只需要声明C类,在源文件中引用C类的头文件。
        MD5。
        RSA。
        SHA。
        考虑溢出的加减法。比如:int型的10亿加20亿,-10亿减20亿。
        通过表名、列名、某些列的值生成sql语句。
        安全指针和防野指针类。防野指针类:在构造函数中将状态初始为已初始化,在析构函数中将状态设置为已释放。安全指针在使用时之前判断 防野指针类释放是“已初始化”,否则抛出异常。
        将有参数的函数统一成没参数返回值类型void的仿函数。
        遍历文件夹的文件和子文件夹。
        随机数和排列组合。
        系列化和反系列化。将对象和变量转化成二进制,并将二进制转回变量和对象。
        拆分,如字符串。
    4.3    SNMFC
    一    网络功能
        网络基本功能:如获取本机IP,通过域名获取IP,IE版本。
        HTML对话框的封装类。
        用于服务端的,带“回调类”的绑定监听类,利用IO完成端口。
        用于客户端的,带“回调类”连接类,利用select模式完成,可以指定是否开启新线程。连接时,可以指定超时时间,默认5秒。如果直接调用系统的connect,超时时间是75秒。
        能够自动处理“粘包”、“拆包”的二进制解析类。
        安全套接字的辅助类,如:设置发送、连接超时。
        比较服务端的某个文件夹和客户端的某个文件夹,并更新那些md5不同的文件。
    二    多线程
        用临界区实现的线程锁,和线程读写锁。
        窗口辅助类。
        开启一个线程并调用一个函数。
        开启一个线程并循环调用一个函数。
        支持多线程的日志。
        启动一个线程,等待若干秒后,Post或Send一个消息后,结束线程。
    三    界面
        三态树控件。
        列表框扩展类和函数。
        树控件的扩展。
        组合框的扩展。
        关于窗口功能的封装。比如:从左到右依次排列子窗口,排不下则下一行。可以指定行间距。页眉和页脚是行间距的一半。
        位图的加载和显示。

    四    其它
        Ini文件。
        数组封装类。
        获取硬件信息,如网卡。
        文件或文件夹的常用功能。
        注册表的扩展。

    4.4    SNSTL
        数组(向量)扩展。
        用于多线程的向量。
        JSON解析。
        集合的扩展。
        映射的扩展。
        指针向量,可以存派生类。
        指针映射,可以存派生类。
    4.5    其它库
        UnitTest,本机单元测试项目,对整个库的重要功能进行单元测试。
        SNBCG,著名界面库的扩展,几乎没使用。
        SNPicture,图形图像的处理(如转换bmp格式),几乎没使用。
        SNMath,数学及数据结构库,几乎没使用。
    4.6    下载地址和更新
    士农库1.1 头文件、lib、dll 两个测试项目下载:
    下载链接见全文,下载:
    https://files.cnblogs.com/files/he-zhidan/%E4%BD%9C%E4%B8%BA%E5%85%AC%E5%85%B1%E7%BB%84%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C.rar


    5    专业化分工
    5.1    专业化分工实例
    亚当斯密在《国富论》中阐释了分工和专业化可以增加产出,他举了扣针工厂的例子——一个没有受过专门训练的劳动者,无论如何努力,一天也生产不了20枚扣针,但有了分工之后,经过前后18道工序,每人每天可以生产48000枚扣针。这体现出分工的高效率性。
    5.2    专业化分工优点(亚当斯密)
        分工专业化使劳动者的劳动技巧或熟练程度日益增进。
        分工可以减少由一种工作换到另一种工作损失的时间。
        分工使劳动简单化、专门化,从而为机械的发明和使用创造了条件。
    5.3    专业化分工优点(无名高人)
        减少切换任务浪费的时间。
        促进自动化的应用。
        规模经济。
        先天禀赋。
        后天资质。
    5.4    专业化分工缺点
        枯燥、单调、乏味造成了人们在心里上的伤害,导致了员工的厌烦和不满情绪。
        工作之间的协调不开,从而影响了总体的工作效率和工作质量。

    6    软件复用
    软件复用是使用现有软件组件实现或更新软件系统的过程。
    6.1    软件复用的优点
    教科书上列的优点:
        降低成本和开发时间
        产生可靠的软件
        实现标准化,在不同应用中保持一致
    除了教科上列的优点,我自己在实践中发现了如下的优点:
    一    减少调用方出错的可能
    包括但不限于以下情况:
        以前需要几行代码(甚至几十行代码),封装成一行代码。
        新封装的函数减少参数。如:原函数有多个参数,但在本产品(项目)大部分参数不会改变,
        减少非法参数的可能,比如原参数是整形,改成枚举型。
    二    降低学习成本
        再次封装,只暴露需要的功能。每个人只会用到一个组件的5%,但每个人用到的5%不同,所以组件臃肿无比。再次封装可以解决这个问题。
        命令空间(类)具有层次感,且每个命令空间(类)成员数量不多。通过开发环境的智能提示能沟通快速找到需要类或函数。
    6.2    软件复用级别
        代码复用
        设计复用
        分析复用
        测试复用
    6.3    代码复用的类型
    在本文中,组件表示由一位程序员所创建的、可以被其他人复用以帮助解决编程问题的任何东西。组件可以在任何地方出现,它可以是抽象的,也可以是具体的。它可以是一个思路,也可以是一段完整实现的代码。包括以下五种:
        代码块 Code Block
        算法 Algorithm
        模式 Pattern
        抽象数据类型 Abstract Data Type
        库 Library

  • 相关阅读:
    【转载】Lua中实现类的原理
    游戏资源压缩
    lua中的继承
    lua滚动文字效果
    【转】IOS版本自定义字体步骤
    luaj luaoc 回调函数传递的一些小总结
    cocos2dx中启用lua脚本
    Lua中调用C++方法
    cocos2dx 某缩放的页面 CCTableView最后一个标签无法点中
    C++ Vector 中自定义对象的排序
  • 原文地址:https://www.cnblogs.com/he-zhidan/p/10360484.html
Copyright © 2020-2023  润新知