2008-11-18 80 views
2

無論是愛好項目還是分配的項目,您如何選擇從哪裏開始?你是從最簡單的組件開始還是從最難的組件開始?你是以自下而上的方式構建系統嗎,還是以自下而上的方式建立低層次的存根以便稍後實施?你研究類似的項目,只是 重用你找到的任何現有的代碼和建立?或者你是否做了不同的事情取決於它是一個愛好/工作/學校項目?你如何選擇從哪裏開始?

我之所以問的是我想打一個Python 到Whitespace編譯器,但我有困難的決定首先做什麼部分:寫語法,並建立一個解析器,寫算法做AST的語義檢查,編寫代碼生成算法,或者去找一個類似的開源編譯器/解釋器(雖然我可能會學到更多東西,但它最沒有趣)。

1實際上沒有Python,但與Python風格的語法更簡單的語言

回答

3

最重要的是要開始。無處不在。對於大項目,我可能看起來很混亂,但實際上並非如此。有時候你會從事高風險項目,有時你會選擇低垂的水果(簡單的)。我經常在兩端燒蠟燭,從一開始就向前,從末端向後,在中間相遇。按照路徑/問題,直到你撞到一堵磚牆。採取另一種路徑,並保存之前的以後。一直以來,所有的問題都在你的腦海中縈繞着過去,現在和將來。

哪裏可以開始,問題中有一個領域已經足夠了解了嗎?從那裏開始,如果你還沒有讓問題憋足夠久,睡上足夠的夜晚等等,讓一些不太難的東西讓你的頭腦也能夠解決大局。我打算把這個問題分成幾個樂高積木,邊界是什麼,這些邊界有多嚴格?我是否會將輸入文件轉換爲另一種文件格式,然後從那裏進行操作,或者將其轉化爲一些內部數據結構?如果我編寫自己的解析器並改變主意,我可以粘貼一個公共使用的解析器還是解析器失敗意味着整個項目按原計劃失敗?也許從那裏開始。

作爲一種業餘愛好你想從中得到什麼?讓一個更好的鼠標陷阱向世界展示(開源)?快速致富?瞭解你一直想學習的東西?或者只是爲了消磨時間做些有趣的事情,或許可以獲得一些信貸,也許不是?

對於你的工作有一點不同。你打算在這個地方呆很長時間嗎?你是否在意爲自己,團隊,部門留下深刻的印象?你是否傾向於將自己的工作搖搖欲墜,或者你是切割新路線的先鋒,但從來沒有鋪平道路?如果你和你的老闆和團隊只是想要這些東西,那麼就去找一個開源的解決方案(理解隨之而來的包裝),然後添加你的祕密醬油。如果你嫁給了老闆的女兒,而且你不可能離開這個地方,這將成爲主打產品,或許你想擁有它的每一點點,重新發明那個輪子。

如果你有激情去做,或者至少嘗試這個項目,然後開始在任何地方,任何地方,你可以隨時隨地,你認爲你可以做的進展,這將讓你感興趣的項目。即使這第一次剪切都是扔掉代碼,開始吧。然後,您應該迅速開始整理項目的樂高積木,形狀和顏色以及它們如何組裝在一起。從風險項目中分離出低懸的水果。兩者交替,當你在風險項目失敗時,選擇低懸的果實一段時間,以取得進展並讓你的頭腦休息。然後休息後回到風險項目。

+0

很不錯的答案,雖然我不知道你知道什麼是空白符。沒有人會從中賺錢。編譯這個編譯器的全部目的是學習編譯器設計,並且構建一些無用的東西,這很酷:)。 – Cybis 2008-11-18 02:00:30

3

談何容易,但是對於一個商業項目,嘗試先解決風險最高的項目,因爲這些是那些如果你不能使它們工作,這可能會迫使你進行設計更改。

讓最不留情人直到最後,或者直到你需要休息。

1

一些可能性 -

上,你必須做的項目:

  1. 定義功能
  2. 識別風險
  3. 計劃方案和時間盒
  4. 穗/原型風險領域
  5. 以某種邏輯順序繼續進行功能 - 客戶優先級,架構拓撲結構,Bott OM-起來組成,最有趣的最小有趣,等

XP/TDD假設

上,你只是 '擺弄' 項目:

  • 從的已知,着手未知,或
  • 挑最有趣/有趣的一塊,並與啓動,或
  • 嘗試建築師/設計整個事情的智力活動

上,你知道該怎麼做可以在你不知道該怎麼做的其他

部分揭示了部分工作的人,在有趣的部分工作可能是一個愛好點項目擺在首位;只要你正在學習和獲得樂趣,完成是可選的

2

免責聲明:我是一個生物學家/統計學家誰節目經常用於研究目的,而不是一個全職的「純粹」的程序員,所以我的習慣可能有點不尋常。

我通常試圖打破,採取了任務,對自己說,認爲下降「如果我能有以下原語這將是死的簡單。」通過基元,我基本上是指我可以假設「正常工作」並視爲黑盒子的函數或類。如果我仍然不知道從哪裏得到那些原語,我會將這種想法遞歸地應用於每個新創建的子問題,直到我得到的東西看起來相當平凡或者在某個庫中。一旦我對這個功能進行了測試,調試,並在必要時進行了優化,我就會回想起它作爲一組原語並在其上建立下一個更高級別。至於要先實施哪個「原始」,我通常會選擇最有趣的方式(讓我進入區域並激動),或者我最期待遇到的事情可能會改變我的高級別設計和/或問題的角度。

+0

哇。多麼深思熟慮的答案。^_^ – 2008-11-18 03:10:10

2

那麼,最好的事情就是在編碼之前想想真的很難。它就像玩游泳池,如果你花時間思考未來,一切都會更容易。一旦你知道了你需要做的一切,以及你是如何做到的,從哪裏開始都是很自然的。

而對於我自己的經驗,我真的很喜歡自上而下的方法,我平時總是第一個代碼的高級方法..這樣的事情:

INT主要(){ ClientSocket的插座(「WWW .google.com「,80);

string line; (socket.getline(line)){ cout < < line < < endl; }

}

我創造我需要爲這個編譯類(ClientSocket的)..然後,一旦我確切地知道我需要完成,我的代碼了。 :)

因此,對於您的編譯器,我會先考慮所有Gramars,我需要的所有類。我會寫下它們。然後,我可能會寫一個main()來使用這些類。然後,我只是「填充空白」..但是,嘿,這是我的方法,我敢肯定每個人都使用不同的方法,它確實會改變的項目,時間等。

祝你好運!

+0

這聽起來很像編寫軟件的測試驅動開發方法。 – 2008-11-18 07:44:46

2

我從思考如何佈局整個系統開始。然後,我傾向於選擇可以自己工作的最小子集,並且做一些遠程有用的工作。添加能讓我以最細微的方式添加組件的部分。

這就是說,個人喜好,什麼看起來有趣,什麼我可以最好地理解也發揮了一部分。

1

嘿 - 現在有實際讀取的空白編譯器的描述,你應該做的第一件事就是別的

+0

我不打算這是一個有用的產品。我只想了解編譯器和語言設計中涉及的問題。建立一個編譯器+語言,我認爲是最好的方法。由於我無法與有用的語言競爭,爲什麼不去相反的方向? – Cybis 2008-11-18 04:35:44

1

我往往工作幾種不同的方式。

我任何項目做的第一件事就是讓輸出到屏幕上,並確保我的devkit設置等

(1)如果該項目是什麼順序,什麼,會做的步驟X, Y和Z(例如,像轉換器)我按照時間順序工作,並在發生時調試這些步驟。 (2)如果項目是一個遊戲,我傾向於首先讓我的角色在最複雜的環境中工作。例如,在平臺遊戲中,我的第一個目標是讓玩家四處走動,而不是在平面上落地。我繼續添加敵人和後來的關卡。 (3)如果項目更像是一個應用程序,我會盡可能快地讓它發揮作用。這就是說,最簡單的界面,錯誤纏身,但我可以馬上得到它的主要工作點,然後從那裏添加功能和拋光。這還帶來了額外的好處,通常會使我首先編寫應用程序中最複雜和最重要的部分,這使我可以圍繞應用程序的這一部分設計程序的代碼。

不管項目是什麼(除非它非常小),第一步總是設計一個我需要做的事情的路線圖,並嘗試阻止代碼,所以我有一個大致的想法我需要做什麼以及這些部分需要如何溝通,我需要依賴哪些庫等等。

哦,我忘了說這是我的編碼的第一部分中最重要的部分:我選擇合適的編程語言工作。

1

開始的東西體積小,易於,讓你可以把它的工作原理快。你會得到反饋和樂趣,這將激勵你繼續。

例如,對於一個編譯器,我可能會與整型變量開始:申報,帶數字常量,也許打印分配 - 或任何其他方式來保證它的工作原理。然後,我可以嘗試聲明兩個變量並分配一個變量,添加一個增量運算符,實現算術...下一步可以是字符串變量,然後是整數和字符串之間的轉換。注意這似乎不適用於Whitespace編譯器項目。

我不會開始執行一個詳盡的語法分析器,或任何其他的「層」,因爲我可以重新編寫它,如果我找到一個更好的辦法。然而,空白語法似乎很簡單。

從小事做起,一點一點添加功能,並保持評估你的設計。