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不少技術的強大,終有一天中國的軟件公司也會走向全世界,這就要靠咱們共同的努力啦。