被自己寫的代碼丑哭是一種什麼樣的體驗?

姐妹問題:被自己的代碼美哭是一種什麼樣的體驗?


最近在給GacUI做1.0之前一個巨大的重構,其實就是因為被代碼丑哭了。其實這東西也不是我故意這麼寫的,只是用C++寫GUI跟用XML寫GUI的結構的確不一樣(主要是各種組件的依賴方向是相反的)。GacUI剛開始的時候是沒有什麼XML的,整個設計出來都是為了讓C++寫GUI方便,於是導致了現在XML生成的代碼一環套一環。現在要把類介面改成為了XML方便,C++寫GUI管他麻痹,反正也不是不能寫(逃

舉個例子,一個DataGrid的ItemTemplateFactory,其實就是which 實現了一個ListView的ItemTempateFactory,which 實現了一個SelectableList的ItemTemplateFactory,which 實現了一個List的ItemTemplateFactory。這裡面用了無數次adaptor模式。

因為這幾個類是分開幾年寫的,所以單獨寫它們時候並不覺得有什麼問題,現在回過頭一看覺得巨傻。所以最近做的事情就是,把ItemTemplateFactory的介面都刪掉,把依賴倒轉過來,讓ItemTemplate去依賴ListControl。那麼一個DataGrid的ItemTemplate它就是ListControl的ItemTemplate,而不是Factory一層一層地往下adapt了。然後這些adaptor全部刪掉。

估計要改幾千行代碼了,不過為了乾淨,GacUI又沒有死線,沒關係,慢慢改。既然有了XML,那所有的TemplateFactory都可以不要了,列表改完就改控制項的,上百個類全部刪光,功能不變,XML寫好的GUI一行都不用改。做完這次大重構之後,就可以做簡單的2D和3D的矢量圖,再做幾個圖表控制項,重做一次ParserGen,intellisense搞定,GacStudio的各項技術也就全部準備好了,最後拼起來,1.0就可以發布了!

只能讚歎微軟設計WPF的人實在是太牛逼了,除去了一些C#特有的、不兼容C++的設計以外(如dependency property/routed event),凡是我做的跟WPF不一樣的,最後都證明是WPF那樣做更好。凡是我第一次做出來就覺得無比精妙、正確的設計,最後也只是跟WPF一樣(譬如說MenuItemTemplate如何跨控制項對齊各個部分)。這幾年我給GacUI投入了大量的時間,親自體驗了各種架構設計上的優劣,感覺水平又上了一個檔次。我想做別的東西已經很久了,等什麼時候GacUI做完了,換換口味,來寫幾年前寫廢了的DB。

Principal和Partner畢竟就是Principal和Partner,就算我代碼寫的再熟練,架構的知識也是要靠時間才能堆出來的,還得努力學習才能趕上他們。現在已經過了那種寫一個小工具,或者搞一個數據結構,或者代碼寫得巨優美就沾沾自喜的年紀了。每個人都有過一段中二的、覺得自己天下第一的時期。現在老了,都30歲了,再也沒有這個念頭了(逃


寫的時候像拉X一樣暢快

需要用或者改的時候就是吃掉它

PS:其實更慘的是吃別人的屎,比如某文檔亂、示例少、變動快但是卻是業界事實標準的FFmpeg……

想要入門卻發現,兩三天了,一個hello world都跑不起來……


挺長時間了 可恥的匿了

曾經寫代碼,提交上去 運行了 這個倒是沒啥為題 木有BUG

產品沒說啥 PM 也沒說啥

當時我感覺挺好的 記得還發過一次獎金。。。

後來維護得時候,我司得另一猿類 看我得代碼,開始還不錯挺好的。。。

後來他加班了,我們倆關係很鐵 我說我幫你解決。。

由於過的時間比較久了。。。 說實在 我真的認不出這個是我寫得代碼了。。。

各種亂啊。。倒是能運行起來(●"?"●) 這個不服都不行。。。

於是那天晚上 我們倆邊看邊罵。。。這個是哪個傻逼寫的啊。。。動不動腦子啊

找條狗寫的都比他強。。。有段時間一度是很開心的。。畢竟有個共同點吐槽嘛 。。。

直到後面有條注釋是這樣的。。。

# 小爺牛逼不,仔仔(本人外號)局氣沒商量。。。

看完後場面一度十分尷尬。。。

然後他想安慰我說:『 只要能跑起來得代碼就是好代碼,現在只是我們倆的道行不夠。。。『

後來,為了保守這個秘密我請他吃了三次海底撈。。。錢啊。。

再後來。。。我們組聚會喝酒,他丫喝醉了說出去了。。。

打那以後,我多了一綽號。。。局氣的仔仔。。。

最後的問題是。。。除了正式場合。。我的名字就被仔仔給替換了

這裡應該有個生無可戀的表情。。。


一天:

「我寫的還不錯嘛。」

三天:

「代碼有點陌生了,加上注釋吧。」

一周:

「我這裡怎麼好像有點繞啊?這樣就行的啊」

一個月:

「???是我代碼沒錯啊。不過這一塊是怎麼回事?我怎麼會這樣寫?這注釋真我寫的??我會這樣標???」

半年:

「……我當時真是嫩啊,改一下吧」

單擊,backspace

「…………………………」

ctrl+a,delete!

(我之前自學的時候真這樣!?_?,重要的是想到自己當時對著這代碼滿滿成就感的樣子,現在真想一頭撞牆上!別贊要臉)

「說!你這亂七八糟代碼究竟是誰寫的你!」

「…………?」


過了大概一個月之後……

「艹這是我寫的嗎???

我tm會寫這麼噁心的代碼???

不行再讓我看一下……

這個變數名……恩……不是我的風格啊!!!

絕對不是我的風格!

等一下我好像有點記憶了……

這就是我寫的……

怎麼會這麼丑啊!」

大概長這樣:

————————————

想知道一個月之前發生了什麼請去相關問題。


我寫過最丑的代碼長這樣

這個時候 Java 還沒有 Lambda 表達式,代碼是基於消息隊列的響應式類似 IFTTT 的項目。

之後我寫了 Clojure 就再沒出現這麼丑的了


目前更新 三家 求職 北京 iOS開發 有意評論留言

--------------------------------------------

已經干黃兩家公司了 可恥的隱了

騙你們的了 兩家公司都融到下一輪的錢了 只不過從CTO到下面小弟一個不留的都「開」了


我的代碼可萌啦~


看到那一坨代碼都不願意說是自己寫的……

只能用「業務需求」+「歷史包袱」安慰一下自己。


想給自己改名字,與過去一刀兩斷


美哭寫不出來,丑哭還是可以的。

本人大一,今年初學python,老師留了作業讓實現一個中綴表達式解析求值。我不想用if-else來判斷,想用字典做個歸一化處理。

於是努力了一晚,代碼片段如下:

期間查了幾個博客,解決了幾個技術問題(就是那個NotImplemented),感覺很充實,寫完我就去睡覺了。第二天,交作業之前我看了一下這段代碼,突然發現了一點小問題,於是改了代碼:

反正寫完之後感覺自己就是個zz,嗯就是這樣。


寫完後感覺只有上帝和我能看懂。

過一陣子,代碼只有上帝能看懂了。


剛開始工作的時候,進了一個創業公司。

聽從一個代碼大牛的建議,我每個星期給自己review一次代碼,每個月給自己做一次總結(其實現在也是這樣,不過比之前還是懈怠了很多。

每個星期給自己review 的時候,覺得自己的代碼有點丑。

但考慮一下PM給的神奇需求,就會放過自己。

但是一個月後,項目過了幾個里程碑,我再看我的代碼,真的被丑哭了。

彆扭的需求只能用彆扭的代碼完成 。

(圖片來自靈魂畫家喬小樹)

這可以看出來,我當時的進步真的很快(逃 。

現在情況好了很多,編程這件事情,想想看看再碼一碼,不停總結反思,慢慢就提升了。


我寫代碼這幾年最高興的一件事:優雅的解決了一個大項目中隱藏很深,藏了很久,而且極其醜陋的 bug。

我寫代碼這幾年最失落的一件事:半個小時後,發現這 bug 是自己兩年前寫的。。。


2010年邊工作邊學ios ,作為 Dot Net Web背景的我,用NSNotification 作整個系統主要流程寫了一個App,本身只打算用作Demo,沒想到,Demo 完就被公司放上架了。之後也沒時間重構。

幾年之後,還聽到舊同事說我這坑,挖得夠深。

整系統設計的消息流程圖,手畫滿了整整一張A2紙。現在都不明白,怎麼可以完成及能跑得動。


R有個package叫做Rcpp

具體功能是可以把C++ code編譯成R的函數

去年年前當時趕proof of concept實現一個演算法(質譜的maxent deconvulution),R code寫這種數據處理賊拉省事,然而R本身遇到loop太慢,所以幾乎所有不能向量化的地方全部用C++寫的,當時以為過完年回來立刻就會繼續搞,所以注釋寫的很隨意

結果過完年回來過了4個月才重新開始這個project,要用C#寫進WPF

於是老闆那陣子就每天都看到我對著兩個屏幕上的一個R窗口一個eclipse窗口和一個visual studio窗口瘋狂撓頭……

過了一周老闆貼心的買了一個Pressurized air cleaner,雖然沒明說,我趕腳應該是讓我清理清理鍵盤上積的一層頭皮屑……


用 Prolog 寫一個可以解數獨的程序,要求不用 clpfd,所以只能硬算。數獨會當作一個 2D 數組傳入,所以第一步呢,就是要把這個數組按行、列和格子分別 bind 給不同的變數。

行很好取,數組枚舉一遍就好了。理論上,我把這個矩陣 transpose 一下,就能得到每一列。我於是寫了一會兒,結果沒寫出來,然後我又想到還有格子……

於是就寫成了這樣:

bind(L,E1,E2,E3,E4,E5,E6,E7,E8,E9) :-
nth0(0,L,E1),
nth0(1,L,E2),
nth0(2,L,E3),
nth0(3,L,E4),
nth0(4,L,E5),
nth0(5,L,E6),
nth0(6,L,E7),
nth0(7,L,E8),
nth0(8,L,E9).

% Expects a list of lists 9 by 9 grid.
sudoku(L) :-
% give rows names (row 1 is R1, etc)
bind(L,R1,R2,R3,R4,R5,R6,R7,R8,R9),
% give cells names (cell 1,1 is C11, etc)
bind(R1,C11,C12,C13,C14,C15,C16,C17,C18,C19),
bind(R2,C21,C22,C23,C24,C25,C26,C27,C28,C29),
bind(R3,C31,C32,C33,C34,C35,C36,C37,C38,C39),
bind(R4,C41,C42,C43,C44,C45,C46,C47,C48,C49),
bind(R5,C51,C52,C53,C54,C55,C56,C57,C58,C59),
bind(R6,C61,C62,C63,C64,C65,C66,C67,C68,C69),
bind(R7,C71,C72,C73,C74,C75,C76,C77,C78,C79),
bind(R8,C81,C82,C83,C84,C85,C86,C87,C88,C89),
bind(R9,C91,C92,C93,C94,C95,C96,C97,C98,C99),
% give columns names (column 1 is C1, etc)
C1 = [C11,C21,C31,C41,C51,C61,C71,C81,C91],
C2 = [C12,C22,C32,C42,C52,C62,C72,C82,C92],
C3 = [C13,C23,C33,C43,C53,C63,C73,C83,C93],
C4 = [C14,C24,C34,C44,C54,C64,C74,C84,C94],
C5 = [C15,C25,C35,C45,C55,C65,C75,C85,C95],
C6 = [C16,C26,C36,C46,C56,C66,C76,C86,C96],
C7 = [C17,C27,C37,C47,C57,C67,C77,C87,C97],
C8 = [C18,C28,C38,C48,C58,C68,C78,C88,C98],
C9 = [C19,C29,C39,C49,C59,C69,C79,C89,C99],
% give boxes names (box 1 is B1, etc)
B1 = [C11,C12,C13,C21,C22,C23,C31,C32,C33],
B2 = [C14,C15,C16,C24,C25,C26,C34,C35,C36],
B3 = [C17,C18,C19,C27,C28,C29,C37,C38,C39],
B4 = [C41,C42,C43,C51,C52,C53,C61,C62,C63],
B5 = [C44,C45,C46,C54,C55,C56,C64,C65,C66],
B6 = [C47,C48,C49,C57,C58,C59,C67,C68,C69],
B7 = [C71,C72,C73,C81,C82,C83,C91,C92,C93],
B8 = [C74,C75,C76,C84,C85,C86,C94,C95,C96],
B9 = [C77,C78,C79,C87,C88,C89,C97,C98,C99],
% rest of the code

其實,這是一個「感謝發明文字編輯器 Multiple Selections 的人」的回答。


寫完之後就希望不要出bug,自己離職後別人再看……害怕被看我代碼的砍死


放開讓我來!

經常寫著這些畫風就從

someFunction()

變成

SomeFunction()

變成

FuncSomething()

變成

fSth()

變成

__func_sth()

不要問我在幹嗎…我也很絕望啊…


-----------------2017-5-28 18點更新內容----------------

又是一次丑哭的經歷,還是之前的內容,受 @yiyuezhuo 指教,即使是原演算法的思路,也沒有任何問題的可以秒出結果,應該是我哪裡寫錯了。

代碼都刪了怎麼辦呢?當然是選擇再寫一遍咯!

然後……

就又把自己丑哭了。

因為是才寫著玩的,所以也沒什麼注釋,這裡簡單說一下:14是圖片的總數(用來保障連連看地圖二維數組裡的每個元素都是在0-13之間。x1x2取隨機數於1-18之間,y1y2取隨機數於1-11之間。地圖已被初始化為每個元素均為-1)

乍一看沒問題吧。

沒問題吧?

問題吧?

題吧?

吧?

……就是跑不起來阿,還是一樣的卡住。發現沒結果之後秒速問評論,還是沒用阿……莫非是rand()函數的鍋?

rand()函數:神經病阿?

嗯細心看代碼的同學應該發現問題了。

問題就在:

每次找到了兩個隨機數之後,進行了cnt++;

所以找了198個元素之後……

cnt只有99.

cnt背鍋,嗯。

cnt:你特喵的每次找兩個數只給我+1,我要是能變成198那我怕是鬼變的喔還甩鍋給我,你去shi吧辣雞程序員。

我:

---------------------------這裡是分割線(應該是這麼畫的吧)--------------------

以下是原答案:

知乎二答奉上(應該說是首次認真的回答,嗯)

這是連連看的地圖。mfc框架寫的。大理工課程需求。

不要問我為什麼要這麼寫,理由十分羞恥……(雖然說其實理由才是丑哭的重點)

嗯進入正題,

我一開始是打算初始化的時候就讓地圖是隨機的。

然後我隨機的思路就是,產生四個隨機數作為兩個點的坐標,然後讓這兩個點取同一個值,從而成為連連看中相同的一對圖片嘛,如果找到的點重複了那就接著找下一個點。然後反覆這個過程直到把這個地圖填滿。

沒毛病吧?

沒毛病吧?

沒毛病吧?

寫好之後跑了5分鐘地圖沒顯示出來。心裡一驚,怕是死循環了吧?

不對阿,哪裡會死循環阿?

內心是這樣的

然後心裡一驚,

怕是要讓地圖填滿的概率太低了吧!(概率論沒學好,求解用這種求隨機的思路把18*11的地圖填滿的所需次數的期望)

然後說出來你可能不信,我做了件真正蠢的事情:

我去自己人工創造出了這個隨機二維數組,嗯。

寫了兩行就寫不下去了。

第一次發現自己隨機想一個99對相同的數字隨機排放是這麼難的一件事情……

然後絕望的看了下書,更絕望了:

書上的辦法是,通過任意的初始化地圖(隨便一個規律的地圖)進行n次打亂(隨便找兩個點換位置,重複)。

就這麼簡單?!

被自己蠢哭了。

接下來是高潮:

我初始化了一個有規律的地圖數組。

純手打。

撒花完結。


推薦閱讀:

為什麼computer music會成為一個研究方向 ,或者說它到底是一個怎麼樣的學科?

TAG:編程 | 代碼風格 | 計算機科學 | X是種怎樣的體驗 |