翻譯 | 如何成爲一名合格的敏捷開發者

原文自博客發佈平臺medium,做者爲 better-programming 的 Ravi Shankar Rajan,傳送門web

若是你想知道什麼叫作敏捷開發者,首先你得先了解什麼叫作敏捷開發。編程

敏捷開發是一個用於表述迭代和增量軟件開發方法論的術語,例如:bash

  • scrum,當今最流行的敏捷框架,用於產品開發管理
  • kanban,可以幫助開發者在開發任務中作好規劃的一種方法論
  • 極限開發,爲開發者提供一系列用於完成特定項目開發的規則的一種方法論

而且,一個敏捷開發者並非指大家所認爲的那些把本身綁在獨立的空間中,戴着耳機享受音樂,與世隔絕的開發者。敏捷開發中開發者的角色明顯要顯得更爲寬廣和多元。框架

敏捷開發者更關注與可持續開發。可持續性意味着良好的評估、有效的代碼分支管理策略、保證質量的自動化測試以及持續部署用於從用戶中得到快速的反饋。編程語言

這一切意味着整個組織都應該接受,質量比 deadline 和日程規劃都要重要得多,這個觀念。ide

也就是說,敏捷開發的基石是將區域轉換爲動態變量(像每個變動的商業/市場需求),以此團隊可以保證質量、構建一個活力四射的開發文化以及保持業務的緊密性。工具

還有,做爲一個工做于敏捷環境中的開發者來講,重要的是他們須要瞭解組織中遵循的全部敏捷開發方法論、工具以及指南。單元測試

除此以外,敏捷開發者應該具備良好的溝通技巧用於團隊合做以及與客戶的交談。學習

最重要的是,敏捷開發者應該瞭解組織中整個開發過程的實現以及流程。測試

這裏並無捷徑,但如下所列出的實踐點能夠幫助你更好地融入到敏捷程序開發、測試和 debug 中。

意圖導向編程

意圖導向編程適用於學習任意編程語言的條件中。

當咱們學習任一種語言的時候,會很天然地傾向於將問題分解爲一系列功能性步驟上。步驟細化得越高,你就可以更能瞭解語言深層。這種技術正是證明了這一點。

意圖導向編程是說,比起循序漸進地編寫代碼,想象你自身已經有一套合適的方法並將其實踐到當前狀況中會顯得更能解決問題。

問問你本身:"這樣一個理想的方法須要哪些輸入輸出呢?還有,在如今對我來講,怎麼取名才令我本身印象深入來讓我本身以爲這個方法已經存在?"

而且,因爲方法實際上並不存在,因此除了你本身的想象外,其餘因素並不會影響到你。

思考下下面的代碼:

REPORT ysdnblog_class_ideal.
parameters : p_rows type count default ‘100’.
* — — — — — — — — — — — — — — — — — — — — — — — -*
* CLASS lcl_main DEFINITION
* — — — — — — — — — — — — — — — — — — — — — — — -*
CLASS lcl_main DEFINITION.
PUBLIC SECTION.
CLASS-METHODS : start.
PRIVATE SECTION.
METHODS : get_data ,
display.
CLASS-DATA : lr_main TYPE REF TO lcl_main.
DATA it_mara TYPE mara_tt.
ENDCLASS. 「lcl_main DEFINITION
* — — — — — — — — — — — — — — — — — — — — — — — -*
* CLASS lcl_main IMPLEMENTATION
* — — — — — — — — — — — — — — — — — — — — — — — -*
CLASS lcl_main IMPLEMENTATION.
METHOD start.
CREATE OBJECT lr_main.
lr_main->get_data( ).
lr_main->display( ).
ENDMETHOD. 「start
METHOD get_data.
 — — WRITE SOME CODE HERE……
ENDMETHOD. 「GET_DATA
METHOD display.
 — — WRITE SOME CODE HERE……
ENDMETHOD. 「display
ENDCLASS. 「lcl_main IMPLEMENTATION
START-OF-SELECTION.
lcl_main=>start( ).
複製代碼

start() 方法是執行報告時調用的當前類的公共方法。

其餘的方法,get_data()display(),是類的私密方法,它們只會被類對象在內部調用。咱們能夠將對這些方法的簡單調用稱爲功能性步驟。

關鍵是它們是做爲類內部實現的一部分,而不是用於外部而存在。

固然它們還沒真正地實現。因此當你嘗試編譯這部分代碼,編譯器會拋出錯誤來講明它們並不存在,它們必須被編寫爲可以被編譯的代碼才行。

這就是下一步咱們須要作的事情。

在乎圖導向編程中,咱們容許咱們本身將注意力放到如何將問題分解到需求的整個大環境中。

咱們並不會編寫和執行那種大塊冗餘的代碼。咱們所要作的是將代碼分紅一步一步的功能塊而且一步一步得實現它們。

思考下下面我所實現的功能步驟 get_data()display()

METHOD get_data.
SELECT * FROM mara INTO TABLE me->it_mara UP TO P_rows ROWS .
ENDMETHOD. 「GET_DATA
METHOD display.
DATA : lr_table TYPE REF TO cl_salv_table.
cl_salv_table=>factory( IMPORTING r_salv_table = lr_table
CHANGING t_table = me->it_mara ) .
lr_table->display( ).
ENDMETHOD. 「display
複製代碼

在這整個過程當中,沒有過多的變化。咱們只是以不一樣的方法和不一樣的規則去簡單地編寫這些代碼而已。

測試驅動開發(TDD)

當你第一次使用 TDD 的時候也許你會以爲很奇怪。

爲何會這樣呢?先編寫單元測試?誰會作這種傻事?

話雖如此,但它但是敏捷開發中最重要的概念之一。

讓咱們舉一個簡單的例子來講明下吧。

這個例子是假設咱們有一個帶有方法 SUM 的類 LCL_SUM。這個方法的做用是對數字進行增長操做。

它將一個數字做爲最重要的參數而且與其對象自身進行一個加法操做從而獲得結果,如今讓咱們把這個方法稱做生產方法吧。

這個類的代碼以下所示:

CLASS lcl_sum DEFINITION.
PUBLIC SECTION.
METHODS: SUM IMPORTING iv_1 TYPE i
RETURNING VALUE(rv_sum) TYPE i.
ENDCLASS. 「lcl_sum DEFINITION
*
START-OF-SELECTION.
* Nothing here yet
*
*
CLASS lcl_sum IMPLEMENTATION.
METHOD SUM.
rv_sum = iv_1 * iv_1. "我故意使用乘法而非加法來產生錯誤" sum
ENDCLASS. 「lcl_sum IMPLEMENTATION.
複製代碼

編寫測試類

如今咱們編寫一個測試類。

在 SAP 當中,當你定義這中類的時候須要添加關鍵字 FOR TESTING。這樣能夠將此類從生產代碼( production code)中分離出來。

CLASS lcl_test DEFINITION FOR TESTING
PUBLIC SECTION.
METHODS: m_sum FOR TESTING.
ENDCLASS. 「lcl_test DEFINITION
*
CLASS lcl_test IMPLEMENTATION.
METHOD m_sum.
ENDMETHOD. 「m_sum
ENDCLASS. 「lcl_test IMPLEMENTATION
複製代碼

測試方法實現

在這個測試方法中,你須要作的是測試這個生產代碼。

因此,爲了測試 LCL_SUMSUM 方法,你須要實例化 LCL_SUM 的引用對象,而且調用方法 SUM 和傳遞虛擬數據。

基於這些虛擬數據,方法會返回方法的實際結果。

基於虛擬數據,你會知道指望值是什麼。落日入,若是你將 3 做爲參數傳入到 SUM 方法中,它會返回 6,由於增長了 3。

當從測試的生產代碼或者方法中得到實際結果後,你須要對結果進行比較。

若是實際值和指望值不相同,你須要讓系統知道這當中出現了問題而且顯示一些適當的信息。

CLASS lcl_test IMPLEMENTATION.
METHOD m_sum.
DATA: o_cut TYPE REF TO lcl_sum.
DATA: lv_result TYPE i.
*
CREATE OBJECT o_cut.
lv_result = o_cut->sum( 3 ).
*
cl_aunit_assert=>assert_equals(
EXP = 6
act = lv_result
msg = ‘something wrong in output’
).
ENDMETHOD. 「m_sum
ENDCLASS. 「lcl_test IMPLEMENTATION
複製代碼

單元測試結果

這提醒我在生產方法中的實現出現一些錯誤。

對的,若是你仔細觀察 SUM 的方法實現,我有一個錯誤。我是用了乘法而非加法。因此我須要更正它而且從新運行測試來驗證是否成功。

咱們時常在嘗試編譯或者運行代碼前花費大量的時間在編寫代碼上。可是,代碼的執行和測試在這裏每次只須要花費2分鐘左右。

所以,簡而言之,TDD 是遵循,首先編寫單元測試,再編寫具體代碼,再重構,終而復始,這個原則來進行實現短開發週期開發的。

單元測試是一種自動化測試,用於檢查功能是否預期所望工做。你的第一個單元測試用例應該是失敗的由於這是在你編寫任何代碼以前所寫出來的。

在這作法中,你往測試用例完善一點,在生產代碼中完善一點。兩種代碼共同增加,相互維護。測試用例適用於生產代碼就像抗體和抗原同樣。

將一切封裝

當中的經驗法則是:按策封裝,按需調用(encapsulate by policy, reveal by need)。

當有疑惑的時候,隱藏它;當有須要的時候調用它們。

當抽象問題解決後,將其隱藏和封裝。

抽象意味着:"你被容許以一個更高的細節點去觀察全部對象",而封裝則更進一步,它意味着:"你不容許經過任何級別的細節點來觀察全部對象"。

這就是,繼承,這個概念的由來了。

當在設計任何軟件系統的時候,咱們時常會尋找那些十分相像的對象。

例如,當在設計一個合約系統時,咱們能夠找到許多不一樣種類的合約(全職、臨時、資產、刺激性合同等等),可是每種合約的通常屬性是同樣的。

所以,你能夠穿件一個名爲 contract 的通用對象,而後定義 fixed price (全職)合約做爲繼承 contract 對象的類並帶有額外的屬性,以此類推。

繼承簡化了設計由於你經過編寫一個通用的對象來處理全部事情而且編寫特定的對象來處理特定的場景。

不只代碼變得"潔淨"了,也爲使用該類來進行繼承的開發者提供了一個極好的方法來分離沒必要要的細節。

繼承是面向對象編程中其中一個重要的思想。它是一把雙刃劍,當使用正確時能夠提供極大的幫助;當錯誤地使用時會帶來巨大的傷害。

簡單地說,咱們應該盡力將可以封裝的事物進行封裝,由於它能簡化咱們的維護過程。

面向接口設計(IOD)

一般,接口是鏈接另外一個實體 — 一個方法,一個類,一個模塊或者一個程序,的一種方式。

常見的接口形式是:

  • 對象的可訪問方法集。
  • 協議,譬如文件傳輸協議(FTP)或者簡單郵件傳輸協議(SMTP)。
  • 程序化接口,譬如 web service。

而且,面向接口設計將定義層從實現層中分離開來。關鍵在於確保這種簡化的設計可以使得測試變得更簡易以及提升可維護性。

接口僅包含一組方法的簽名(名字、參數、返回類型以及調用後的指望值)。接口不能包含數據成員(屬性),由於這意味着實現的一步。

定義和實現的分離在設計上有明顯的優點。它容許在測試以及外部的表現(例如外部格式)中輕鬆完成替換實現而且能夠明顯地與內部實現分離。

一樣,你能夠將程序化內部接口從外部供應商(第三方接口)或者開發組提供的 API 中進行分離。開發本身所需的接口而且對其進行調整。

這樣就能夠隨時建立乾淨、易調整和可讀的代碼了。

原型

敏捷以迭代的模式工做而且迭代要求工做原型須要按期進行展現和討論。

也許原型的最大優勢是可以表現設計的視覺反饋;一張圖,即便規模再小,也比千字來得有用。圖片不只幫助咱們確認設計的可行性,更有助於得到必要的"認同"和批准來繼續推動。

原型也能做爲一次性模型,用於在設計和編碼以前理解項目的需求。本質上來講,原型是項目的試金石。

即便你已經對設計做出了無數次的修改,在軟件開發的過程當中,仍是會有許多預想不到的問題會發生。

原型測試至少可讓開發團隊知道問題的所在而且他們可以在軟件發佈前有機會去跟進。

與原則(discipline)一塊兒使用,原型會成爲開發者的主力工具,並將其用於代碼和設計的衝突中。

能夠參考 iPhone,這個回報能夠說是很是巨大。

最後的話

敏捷開發不只僅是一系列儀式。它是一種文化以及技術哲學。

它經過實踐提升我的能力,藉此在產品中構建一個堅固的技術基礎而且在團隊中產生合做文化。

敏捷開發的一個核心原則是穩步前進,這反過來,也可讓你可以穩步地交付產品,而不是零星地工做最後什麼都產出不了。

開發者在敏捷團隊中會更加投入,編寫更好的代碼和得到更多的樂趣。他們每每編寫可維護的代碼,構建良好的關係而且可以對項目最後的回報有一個明確的分配。

真正意義上的團隊合做是越作越好、不斷改進。

就像愛迪生說的那樣:

There is a way to do it better — Find it.


小喇叭

廣州蘆葦科技Java開發團隊

蘆葦科技-廣州專業互聯網軟件服務公司

抓住每一處細節 ,創造每個美好

關注咱們的公衆號,瞭解更多

想和咱們一塊兒奮鬥嗎?lagou搜索「 蘆葦科技 」或者投放簡歷到 server@talkmoney.cn 加入咱們吧

關注咱們,你的評論和點贊對咱們最大的支持

相關文章
相關標籤/搜索