信息系统项目管理师

信息系统项目管理师

职称简介

信息系统项目管理师属于计算机技术与软件专业技术资格(水平)考试(即软考)高级资格考试里面的一项考试。通过本考试的合格人员能够掌握信息系统项目管理的知识体系,具备管理大型、复杂信息系统项目和多项目的经验和能力;能根据需求组织制订可行的项目管理计划;能够组织项目实施,对项目的人员、资金、设备、进度和质量等进行管理,并能根据实际情况及时做出调整,系统地监督项目实施过程的绩效,保证项目在一定的约束条件下达到既定的项目目标;能分析和评估项目管理计划和成果;具有高级工程师的实际工作能力和业务水平,可聘任高级工程师职务。

以上内容摘自百度百科。

含金量

  1. 软考是指我国计算机软件考试。其中信息系统项目管理师是高级资格考试。与PMP不同的是,它是专业的计算机软件领域的考试,项目管理考试部分参考了PMP内容。在项目管理知识的基础上具有更多的计算机软件领域专业知识(涵盖了信息安全、网络、计算机组成原理、系统分析、计算机英语、法律法规等各科内容)。
    信息系统项目管理师–可用于评高级职称,升职加薪利器;
  2. 公司申请资质认证的条件;
  3. 有助有部分城市积分落户或者直接人才落户。

报名方式

http://www.fzpta.com.cn/Home福州人事考试网直接网上报名缴费即可(费用大致是200多)。

考试时间

每年2次,一般是在5月、11月份其中一周周六。18年下半年考试时间是11月10号。

官方课程

《信息系统项目管理师教程》第3版(有需要的可以找我),有经济条件的最好报名当地或者网络培训机构(各大机构培训费在1000-5000之间),提高通过率。

考试安排

报考职称分为中级和高级信息系统项目管理师

高级:

  • 综合知识(75道选择题) 9:00 11:30
  • 案例分析(3道简答题) 13:30 15:00
  • 论文 (写作题) 15:20 17:20

中级:

  • 综合知识(75道选择题) 9:00 11:30
  • 案例分析(4道简答题) 14:00 16:30

如何算通过

每科总分75分,每科都需要达到45分才算通过。

信管网备考视频

http://www.cnitpm.com/peixun.html#tgl

自我心得

所谓证多不压身,软考时间一年只有2次,PMP有4次,但从费用投入来算,软考比较经济实惠,含金量根据个人理解,也可自行到各大招聘市场查看相关岗位要求。下半年有参考想法的建议先多看教程以及网上找到的各种历年真题,有条件的直接去培训机构。

Android项目产品源码集成

Android项目中产品源码集成

源码文件操作说明

  1. 将产品源码EMP放入工程根目录
  2. 将EMP目录libs中所有的文件从工程里面删除(去除引入jar包及so库文件冲突)
  3. 将项目工程中emp_out.jar包文件删除(该文件是产品源码jar包)

源码文件依赖操作

  1. 在工程settings.gradle文件中添加到include ‘:EMP’
  2. 在项目bankcib工程中build.gradle文件中添加compile project(‘:EMP’)

完成以上两步后,点击AS工具提示的Sync Now之后,项目依赖源码工程操作完成。

项目中代码冲突处理

冲突主要有以下三类:

1.

项目中调用的混淆方法需要改成混淆前方法名即可。

2.

类的私有变量引用权限问题,改成对应混淆前的方法获取即可。

3.整个文件混淆前后替换(比如兴业项目处理离线各种问题的XYOffline.java文件)

总结

虽然整个流程看上去就以上三个大的过程,但实际情况是每次集成产品源码耗时几乎都是30m+,考虑到这个问题,也可以集成一份源码后当做基准,每次代码更新都对应的copy及处理到这份基准上(相关操作需要用代码比对工具及细心的操作),就不用每次都耗时来集成源码。

Mini Program初探

微信小程序

认知篇

微信小程序(wei xin xiao cheng xu),简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。
全面开放申请后,主体类型为企业、政府、媒体、其他组织或个人的开发者,均可申请注册小程序。小程序、订阅号、服务号、企业号是并行的体系。
2017年1月9日,张小龙在2017微信公开课Pro上发布的小程序正式上线。
2018年2月,微信官方发布公告称:已对涉及假货高仿、色情低俗和违规“现金贷”等超过2000个小程序,进行永久封禁处理。

以上内容摘自百度百科

工具篇

微信开发工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html?t=2018724
安装成功后可以新建一个项目,见下图:

其中AppID需要申请小程序开发账号,填写资料提交审核后可以获取

开发篇

目录结构浏览

.json JSON配置文件:逻辑层 主要和UI交互进行事件的处理及触发UI页面的渲染等操作;

.wxml WXML模板文件:UI层 渲染页面,和逻辑层进行交互,触发页面重绘或者渲染等操作;

.wxss WXSS样式文件: UI层样式控制器

其中 app.json用于配置全局环境设置,见代码

{
  "pages":[
"pages/index/index",
"pages/logs/logs"
  ],
  "window":{
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "WeChat",
"navigationBarTextStyle":"black"
  }
}

pages中放在数组第一位的则是启动页,window中主要是运行环境及状态的配置。

获取用户信息

    getUserInfo:function(cb){
  var that = this
  console.log(1);
  if(this.globalData.userInfo){

    typeof cb == "function" && cb(this.globalData.userInfo)
  }else{
    //调用登录接口
    wx.login({
      success: function () {
        wx.getUserInfo({
          success: function (res) {
            that.globalData.userInfo = res.userInfo
            typeof cb == "function" && cb(that.globalData.userInfo)
          }
        })
      }
    })
  }
},

简单一句代码即可获取当前用户信息,其中包括微信名称、头像图片地址、城市、性别等。

最后通过以下代码,即可达到刷新用户UI页面渲染的效果

//调用应用实例的方法获取全局数据
app.getUserInfo(function(userInfo){
  //更新数据
  that.setData({
userInfo:userInfo
  })
})

总结篇

微信小程序的优势在于依附于微信,除了庞大的用户红利之外,对于使用者来说也是非常方便的,不需要过多的手机内存或性能消耗来使用应用。开发起来也很方便,不论是调试还是真机运行都很快捷。最后建议有想法、有追求的同事可以亲身体会下小程序开发,会有意向不到的收获的。

Android P适配总结

Android P适配

Android P版本取消预置Apache Http客户端jar包

该适配需要客户端本地预置apache http客户端包,目前项目中已引用
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
该引用为远程依赖apache http jar包,从测试结果来看满足适配要求。

Android P版本targetSdkVersion小于17适配

该适配已完成,目前项目targetSdkVersion为21

compileSdkVersion 25
buildToolsVersion '25.0.2'
// 默认设置
defaultConfig {
applicationId "com.cib.cibmb"
minSdkVersion 14
targetSdkVersion 21
versionCode 38
versionName "4.0.2"

Android P版本非SDK管控适配

非官方SDK接口分为3类:

  1. 浅灰名单
  2. 深灰名单
  3. 黑名单

其中浅灰名单和深灰名单不适配也不会存在任何问题,而且在Android P设备上测试登录、转账、理财等页面没有弹出该类警告弹框

黑名单接口见下:

Ldalvik/system/VMRuntime;->setHiddenApiExemptions([Ljava/lang/String;)V
Ljava/lang/invoke/MethodHandles$Lookup;->IMPL_LOOKUP:Ljava/lang/invoke/MethodHandles$Lookup;
Ljava/lang/invoke/VarHandle;->acquireFence()V
Ljava/lang/invoke/VarHandle;->compareAndExchange([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->compareAndExchangeAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->compareAndExchangeRelease([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->compareAndSet([[Ljava/lang/Object;)Z
Ljava/lang/invoke/VarHandle;->fullFence()V
Ljava/lang/invoke/VarHandle;->get([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndAdd([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndAddAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndAddRelease([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseAnd([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseAndAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseAndRelease([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseOr([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseOrAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseOrRelease([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseXor([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseXorAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndBitwiseXorRelease([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndSet([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndSetAcquire([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getAndSetRelease([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getOpaque([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->getVolatile([[Ljava/lang/Object;)Ljava/lang/Object;
Ljava/lang/invoke/VarHandle;->loadLoadFence()V
Ljava/lang/invoke/VarHandle;->releaseFence()V
Ljava/lang/invoke/VarHandle;->set([[Ljava/lang/Object;)V
Ljava/lang/invoke/VarHandle;->setOpaque([[Ljava/lang/Object;)V
Ljava/lang/invoke/VarHandle;->setRelease([[Ljava/lang/Object;)V
Ljava/lang/invoke/VarHandle;->setVolatile([[Ljava/lang/Object;)V
Ljava/lang/invoke/VarHandle;->storeStoreFence()V
Ljava/lang/invoke/VarHandle;->weakCompareAndSet([[Ljava/lang/Object;)Z
Ljava/lang/invoke/VarHandle;->weakCompareAndSetAcquire([[Ljava/lang/Object;)Z
Ljava/lang/invoke/VarHandle;->weakCompareAndSetPlain([[Ljava/lang/Object;)Z
Ljava/lang/invoke/VarHandle;->weakCompareAndSetRelease([[Ljava/lang/Object;)Z

搜索项目代码和产品源码暂时没有发现有这些方法进行反射调用的地方,而且经过Android P设备测试也能正常运行,故暂时没有发现这块需要适配的地方。

Android P 项目中测试发现兼容性问题

除了上述华为官方提供适配文档外,在使用Android P设备测试时发现Build.VERSION.RELEASE返回手机系统版本号为P,之前返回的都是类似8.0.0、7.1.1的字符串,导致代码中进行截取会出现异常导致闪退等问题,产品组意见为Android P版本正式发布前再跟进此问题,项目中为了适配,在4.0.2客户端代码进行优化

"P".equalsIgnoreCase(Build.VERSION.RELEASE) ? "9.0.0" : Build.VERSION.RELEASE

判断当前版本号是否匹配P or p,如果匹配则替换为9.0.0字符串,防止进行截取出现异常。

Android MVP设计架构学习

MVC缺点

在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户 界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。

什么是MVP

MVP从更早的MVC框架演变过来,与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。在MVP模式里通常包含3个要素(加上View interface是4个):

View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity)

Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)

Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

*View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试

MVC → MVP

当我们将Activity复杂的逻辑处理移至另外的一个类(Presenter)中时,Activity其实就是MVP模式中的View,它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由 Presenter处理)。

MVP的Presenter是框架的控制者,承担了大量的逻辑操作,而MVC的Controller更多时候承担一种转发的作用。因此在App中引入MVP的原因,是为了将此前在Activty中包含的大量逻辑操作放到控制层中,避免Activity的臃肿。

两种模式的主要区别:

(最主要区别)View与Model并不直接交互,而是通过与Presenter交互来与Model间接交互。而在MVC中View可以与Model直接交互
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。而Controller是基于行为的,并且可以被多个View共享,Controller可以负责决定显示哪个View
Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。
MVC与MVP区别

因此我们可以发现MVP的优点如下:

1、模型与视图完全分离,我们可以修改视图而不影响模型;

2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;

3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;

4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

原文参考链接:https://blog.csdn.net/lovingkid/article/details/50917907

总结

MVP设计架构比MVC相对复杂,但有益于降低UI、逻辑、业务、数据之间的耦合度,方便代码扩展及维护性。基于该原因,练手项目Android决定采用MVP设计架构,同时也方便后续练手项目的复用。

MVP设计架构github地址:https://github.com/flsboy/mvpDemo.git