博客專欄

EEPW首頁(yè) > 博客 > 代碼實(shí)踐 | 都2021年了,回看5分鐘前寫(xiě)的代碼就這么難嗎?

代碼實(shí)踐 | 都2021年了,回看5分鐘前寫(xiě)的代碼就這么難嗎?

發(fā)布人:CV研究院 時(shí)間:2021-03-21 來(lái)源:工程師 發(fā)布文章

寫(xiě)代碼的時(shí)候,反復(fù)修改是常見(jiàn)的事,修改之后忘記以前是什么樣子好像也很常見(jiàn)。

如何才能夠回溯那些被自己覆蓋掉的代碼片段?美國(guó)田納西大學(xué)的助理教授 Austin Z. Henley 介紹了自己開(kāi)發(fā)的工具 Yestercode,它能讓回溯代碼就像播放視頻拉進(jìn)度條一樣簡(jiǎn)單。

這個(gè)工具在程序員們聚集的社區(qū) HackerNews 上引發(fā)了人們的討論。

1.gif

一項(xiàng)研究發(fā)現(xiàn),Java 開(kāi)發(fā)者在寫(xiě)代碼的時(shí)候平均每 6 分鐘回溯一次,這意味著他們經(jīng)常會(huì)需要使用 undo 按鈕或 Ctrl+z 讓代碼恢復(fù)到之前的狀態(tài)。這些撤銷(xiāo)動(dòng)作顯然并不是預(yù)先可知的,而且隨后肯定會(huì)接著覆蓋重寫(xiě)。

事實(shí)上,在另一項(xiàng)研究中,有開(kāi)發(fā)者在 5 分鐘內(nèi)進(jìn)行了 40 次 undo/redo 操作。當(dāng)被問(wèn)及為什么要這樣做的時(shí)候,程序員的回答通常是:他們?cè)谠噲D回想起被修改部分代碼的某個(gè)中間狀態(tài)。那么問(wèn)題來(lái)了,為什么想看到之前寫(xiě)過(guò)的代碼就這么難?

2.png

Undo 到盡頭

對(duì)于代碼工作來(lái)說(shuō),撤銷(xiāo)和重寫(xiě)按鈕總是很有意義的設(shè)計(jì)。但這里會(huì)存在一些問(wèn)題:(1)如果回溯之前的狀態(tài),進(jìn)行了新的更改,之前的狀態(tài)就會(huì)丟失。(2)人們無(wú)法看到改前改后狀態(tài)的直接對(duì)比。(3)沒(méi)有提示符直觀指示你在撤銷(xiāo) / 重寫(xiě)歷史的具體位置。(4)有些代碼編輯器使用全局 undo 堆棧,有些代碼編輯器為每個(gè)打開(kāi)的文檔使用撤消堆棧,這可能會(huì)干擾你執(zhí)行操作順序的思維方式。(5)代碼編輯器中還有很多動(dòng)作是不會(huì)被加入 undo 堆棧中的(比如修改 debugger 選項(xiàng)),這在調(diào)試 bug 的時(shí)候會(huì)讓人頭疼。(6)一次回撤一小步,不知何時(shí)才能到盡頭。

這個(gè)吐槽的列表還能繼續(xù)列下去。

使用版本控制

有人說(shuō):「為什么很多程序員都習(xí)慣使用 undo/redo?版本控制可以解決所有問(wèn)題?!?/p>

但實(shí)際情況是版本控制并不會(huì)奏效。當(dāng)開(kāi)發(fā)人員對(duì)代碼進(jìn)行更改時(shí),他們可能會(huì)對(duì)代碼進(jìn)行很多改動(dòng)并陷入困境,然后過(guò)了一會(huì)才能意識(shí)到想要的是某種中間版本。這就迫使開(kāi)發(fā)人員在他們得到做出決定所需信息之前,保存一個(gè)中間版本。除非每隔幾分鐘將代碼放到 git 庫(kù),無(wú)論其是否有效,因此版本控制在此并不會(huì)有所幫助。

開(kāi)發(fā)人員通常對(duì)找到所需信息過(guò)于自信,而且他們大大低估了找到這些信息所需的工作量。

復(fù)制文件

開(kāi)發(fā)人員在更改過(guò)程中,要么復(fù)制代碼文件,給相關(guān)代碼截圖。他們可能會(huì)有這樣的想法:「我要把代碼弄亂了,在弄亂之前,我要用 Ctrl-A 和 Ctrl-V 將它復(fù)制到一個(gè)新的標(biāo)簽頁(yè)中,然后把該窗口放在編輯器旁邊,用作參考?!股踔劣袕臉I(yè) 20 年的開(kāi)發(fā)者也是這樣做的。

回到最初的問(wèn)題:為什么想回頭看 5 分鐘前的代碼就這么難?為什么代碼編輯器不能更好地執(zhí)行這種行為?

使用 Yestercode 來(lái)挽救

Austin Henley 表示他早在 2015 年就開(kāi)始草擬了一些設(shè)計(jì)方案,旨在為開(kāi)發(fā)人員提供所需的信息,且所需的工作量較少。在他的設(shè)計(jì)中,開(kāi)發(fā)人員可以一同查看代碼的新版本和原版本,同時(shí)自動(dòng)記錄重要更改。由于 Henley 可以訪問(wèn) LabVIEW 編輯器的源代碼,因此他為 LabVIEW 的實(shí)驗(yàn)版創(chuàng)建了一個(gè)帶有已啟用功能的分支。

盡管 LabVIEW 是一種可視化的拖放(drag-and-drop)語(yǔ)言,但這種設(shè)計(jì)思想也適用于傳統(tǒng)編輯器。然后 Henley 將其演示給了數(shù)十位開(kāi)發(fā)人員、經(jīng)理和其他 LabVIEW 用戶,以獲取反饋并進(jìn)行迭代。

3.png

之后,Austin Henley 開(kāi)發(fā)了一個(gè)名叫 Yestercode 的工具。它可以讓你在時(shí)間軸上瀏覽代碼歷史紀(jì)錄就像看 YouTube 視頻一樣。進(jìn)行回溯編輯時(shí),它可以匯總新的修改,并在時(shí)間軸上為這個(gè)版本建立分支。在這以后,你可以使用時(shí)間軸轉(zhuǎn)到先前的版本,并與當(dāng)前版本的代碼并排查看。以前的版本是只讀的,但仍允許人們從中復(fù)制粘貼。最后,這個(gè)工具還顯示注釋,以便于人們知曉在更高版本上(比如 diff)進(jìn)行過(guò)哪些更改。

幾年前,Henley 花費(fèi)了一些時(shí)間把 Yestercode 做成了 Atom 插件,事實(shí)證明它對(duì)其他種類(lèi)的代碼也很有用。

4.png

這還沒(méi)有完,Henley 希望能讓這樣的比較工具接手所有的文字版本,包括 word 文檔、電子表格和 PDF,新的工具目前也已有了原形。

5.gif

這樣真的可以行得通嗎?等到它正式上線之后,我們就可以評(píng)判一下了。

參考內(nèi)容:

https://web.eecs.utk.edu/~azh/blog/yestercode.html

https://news.ycombinator.com/item?id=26187881

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

模數(shù)轉(zhuǎn)換器相關(guān)文章:模數(shù)轉(zhuǎn)換器工作原理


絕對(duì)值編碼器相關(guān)文章:絕對(duì)值編碼器原理
雙絞線傳輸器相關(guān)文章:雙絞線傳輸器原理


關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉