2015过完年,我知道导师要出国了,自己也算是水了一个idea 的论文。希望研二能找个实习,早听说西安IBM这边有学长在里面实习过,2月底联系了一下简历就塞了过去。面试就在锦业一路软件园他们上班的地方,一去就给20分钟写了个汉诺塔。

void hanoi(int n , char A , char B , char C)
{
if(1 == n) //最简单的情况,终止递归的条件
{
printf("移动%c柱上第1个到%c\n",A , C);
}
else
{
hanoi(n-1 , A , C , B); //先将源柱子上的n-1个盘子移到中间介质上
printf("移动%c柱上第%d个到%c\n",A , n , C); //然后将源柱子上的第n个移到目标柱上
hanoi(n-1 , B , A , C); //下面再将中间柱子上的n-1个盘子作为一个新的汉诺塔问题解决 }
}

之后两位师傅针对博客和做过的项目有针对性的问了一些问题,期间基本是我跟柳哥两个人互动,刘哥没怎么说话,还以为他是领导哈哈。面试就这么有惊无险的完了。最后柳哥还一直送我到楼下,后来三月底收到了柳哥确认的电话,导师也出国了,于是我开开心心的开启了世界五百强的实习旅途。

后来找工作面试的时候有人问我你觉的IBM这个公司怎么样?实习的时候带我的师傅说过一句话,从政治经济学角度上讲IBM是生产生产工具的公司,我们为世界其他500强提供完整系统的技术解决方案和平台。当然我不能这么回答面试官,我一般就说IBM拥有一定的技术壁垒,她们的产品非常成熟,开发人员工作量不是很大,当然这种情况在我国的软件公司逐渐赶超的情况下会慢慢改变,华为联想神州数码等国内公司在与IBM重合的业务上已经对他们造成了很大冲击。

实习过程主要做了三件事情:(有四点收获)

1.学习 SPSS DATA COLLECTION产品

正式上班的首要任务是进行环境搭建和安全培训,这里高大上的工作环境(邓菊说参观过bat都没这块地方大),连上厕所洗手的水都是加热过的处处彰显着蓝色巨人百年老店的逼格。每天的工作从开机到进入nodes看邮件,需要相继输入硬盘密码,开机密码,nodes密码等等。




之后的一周左右的时间进行产品方面的培训。

概况来说:我们的产品是一个完整的技术平台,提供对整个调研生命周期的支持。产品强大到支持脚本语言来写调查问卷




Author设计问卷的界面:

server激活调查问卷:(我后期的工作主要是和server打交道)

组里几个师傅写的:




http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1202huangq/

2.为组内DC-watch添加一项生成hotfix readme的功能模块

DC-watch是leader自学了python 的django框架自己开发的一个查看组内所有人工作量的web平台,针对上述所有产品的hotfix,动态跟踪每个人的工作量,非常的简单高效,用饼状图柱状图,开会的时候一幕了然的知道每个人每周都修了多少bug,请了几天假,开了多少小时的会。




我们这项任务 的需求来源于,组内产品的hotfix都需要配置一个固定格式的readme.txt文件。之前全部是手写,为了减少工作量,考虑讲这块的内容继承到DC-watch中,只需要填写或者首选一些下拉菜单就可以实现在服务器端生成readme.txt并返回本地。

django是一个非常典型的MVC框架,使用django我们可以在几分钟内创建高品质,易维护,数据库驱动的应用程序。这个过程温习了一下web开发的基础知识,说实话很久不搞了post和get有啥区别都不是很清楚。

后来的一件事颠覆了我对web框架的理解,有一次和桂林同学讨论怎么为DataTable上添加hotfix数据,我理所当然的认为应该写SQL语句结合游标一条一条读出来放到表上展现出来就行了。后来manager review code直接指出Django 的ORM( 关系映射模型)用类来描述数据库,采用直接操作对象的方式来操作数据库,完全避免了费劲的SQL语句,非常的简单高效,这是一次对于web认识的更新,整个实习过程中这样颠覆性的观念更新还有很多,每次更新都让我的开发经验上了一个新的台阶。




Django项目:

https://www.djangoproject.com

在线文档:

https://docs.djangoproject.com/en/1.8/

中文文档:

http://docs.30c.org/djangobook2/

3.设计模式的实用性

设计模式平时我们用的比较少,23种设计模式中朗朗上口的就那么几个,适配器,单例模式,工厂,抽象工厂,观察者

实习的时候组内希望将产品实验性的移植到移动端,利用本身server产品具有的webservice,将调查问卷的数据载体xml请求回来,放在iPhone上通过c++解析并将对象交给object c++,最后交给swift进行展示。

下面看一下tinyxml2解析xml中使用的vistor模式

tinyxml2在线文档:

http://www.grinninglizard.com/tinyxml2docs/index.html



访问者模式就是表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。

具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。

抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参量。

具体节点(ConcreteElement)角色:实现了抽象元素所规定的接受操作。

结构对象(ObiectStructure)角色:有如下的一些责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如列(List)或集合(Set)。

 XMLDocument doctest;
doctest.LoadFile("QuestionXML.xml");
if(doctest.ErrorID()!=0)
{
cout<<doctest.ErrorID()<<endl;
cout<<"error"<<endl;
}
XMLElement* titleElement = doctest.FirstChildElement("Questions");
XMLPrinter printer;
titleElement->Accept( &printer ); const char* xmlcstr = printer.CStr();
cout<<xmlcstr<<endl;

输出情况:

类图:

访问者模式最合适的使用情况是需要对一个家族的对象逐个访问,并根据具体的的对象做出不同的操作,而且不希望改变原来的对象。当然在设计的时候需要让家族成员定义一个支持访问者模式的接口

元素对象的accept函数:用visitor依次访问每个元素(一整个家族,包括很多的node)

bool XMLElement::Accept( XMLVisitor* visitor ) const
{
TIXMLASSERT( visitor );
if ( visitor->VisitEnter( *this, _rootAttribute ) ) {
for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) {
if ( !node->Accept( visitor ) ) {
break;
}
}
}
return visitor->VisitExit( *this );
}

文档类对象的accept函数:用visitor依次访问每个元素

bool XMLDocument::Accept( XMLVisitor* visitor ) const
{
TIXMLASSERT( visitor );
if ( visitor->VisitEnter( *this ) ) {
for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) {
if ( !node->Accept( visitor ) ) {
break;
}
}
}
return visitor->VisitExit( *this );
}






Accept a hierarchical visit of the nodes in the TinyXML-2 DOM. Every node in the XML tree will be conditionally visited and the host will be called back via the XMLVisitor interface.

This is essentially a SAX interface for TinyXML-2. (Note however it doesn’t re-parse the XML for the callbacks, so the performance of TinyXML-2 is unchanged by using this interface versus any other.)




The interface has been based on ideas from:

http://www.saxproject.org/

http://c2.com/cgi/wiki?HierarchicalVisitorPattern

Which are both good references for “visiting”.

An example of using Accept():

XMLPrinter printer;
tinyxmlDoc.Accept( &printer );
const char* xmlcstr = printer.CStr();
Implements tinyxml2::XMLNode.

4.优雅的(elegant)设计与算法

在第三部分我说了这个项目的语言调用设计是这样的:swift–>object c++–>c++

那么如果需要添加一个功能,就需要至少改动三个文件(模块)的代码,这样的设计明显耦合度太高,如何降低代码的耦合度?

整个过程采用敏捷开发,基本上两周一个版本,那么如何避免重构代码带来的灾难呢?




这就要降低耦合度,面相接口编程:

1.少使用继承,多使用接口隐藏实现细节

2.模块的功能划分尽可能单一

3.遵循一个定义只在一个地方出现

4.少使用全局变量

5.类的属性和方法的声明少使用public,多使用private

6.多使用设计模式,比如mvc

7.尽量不用硬编码写程序,同时也尽量避免直接使用SQL

将近6个月的实习让我对软件开发的理解产生了很多颠覆性的观点,也让我认识到了IBM很多技术的强大,终有一天中国的软件公司也会走向全世界,这就要靠我们共同的努力啦。

IBM SPSS 实习总结的更多相关文章

  1. IBM SPSS Modeler 预测建模基础(一)

    1.搜索下载IBM SPSS Modeler 14.1 32位 及 IBM SPSS Modeler 14.1 注册文件(破解布丁): 2.下载train.csv 及 test.csv: train. ...

  2. IBM SPSS Statistics 26.0 Mac Windows Linux安装破解教程

    IBM SPSS Statistics 26.0是IBM公司推出的一款用于统计学分析运算.数据挖掘.预测分析和决策支持任务的软件产品及相关服务的程序. 下载 windows/mac/linux IBM ...

  3. SPSS数据分析—典型相关分析

    我们已经知道,两个随机变量间的相关关系可以用简单相关系数表示,一个随机变量和多个随机变量的相关关系可以用复相关系数表示,而如果需要研究多个随机变量和多个随机变量间的相关关系,则需要使用典型相关分析. ...

  4. 基于SPSS的美国老年夏季运动会运动员数据分析

             本文是课程训练的报告,部分图片由于格式原因并没有贴出,有兴趣者阅读完整报告者输入以下链接 http://files.cnblogs.com/files/liugl7/基于SPSS的老 ...

  5. spss

    编辑 SPSS(Statistical Product and Service Solutions),“统计产品与服务解决方案”软件.最初软件全称为“社会科学统计软件包” (SolutionsStat ...

  6. SPSS学习系列之SPSS Text Analytics是什么?

    不多说,直接上干货! IBM® SPSS® Text Analytics 是一个IBM® SPSS® Modeler 完全集成内插式插件,它采用了先进语言技术和Natural Language Pro ...

  7. SPSS学习系列之SPSS Modeler Server是什么?

    不多说,直接上干货! SPSS Modeler 使用客户端/服务器体系结构将资源集约型操作的请求分发给功能强大的服务器软件,因而使大数据集的传输速度大大加快.除了此处所列的产品和更新,也可能还有其他可 ...

  8. SPSS学习系列之SPSS Modeler的功能特性(图文详解)

    不多说,直接上干货! Win7/8/10里如何下载并安装最新稳定版本官网IBM SPSS Modeler 18.0 X64(简体中文 / 英文版)(破解永久使用)(图文详解)   我这里,是以SPSS ...

  9. SPSS学习系列之SPSS Modeler (简称SPSS)是什么?

    不多说,直接上干货! 推荐博客 SPSS学习系列之SPSS Statistics(简称SPSS)是什么? 官方简介: SPSS Modeler 是全球领先的数据挖掘.预测分析平台软件,拥有简单的图形界 ...

随机推荐

  1. 实现鼠标双击(OnGUI)

    void OnGUI()//实现鼠标双击 { Event Mouse = Event.current; if (Mouse.isMouse && Mouse.type == Event ...

  2. C语言第二次作业——顺序结构

    一.改错题 1.输出带框文字:在屏幕上输出以下3行信息. (1)源程序 对程序进行编译,发现错误信息1 错误原因:stdio拼写错误 改正方法:将stdio正确拼写 对程序进行编译,发现错误信息2 错 ...

  3. App上架应用市场,如何攻破安全过检难题

    App的安全过检与众所熟知的安全检测是两个完全不同的概念.首先App行业本身对App安全过检有一定的要求与规范,其次2017年6月1日正式实施的<中国网络安全法>中就曾要求App在渠道上线 ...

  4. MySQL数据类型DECIMAL用法

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: ...

  5. Python小代码_6_列表推导式求 100 以内的所有素数

    import math a = [p for p in range(2, 100) if 0 not in [p % d for d in range(2, int(math.sqrt(p)) + 1 ...

  6. 解决Popup StayOpen=true时,永远置顶的问题

    Popup设置了StayOpen=true时,会置顶显示. 如弹出了Popup后,打开QQ窗口,Popup显示在QQ聊天界面之上. 怎么解决问题? 获取绑定UserControl所在的窗口,窗口层级变 ...

  7. 谷歌刚发布的求梯度的工具包-Tangent

    安装很简单sudo pip install tangent. 我机器上,终端上用python,tangent报错,但在终端上用ipython,tangent不报错. 我检验是否可用tangent的方法 ...

  8. jquery插件存档

    1.选择插件selectMenu github地址:https://github.com/josiaho/selectMenu 2.选择插件bootstrap_multiselect 官方地址:htt ...

  9. OpenCV3.1.0中调用MHI(Motion History Images, 运动历史图像)

    写在前边: OpenCV3.0+要想使用MHI,就要现安装扩展模块opencv_contrib.安装方法见:ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contr ...

  10. 转:函数signal()

    from:http://blog.sina.com.cn/s/blog_4b226b92010119l5.html 当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收 ...