2015年3月27日 星期五
C++ 學習小筆記-std::map vs std::unodered_map
顧名思義map 跟 unordered_map的差別在於"ordered"也就是 map是有order unordered_map則沒有,
差別(應該是)在於底下的實作方式
map 是用類似 Binary tree 之類的方式來實作,所以也支援從 find()的結果開始繼續iterate
還有lower_bound() 之類的功能
而 unordered_map推測應該是用 hash_table 來實作
因此:
unordered_map所花費的記憶體空間比較大,但一般情況下會比較快
然而worst case底下 map 會有O(logN)的時間複查度 unordered_map 卻有可能用到 O(N)
所以 ... 自己看個伴吧 :P
2014年12月26日 星期五
沒有大學學歷卻能進入Google的四個步驟
前言: 作者是寫 Always Be Coding 這篇文章的同一個人,第一次翻譯請多多包涵。原文請參考Four Steps to Google Without a Degree
自從我寫了
ABC: Always Be Coding - How to Land an Engineering Job
之後,許多人問我:”你沒有大學學歷是怎麼進Google工作的?“。以下是我的故事,但請記住每個人的狀況可能會些不同。
一直以來我都超想要進UCLA唸書,但是我高中的GPA實在太囧了(2.45),而且我自己那時候也還沒有搞清楚我想念什麼。不過後來在普渡大學的分校唸書時我有修一些computer science的課,希望有朝一日能夠轉行當工程師。大約兩個學期後,我得到了一個很不錯的的offer,開啟了我接下來的旅程。
自從我寫了
ABC: Always Be Coding - How to Land an Engineering Job
之後,許多人問我:”你沒有大學學歷是怎麼進Google工作的?“。以下是我的故事,但請記住每個人的狀況可能會些不同。
一直以來我都超想要進UCLA唸書,但是我高中的GPA實在太囧了(2.45),而且我自己那時候也還沒有搞清楚我想念什麼。不過後來在普渡大學的分校唸書時我有修一些computer science的課,希望有朝一日能夠轉行當工程師。大約兩個學期後,我得到了一個很不錯的的offer,開啟了我接下來的旅程。
第一個步驟:沒那個本事之前,就先假裝自己有那個本事吧!(Fake it till you make it)
我大學的時後有在Indiana一家小公司打工寫網站(12鎂/小時),這份工作雖然不算太糟,但是也不是我夢想中的工作。不過我還是認命(也很認真)的完成了了幾個專案,算是一個CP值很高的員工。同時我在我剩下的一點點空閒時間開發一個遊戲,所以我決定跟老闆商量,請他給我三個月的時間來完成這個遊戲並放到他網站上賣。我做了精美的簡報來說服他們這個 shareware model 是怎麼運作然後要如何賺錢,最後老闆同意花錢請我來做這個專案。大概是我投影片做得很美吧...大約兩個月後,Demo版本上線了,一間加州的新創公司CodeFire發現我正在跟他們做一樣的遊戲(類似SubSpace但是是3D的)後寫信給我叫我別再做了否則要告我,我回他們說"想要我停,除非你們雇用我"。結果我就拿到Offer了!在三個禮拜的交接之後,我就打包去加州了。
第二個步驟:跟高手當好朋友(Befrined a master)
這大概是最重要的一個步驟了,公司裡誰最厲害就找他當你師父吧,千萬不要停止學習。我在Double Helix 工作的時候我師父Nathan Hunt大概是我看過少數幾個又聰明又謙虛的人。就算我問他一些很基本的問題,他總是很有耐心的回答我。我那時候應該跑去他辦公室問過幾千個問題吧,例如"要怎麼一個旋轉矩陣插入另外一個?","要怎麼寫一個圓柱體的碰撞偵測?"。幾年後他也加入了Google(比我晚了一個月)。我的每一位師父都改變了一些我解決問題,觀察問題很重要的方法。
第三個步驟:填補你不足的地方(Fill in the gaps)
因為我不是CS科系畢業的,我知道我有很多基礎知識上的不足。例如我知道要怎麼寫一個物理引擎但是我不知道怎麼解決DP(dynamic programming)的問題。為了填補這些缺空,我幾乎把所有我聽過的的資料結構/演算法都實際的實作一遍。其實需要的資訊書上或網路上都有,但是實作之後透過觀察來了解為什麼要如此設計跟看出還是有一段差距。長時間來說,要做培養下面這些能力
- 在C, C++, Objective-C, Java, PHP, Python 或 Ruby中至少成為其中一項的高手,然後熟悉另外一兩個語言,另外對於Scala, Haskell 或 Lisp也可以瞭解一下。
- 學習資料結構,最好要親自實作,然後了解其中時間複雜度。
- 學習解決程式問題,熟讀Top Coder 的演算法教學,然後練習SRM的題目
- 建立你自己做(過)完的專案集(寫過的framework, 誒批批,小遊戲...等
第四個步驟:建立你的自信心!(Find confidence)
離開印第安納州後六年,我已經完成了六個不同平台的遊戲,一樣的工作對我來說已經沒有挑戰性了,因此我投履歷給Google,心裡想說如果我上了,我就是一個"真正"的工程師了!(因為我一直沒有大學CS的文憑),但不意外的Google並沒有回應我...一年後我又再次寄出了履歷,但這一次我直接把"學歷"的部分拿掉了!諷刺的是,我接到了人資打來的電話,我們約了兩個禮拜後的電話-螢幕面試。在這兩個禮拜我拼命的死背所有演算法/資料結構,不斷的練習,直到我的所有對於Google面試的恐懼變成了自信與興奮。當時的每一個面試題目到現在我都記憶猶新。面試官都是很健談的人,我相信他們一定也感受到了我的熱情!其中有幾個題目是:1) 給你一堆二維的座標,請算出天際線(請參考skyline problem)這題滿簡單的,我用max heap解決了這個問題,這題其實有很多解法2) 請你設計一個"小畫家"的程式這題是目前我看過最有趣的題目,一開始我畫了一些interface,還有class diagram 接著我也提到了填滿顏色的功能,面試官就要我實作這個功能,剛好因為我有在TopCoder上練習,所以我閉著眼睛也可以把BFS寫出來。3) 說說看你有什麼寫程式的好習慣?這是一個沒有標準答案的問題,我回答了一些關於不同的測試類型分別是用在什麼情況(Unit/Integration/Acceptance),我也聊了一些關於程式碼一致性與維護性...可以參考Code Complete 或是 Effective Java.我很享受每一場面試解決問題的過程,如果我沒有做好前述的準備,我想結果應該會非常的不同。面試結束後我感覺滿有希望的,但聽說就算面試官同意錄取我Larry Page他會還是會自己審查我的資料,我心裡面滿擔心他會不滿意我的學歷。但事實證明我的擔心並沒有成真,有一天當我在吃壽司的時候接到了錄取的電話,然後我就開心的接受了Offer,從這一刻起我知道,我再也不需要那張我缺少的文憑了!
一個成功打勝仗的戰士會先贏了戰爭才走上戰場,
一個戰敗的戰士則是上了戰場才想辦法要打贏
在Google這間不可思議的公司學習成長了五年之後,我離開了Google
2014年1月10日 星期五
Do what you like -- Rails年終聚會有感而發
一向崇拜programmer們open source的概念,樂於分享的氣氛是在其他產業少見的,也因為這樣開始對coding感到好奇,由codecedemy開始,到去年參加第2屆railsgirls活動。
汗顏的是自railsgirls活動後,就再也沒有參加過rails相關活動,在主辦人慕凡熱情友善的邀請下,鼓起勇氣參加了今天的年終聚會,遇到了許多有趣的人,看著大家因為相同興趣而聚在一起,喜歡coding到下班後還是貢獻時間、精力在這個社群上,這就是Do what you like的強大驅動力吧!
巧的是在今晚的聚會上遇到PicCollage的創辦人John,去年在台大曾經聽過他的分享,今晚有幸直接跟他對談,感到非常開心!John給了我一些non-technical背景的人進入新創團隊的建議,我想這是很受用的,也在這裡分享給大家:
對初期的Start-ups而言,“技術”及“使用者回饋”是同等重要的!除了把產品實現的工程師人才外,能夠搜集、分析使用者回饋,爲產品找到使用者及市場或是可以點出產品未來發展方向、建議的人才同樣重要!
今晚還與許多人聊天,獲益良多,謝謝大家的熱情分享及友善!簡單記錄如下:
- 走出舒適圈,與不同圈子的人聊天,可激發自身想法
- 全球化時代,人才世界各地流動
- Do what you like,那種能量比吃禁藥還猛!
2013年11月10日 星期日
Railsgirls活動開啟黑黑螢幕人生!
之前學習程式語言的管道主要是Codecademy,但總是有一搭沒一搭的,這次Railsgirls活動上看到許多同樣對程式充滿好奇或熱情的女孩們,也聽到大家為什麼會想要學習程式語言的原因,瞬間覺得一點都不孤單了,自己還有好多好多可以加油的地方呢!最重要的是參加活動的女孩們都很漂亮,Coding 真是一種新時尚! XD
Ruby on Rails(ROR)幫助我們可以快速架構網站後台,在安裝環境以後,主要使用命令提示字元(cmd:我個人喜歡叫它黑黑的螢幕)&Sublime text文字編輯器協助,完成整個架站及伺服器開關測試等功能。
活動當天跟著佛心教練以及railsgirls.tw上教材,一步一步架設自己的專案,感受Ruby on Rails的威力。整個活動就像是ROR的開學典禮、入門儀式,之後能做到甚麼程度還是取決於大家課後的努力及實作,但我覺得對於一個好奇於程式語言卻不得其門而入的女孩來說,這是很有啟發性的活動,能夠快速感受到程式語言的威力,如果說衣櫥是通往納尼亞世界的入口,那黑黑螢幕的另一端連結的應該是麻瓜嚮往的魔法世界吧!
總之...我要繼續努力下去!黑黑螢幕的人生GO!
總之...我要繼續努力下去!黑黑螢幕的人生GO!
===Notes===
- 修改程式碼以後,儲存新的Git (Git究竟是甚麼?對現在的我來說還是模糊的概念...)
git commit -a -m "Added rails\_12factor gem and updated Gemfile.lock"
- 先在Github新增Repository,copy 該Repository URL,就準備用黑黑螢幕把程式碼上傳到Github囉!
git commit -m "first commit"
git remote add origin https://github.com/username/rails-girls.git
git push -u origin master
- 注意:如果遇到要修改Remote URL可以用下列方法:
- 黑黑螢幕edit
.git/configfile under your repo directory - 就會跳到藍藍螢幕!! find
url=entry under section[remote "origin"]
"git remote set-url"
2013年5月28日 星期二
C++ 學習小筆記 object (variable) aliasing
c++ aliasing object name在obj C中 所有的 <id> 都是一個object的pointer 加上有ARC所以object在assign 的過程中不必擔心memory裡面的東西會被copy一份,改了obj1卻沒有改到obj2的這種問題 但是在c/c++裡面就會遇到了 當有一個
class Room {
int id;
}
當我宣告一個 Room 的陣列 並且分別assign為1,2,3
Room array[3];
for(int i=0;i<3;i++) array[i]=i;
這個時候我在某個function裡想要對array[3]這個Room物件做一些操作或者是計算的時候發現,要不斷的打array[3]這一串字 非常的煩惱
ex.
for(int j=0;j<array[3]*array[3];j++){
myArray[j] = array[3]+array[3]*array[3]*8;
}
之類的 這個時候恨不得可以把array[3]換成一個room 或是 r 之類的變數,讓他看起來一目了然
經過google大神的指導,原來答案就是一直以來被我嗤之以鼻的,每次考試面試都愛拿出來找人麻煩的 "&" 符號! 原來Room &r = array[3] 就可以把r 這個變數的記憶體位置指到和array[3]一模一樣,也就是說 r 就是 array[3]而不只是array[3]的一份copy!!! 所以上面的城市馬就可以改寫成下面這樣
Room &r = array[3];
for(int k=0;k<r*r;k++){
myArray[j] = r+ r*r*8;
}
輕鬆了不少呢! 老師我錯了我不應該瞧不起這些小地方的XD 寫在這裡乾大家分享囉~
網誌存檔
技術提供:Blogger.