IBM SPSS 实习总结



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

html

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个盘子做为一个新的汉诺塔问题解决

    }
}



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



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

python

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


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


以后的一周左右的时间进行产品方面的培训。
概况来讲:咱们的产品是一个完整的技术平台,提供对整个调研生命周期的支持。产品强大到支持脚本语言来写调查问卷


Author设计问卷的界面:

c++

这里写图片描述



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

web

这里写图片描述



组里几个师傅写的:


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有啥区别都不是很清楚。django



后来的一件事颠覆了我对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不少技术的强大,终有一天中国的软件公司也会走向全世界,这就要靠咱们共同的努力啦。

相关文章
相关标签/搜索