被自己寫的代碼丑哭是一種什麼樣的體驗?
姐妹問題:被自己的代碼美哭是一種什麼樣的體驗?
最近在給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會寫這麼噁心的代碼???
不行再讓我看一下……
這個變數名……恩……不是我的風格啊!!!
絕對不是我的風格!
等一下我好像有點記憶了……
這就是我寫的……
怎麼會這麼丑啊!」
大概長這樣:
————————————
想知道一個月之前發生了什麼請去相關問題。
我寫過最丑的代碼長這樣
目前更新 三家 求職 北京 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次打亂(隨便找兩個點換位置,重複)。
就這麼簡單?!
被自己蠢哭了。
接下來是高潮:
我初始化了一個有規律的地圖數組。
純手打。
撒花完結。
推薦閱讀: