看板 terievv
作者 標題 標題 [討論] 主管不認同書本的知識,說我沒學好程設
時間 2016-05-15 Sun. 08:27:27
看板 Soft_Job
作者 標題 [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sat May 7 20:18:49 2016
code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
構這本書作
者建議別這樣做,我就拿下面這個重構作者的網址
https://sourcemaking.com/refactoring/split-temporary-variable
他就說這個作者有問題,說我跟他寫一樣出去別人
會笑我
接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
店的工廠,他又
說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
產生物件浪費記憶體,為何不用switch case判定
是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
https://rongli.gitbooks.io/design-pattern/content/chapter1.html
https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
ory-pattern.aspx
然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
個參數丟進去,我一樣拿出
https://sourcemaking.com/refactoring/smells/long-parameter-list
http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
.html?m=1
重構的作者是建議參數不用丟太多,建立一個物件,
設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
腦袋嗎
沒辦法判定這個作者有問題
參數本來就全丟給建構子,讓建構子去塞,即便
參數很多也沒關係,說我物件導向沒學好
反正一直在對我人身攻擊,即使我提到重構
設計模式,對他來說就是爛書,作者亂寫
請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.241.90.24
※ 文章代碼(AID): #1NBTqlt8 (Soft_Job)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462623535.A.DC8.html
※ 編輯: purin88 (111.241.90.24), 05/07/2016 20:24:21
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sat May 7 22:52:38 2016
我也是比較認同你做法,
不過說實話,code review本來就會出現這種狀況,
很多人在code review時,
是抱著去批評別人的態度在做的,
想著我比你利害,我方法比你好,你要改成我方法,
什麼寫法比較好其實已經不是問題了,
問題是你們這樣已經失去了code revew的意義,
搞到你們關系也會影響到,
現在電腦跑夠快了,
為了計較省記憶體或參數要怎麼丟而傷和氣這非常的傻,
等於是把小小且沒什麼影嚮的技術問題搞成人的問題,
你主管一直對你人身攻擊這個是不好的,
但你其實也不用太和主管硬碰硬,
尤其是這種小事....
在座大家很多人的工作經驗都很多,
遇過"不合理"的要求的經驗也很多人有吧,
你這個爭議點真的算很小了,
我隨便說說我遇過不合理的要求:
1.美術不想切圖,就要程式去切圖
2.連資料庫時,不準用sp和暫存表,一定要在client端把sql拼出來送,而且join只能用left
3.變數命名要求用a1,a2,a3...
至於被人身攻擊的經驗,
也多到我數不完,
最常被人身攻擊的點,
我相信90%的工程師也這樣被攻擊過,
那就是被批評為不懂使用者,
你主管的用詞我看是還好,
有人用詞更難聽,國罵都出來了,
所以看開點囉,
不要去在意這種小事,
因為有更多大事值得注意,
也不要和主管唱反調,
如果主管沒逼你一定要改成他寫法的話,
你就聽聽就好吧,
如果你主管逼你改的話,
你就聽你主管改看看,
改了有問題,影響到你做事的效率的話,
那麼就看你這公司想不想待,
不想待,忍不了的話就離開,好聚好散吧,
只是你可能要做好心理準備,
搞不好下個主管會更沒sense,
其實事情就是這麼簡單,
加油吧,別被小事打擊到,
你會寫這些,會想這些,你己經贏過很多人了,
也記得以後,
你當主管時,
要對別人code review時,也千萬不要去人身攻擊,
就算你覺得對方寫得很爛,也要保持尊重
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
while(me.isLonely){
me.girlFriend = new girlFriend();
me.isLonely = me.girlFriend.isReal?false:true;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.94.92.41
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462632772.A.728.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 00:18:45 2016
好熱睡不著回一下XD
其實你跟你主管兩個都沒錯
只是立足點不同而已
你使用的方式都是以方便維護為主要考量
你主管的方式則是盡可能榨出所有效能出來
兩個完全不同方向的怎麼吵也不會有結果
之前就遇過一個用 java 實作了類似 goto 方法的同事
成功之後他整個笑開懷 一整天心情都超爽的
說效能提升多少多少
之前要跑幾十分鐘現在只要幾分鐘
然後跟我說他寫程式的成就感就在調校這個部分
但聽完我只覺得三個月後可能沒人看得懂他在寫什麼...
可是有的時候就是需要犧牲維護性來追求那一點點的效能
因為當那段程式碼需要跑幾千萬次的時候
能提升一毫秒都是很大的進展了
拿比較簡單的寫資料庫來說
每次新增資料就是產生一次 insert statement
但如果一次要寫上萬筆呢
只好寫成 stored procedure
一個好維護 另一個速度快
但如果那個只是個 singleton 的物件初始化呢?
應該沒有主管會希望有人在這裡下太多功夫調校
可是如果說有一天你的程式碼要移到哪個有資源限制的地方
這時你的主管建議的方法就會有幫助了
寫程式就是一直不斷的判斷與選擇
有時 a 方法好 有時 b 方法適合
過了一陣子後 可能有文章表示 a, b 方法都爛透了
如果是我站在原 po 的立場要我選擇的話
程式是我在寫 維護的也是我
我才不管主管怎麼說咧
隨便應個 喔喔 好 我再找時間改
然後就不鳥他了啦
誰要跟你花時間在那邊開會啊
搞不好還會耽誤到我下班時間
不過記得千萬不要跟老闆頂撞
上次我這樣做 然後...
就寫了一封道歉信 很不方便
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.90.49
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462637927.A.A2C.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 00:39:49 2016
我的建議是,如果你沒有辦法說服你的老闆,那表示你也還沒有通透為什麼
書上要這樣寫,也只是知其然不知其所以然,那就再努力點把更多細節搞懂,
對你也不是壞事。
比方說吧,建構子到底是要參數吃到飽還是分開寫get/set,跟他放在你整個
架構的哪一層有很大的關係。跟將來維護的頻率也有很大的關係,不是一定
哪個好哪個不好。
把更多細節搞清楚也是未來溝通很重要的工具,你也許今天說服不了你老闆,
輸了沒關係,卻可以讓你變得更強大。總有一天你會說服下一個老闆的。
但是結論是,既然他是老闆,照他說的改吧。之後如果要維護改code,因為
之前的彈性都沒了,現在時間要比較多,他也只能吞了。所以,記得發個
email給老闆確認code review的結果,免得到時後到打一靶說,工程師亂寫...
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 75.17.244.220
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462639192.A.F90.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 01:00:22 2016
推薦你看這本書,或許會對你有幫助:
無瑕的程式碼 番外篇:專業程式設計師的生存之道
http://www.books.com.tw/products/0010598217
裡面大概是在講身為一個Clean Coder,
在職場中如何處理「人」方面的問題。
---
從你的文章看起來,你對於所受到的質疑,
處理的方式好像是將參考資料直接丟給對方,
說服的理由上則是「因為大師們這麼建議」。
但Martin Fowler與Joshua Kerievsky,兩本重構著作的作者,
他們在書中大量提到的是「程式碼的壞味道」及其帶來的可能壞影響,
同時也提到不要過度設計、以及什麼樣的重構手法會帶來哪方面的trade-off。
有個很重要的觀念是,要根據你的程式、自己判斷是否真的適合某個重構手法。
以下分享我看重構相關書籍的一些心得,
並不是說你就有這些問題(因為文章中也看不完全),
只是一些相關的心得分享~
Inline Temp
暫時變數並不是個絕對要移除、或是絕對要保留的東西,
Martin Fowler在書中並沒建議你別用暫時變數,
而是「當你發現它妨礙你的其他重構手法時,則該移除它」。
暫時變數的問題在於,當你需要Extract Method時,
會因為它的存在而需要把它透過參數傳遞,
因而導致壞味道「過長的參數列」。
如果沒有這個問題(或其他的問題),暫時變數並不是壞事。
適當的暫時變數,可以透過命名,提升程式碼的可讀性。
見Introduce Explaining Variable一章。
在這個場合下,引入暫時變數反而是比較好的做法,
有時甚至需要先Inline Temp、再Extract Method,最後再把Temp Extract回來。
至於記憶體議題要看場合,
以現在的硬體來說、應該大多都不需要擔心這個問題。
如果profiler的效能剖析真的指出效能瓶頸在這方面再來處理即可。
工廠模式
head first design patten這本書就跟許多的設計模式書籍一樣,
容易看了之後就染上模式癖,忽略了有時可以用更簡單的解法處理問題。
在重構--向範式前進(Joshua Kerievsky)一書中,
就提到了如何透過許多重構手法往設計模式前進、但不過度設計的作法。
你主管說的作法,在某些情況下的確有可能是更好的作法。
工廠模式的優點在於程式碼分屬各自的class中、未來容易擴展,
但是也為程式帶來額外的複雜度。
如果某個地方的物件創造,未來不太會出現太多的類型變種,
的確是透過switch case+Creation Methods搞定就好了。
不需要特別引入工廠模式,帶來額外的複雜度。
Introduce Parameter Object
「過長的參數列」的確是個明顯的壞味道,
這個壞味道在重構與Clean Code(Martin, Robert C.)兩本書中都有提到。
這個壞味道主要的問題在於:
1. 可閱讀性降低
2. 未來維護參數/Method不易
我看不太懂你文中的set get是什麼意思,
如果是以下寫法的話,在語意上會有點不一樣:
User user = new User("Jack");
User user = new User();
user.setName("Jack");
後面這種寫法雖然可以減少1個建構式參數,
但是語意上比較偏向是「將原本沒有名字的使用者改名為Jack」。
這方面比較見仁見智,只是稍微說一下可能會有這樣子的理解。
要消除過長的參數列這個壞味道,
手法在書中大概有提到了4個,包括:
1. Replace Parameter with Explicit Methods.
2. Replace Parameter with Method.
3. Introduce Parameter Object.
4. Preserve Whole Object.
你的文中最有著墨的Parameter Object與34比較有關,
也並不一定就是「建立一個物件」,
而是「將各自相關聯的參數以物件包裝起來」。
例如,假設在一個租書店的程式中有以下程式碼:
BookPreservation bookPreservation = new BookPreservation(
"Jack", "1433717", "2016/5/8", "2016/8/8");
其中4個參數分別為 userName, userId, startTime, endTime,
比較好的作法是將各自相關聯的參數各自包裝,變成:
BookPreservation bookPreservation = new BookPreservation(
new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8"));
這個重構手法能帶來的好處如下:
1. 提升可讀性
2. 未來維護簡單
3. 容易因此將相關功能移入新造的class中,改善程式碼分工
試著像這樣將原作法的壞處與新作法的好處跟主管說看看吧。或是塊陶。
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.166.119
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462640428.A.59D.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 10:01:50 2016
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式?
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
我重構的方法是用樣板簡單工廠合併
1.模組由樣板實作
2.產品由工廠實作
在工廠階段通過參數switch決定要什麼樣板
並實作樣板內容
我認你老大要的是動態時期注入什麼方法
這的確在初期會減少記憶體,在測試上也比較彈性
再來我會開始定義領域物件,透過IResult泛型做統一回傳class,並定義該工廠的Reapon
se class裡面定義不同樣板Domain class,
重構以後程式結構大概如下
http://i.imgur.com/XSxp7Pv.jpg
我重構得前提是維持住現有的商務邏輯,透過封裝和釐清權責後再重構,先決定領域,將
相關的領域從原本大雜燴的程式抽離,將共同部份放到樣本主類別,子類別決定細節,工
廠階段則決定要何種子類別。
這樣閱讀性和效能說真的比原先好多
我重構也會找組長和長官討論多請益,基本上codereview前先討論,並能說明該方法好處
在哪,我想不會被刁難
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.166.3
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462672912.A.E0B.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 10:27:33 2016
以下不見得跟 Java 有關,純粹討論一點關於函數參數過多可能
導致的問題
1.難以閱讀、修改不容易
函數的參數越多,表示一個人要使用或是編輯的時候,需要判斷
斷詞 (想不到比較好的說法) 的地方就越多,也越容易失誤。
有些編輯軟體可能會幫你 highlight 你目前編輯到的參數,或是
提供額外彈出的提示 (如自動完成) ,但不是所有的都會。也有
方法在寫的時候讓他更明確,如一個參數放一行,但也不是每個人
都喜歡這樣的 coding style。而且十個參數就是十行,也占據了
不少版面。
參數多,漏給參數的機會也增大。如果好死不死有許多類似的函數
多載 (在建構子遇到的機會應該不小?) 且參數型態又一樣,是不是
很容易呼叫到不正確的建構子呢?
此外, C++ / Java 有 namespace / package 要寫,參數型態本身
就已經夠長到不好閱讀了。
2.效能 & 空間
我不確定其他高階程式語言怎麼實作,至少在 C / C++ 裡面,某些
平台上最前面幾個 (0~4, 看平台) 參數是用 register 傳,剩下的
要放在stack 上。通常編譯器做最佳化的時候已經會直接一次把需要
的空間留下來,效能上大概不會有差,因為編譯器可以安排運算指令
讓需要傳的資料事先存在對的位址。但是堆疊的空間仍然是需要的。
在多緒執行的程式裡面,程式堆疊不一定如大家預期的是可以一直
成長的。在一些系統裡面,程式堆疊是固定大小,且這個大小還會
影響到開新的執行緒的速度。
最後,寫程式很多選擇都是取捨。要知道一個方法取什麼捨什麼,
才能真的判斷當下用這個方法適不適合。或許你的主管有他的想法
他沒講清楚 (可能他認為你還 junior? 我無從得知),也可能單純
是他鴨霸而已。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.30.76
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462674456.A.BE6.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 14:43:53 2016
※ 引述《ADYex (寵物狼音樹)》之銘言:
: 例如,假設在一個租書店的程式中有以下程式碼:
: BookPreservation bookPreservation = new BookPreservation(
: "Jack", "1433717", "2016/5/8", "2016/8/8");
: 其中4個參數分別為 userName, userId, startTime, endTime,
: 比較好的作法是將各自相關聯的參數各自包裝,變成:
: BookPreservation bookPreservation = new BookPreservation(
: new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8"));
: 這個重構手法能帶來的好處如下:
: 1. 提升可讀性
: 2. 未來維護簡單
: 3. 容易因此將相關功能移入新造的class中,改善程式碼分工
: 試著像這樣將原作法的壞處與新作法的好處跟主管說看看吧。或是塊陶。
這個的話還需要看在用甚麼程式語言吧.
像在VB和C# v4+上也可以這樣寫:
BookPreservation bookPreservation = new BookPreservation(
userName: "Jack",
userId: "1433717",
startTime: "2016/05/08",
endTime: "2016/08/08");
這樣寫比分拆成用property設定更好. 也是你之前說的「在初始化時設定」
和「先全部初始化成null, 在建構完成後再設定」的差別.
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.238.59.15
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462689836.A.F5A.html
※ 編輯: leicheong (61.238.59.15), 05/08/2016 14:44:55
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 14:49:29 2016
我覺得在台灣跟別人code review常常會有三種結果
第一種是覺得我以前這樣寫都沒問題
幹麻還要用另外一種寫法
第二種是物件導向、重構、設計模式洗三小
書上的東西不能拿來現實中用
我只知道硬幹一樣可以解決問題啦!
第三種就是可能知道物件導向、重構、設計模式洗三小
但也沒說到精通的地步
可是你一跟他討論就一副老子就是要跟你戰到贏的姿態
第一種最容易在主管身上出現
第三種最容易在還在coding階段的工程師身上出現
第二種則是資深工程師跟資深主管最容易出現
我覺得code review除了可以知道自己程式哪裡寫的不好
同時也是可以知道自己哪裡不足
或是還有哪些招式可以用的最好時機
因為每種解法都代表著每種不同的思維
但也許是台灣教育從小缺乏批判性的思考與自省
所以有些工程師從一開始寫程式就是硬幹硬幹硬幹
從來沒考慮過是否還有更彈性更好的寫法
然後只要稍微要改需求就整個崩潰
只要出現一個bug就要加班好幾天
以為寫程式本來就會有bug
所以硬幹就對了有bug再說
然後整天靠北當軟體工程師好苦天天都要加班
明明就是自己造孽的結果
一種就是我講的還沒討論之前他就已經認為他已經是對的
遇到這種我覺得最靠北
這種人偏偏又似懂非懂
像是我遇過國內前三大資工畢業的
看到我的SQL有用join居然問我用join的效率不是很差嘛
當下我是還滿想酸難道要像現在一樣所有欄位都用子查詢
同一個talbe每一個欄位要取對應的資料就全部查一次效率才好?
不過這問題太…超乎我的程度我直接轉移話題懶的去澄清
有些人則是在討論的時候狂攻擊你的論點
然後你用另外一個回答反駁的時候他又繼續找下一個問題攻擊你
反正不管怎樣他的結論就是「你錯了」
這些人基本上我都能避免跟他們討論就避免
因為除了浪費時間外
可能因為你砍站不夠、不夠資深就覺得你一定是錯的
這種想法也是很狹隘
良性的互戰可以從溝通中攻擊對方論點的不足
以及被對方攻擊自己的論點
尤其是自己的論點被攻擊時
也代表著也許你對這事物的觀念還有你似懂非懂的地方
這時就是可以進步的地方就可以讓自己越戰越強(誤)
也可以反芻自己所學過的東西
但可惜我看到的很多還是重點不是在討論而是怎麼戰贏對方
最後對方不爽
自己也沒發現自己觀點缺陷的地方變成雙輸的局面
回到原PO的問題
我相信原PO也是求道之人
也是希望程式能寫的更好才會去翻那些書學那些技巧
但有的時候你真的無法跟夏蟲語冰
效能跟可讀性有時本來就要有所取捨
但現在硬體設備越來越強大的情況下
除非真的系統有超級高效能需求或是嵌入是系統資源少到靠北
否則還是應該要以可讀性為主
縱使會犧牲一點效能(不影響使用者體驗的情況)
也許你主管那時代就是對效能斤斤計較
現在他幹主管了還是那一套思維
你也知道台灣一狗票人當主管後
程度、知識水平就停在他離開工程師職位的那一瞬間了甚至還倒退
這種情況下勸你還是少費唇舌說服他
因為從你的內容來看他已經有「你一定是錯的」主觀意識了
所以你怎樣講都沒用
尤其他現在可能也不寫程式了
摔坑的人也不是他
所以他更難體會可讀性是三小這回事了
結論
如果你真的很在意你想的是精進自己程式功力
那就離職吧
我認為無腦的東西也不會因為你寫過一萬次就變得有腦
面試時其實就可以多問問公司內部開發上有沒有相關的觀念
沒觀念也沒關係
至少主管不要來亂就好
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.44.10.232
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462690172.A.0B3.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 18:32:07 2016
繼續占版面分享少許心得。
在Python中也有類似直接指定參數的寫法,如:
book_preservation = BookPreservation(user_name="Jack",...)
如果這些參數只是單純指定進去當作fields的話,
的確這樣的寫法就夠用了:)
下面分享一下這個重構手法的第3個好處:
3. 容易因此將相關功能移入新造的class中,改善程式碼分工
假設在我們的租書店程式中,在caller端有以下程式碼:
class PreservationChecker{
void checkPreservation(
String userName, String userId, String startTime, String endTime){
BookPreservation bookPreservation = new BookPreservation(
"Jack", "1433717", "2016/5/8", "2016/8/8");
if(!isInTime(
bookPreservation.getStartTime(),
bookPreservation.getEndTime())){
return;
}
// 其他動作
}
boolean isInTime(String startTime, String endTime){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
// 其他 methods
}
透過上一篇文章中提到的重構手法,我們可以得到以下程式碼:
class PreservationChecker{
void checkPreservation(
String userName, String userId, String startTime, String endTime){
TimePeriod timePeriod = new TimePeriod("2016/5/8", "2016/8/8");
BookPreservation bookPreservation = new BookPreservation(
new User("Jack", "1433717"), timePeriod);
if(!isInTime(
timePeriod.getStartTime(),
timePeriod.getEndTime())){
return;
}
// 其他動作
}
boolean isInTime(String startTime, String endTime){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
// 其他methods
}
以及2個根據參數關係所分離出來的class: User與TimePeriod。
接下來,因為caller端的程式碼可能已經太多了,
或是在其他地方也有使用到TimePeriod的時間檢查,
好比說、可能另外有個租書店用來舉辦活動的程式碼,
用來檢查今天是不是應該給客人30元優惠:
class FesCoupon{
private String startTime;
private String endTime;
double getCouponAmount(){
if(!isInTime(
this.getStartTime(),
this.getEndTime())){
return 0;
}
return 30;
}
// 以下是重複碼
boolean isInTime(String startTime, String endTime){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
}
因為我們先前把BookPreservation的2個時間相關參數,
透過Extract Class,得到了TimePeriod這個class,
我們現在就可以把重複碼isInTime()放進去,得到:
class TimePeriod{
private String startTime;
private String endTIme;
boolean isInTime(){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
}
然後、上述兩個引用點就可以精簡為:
class PreservationChecker{
void checkPreservation(
String userName, String userId, String startTime, String endTime){
TimePeriod timePeriod = new TimePeriod("2016/5/8", "2016/8/8");
BookPreservation bookPreservation = new BookPreservation(
new User("Jack", "1433717"), timePeriod);
if(!timePeriod.isInTime()){
return;
}
// 其他動作
}
// 其他methods
}
class FesCoupon{
private TimePeriod timePeriod;
double getCouponAmount(){
if(!timePeriod.isInTime()){
return 0;
}
return 30;
}
}
如此,
不僅消除了2個caller class當中的重複碼,
也將isInTime()這個methods放到了與最相關的class當中(也就是TimePeriod)。
即使在支援直接指定參數寫法的語言,如Python中,
也能因為這個重構手法,而獲得以上2個改善的好處。
※ 引述《leicheong (睡魔)》之銘言:
: ※ 引述《ADYex (寵物狼音樹)》之銘言:
: : 例如,假設在一個租書店的程式中有以下程式碼:
: : BookPreservation bookPreservation = new BookPreservation(
: : "Jack", "1433717", "2016/5/8", "2016/8/8");
: : 其中4個參數分別為 userName, userId, startTime, endTime,
: : 比較好的作法是將各自相關聯的參數各自包裝,變成:
: : BookPreservation bookPreservation = new BookPreservation(
: : new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8"));
: : 這個重構手法能帶來的好處如下:
: : 1. 提升可讀性
: : 2. 未來維護簡單
: : 3. 容易因此將相關功能移入新造的class中,改善程式碼分工
: : 試著像這樣將原作法的壞處與新作法的好處跟主管說看看吧。或是塊陶。
: 這個的話還需要看在用甚麼程式語言吧.
: 像在VB和C# v4+上也可以這樣寫:
: BookPreservation bookPreservation = new BookPreservation(
: userName: "Jack",
: userId: "1433717",
: startTime: "2016/05/08",
: endTime: "2016/08/08");
: 這樣寫比分拆成用property設定更好. 也是你之前說的「在初始化時設定」
: 和「先全部初始化成null, 在建構完成後再設定」的差別.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.166.119
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462703532.A.A73.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Mon May 9 01:54:24 2016
看完後這整件事情其實都不是在技術上,都是在人身上,主管與員工的相處
組員一直頂撞主管,先不論主管組員的技術與知識
1. 對組員而言,是希望往好維護方向前進
2. 對主管而言,效能效能效能,我才是強者....
好了,其實有一種主管就是,他甚麼都覺得自己最強,照他的做,不要頂嘴
(你這次考績已經黑了)
有一種組員就是程式我在維護的,我當然是寫好維護的
反正就是人生的道路上你們兩個是衝突的。
你今天上來講這件事情,或許想解決這個問題,或許也只是討拍文
我是覺得寫程式沒有甚麼對錯,可以跑出正確結果就是對的
程式只能比執行速度跟有無bug,好不好維護都是"人"的問題
(今天要新增功能,好維護有可能開發速度快,但是,是人開發的速度
對客戶而言,你時間內可以把程式交出來就好,對主管而言,他只要掌控Dead line就好)
大家立場不同,如果你不想離職,先想想看往後遇到同樣Case要怎麼應付
如果想要離職,也不用想後續結果了,做自己開心的。
可以對技術執著,但是不要鑽牛角尖,寫程式是快樂的,不要把自己逼到這種地步。
分享你可以分享在網路上面,認同或者被你幫助的人自然會把你的理念再繼續散發出去
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.166.145.9
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462730066.A.78F.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Mon May 9 11:03:59 2016
個人是半路出家,去資策會閉關半年入這行的
不學無術先請別見怪
以我自己來說,從來不覺得程式寫法有甚麼優劣,程式是幫客戶解決問題的
只要能達到目的,效能可以達到,維護不困難
沒必要在那裏鼓吹什麼手法
當然或許是因為我做過很久的維運
個人反而不喜歡一堆抽象化的手法
當客戶火燒屁股電話追殺的時候
我還必須要追到抽象的類別或介面,然後判斷到底產生的是啥鳥物件
到底幹了那些好事
那開發者你還不如每一個類別乖乖地用複製貼上,我還比較好追
每個人都有自己立場
開發的人覺得自己的程式寫得很"優美",不重複
後頭維運的人如果技術層次跟不上
只有兩種可能,想辦法跟上,或是把問題踢回給你自己處理
另外像我有一個傾向
就是一個專案只要開始做,大家決定用甚麼技術後
不管有甚麼新的了不起技術
開會只要有人要用新東西,個人一概反對到底
除非不用無法解決現行問題,不然不管多沒水準還是一律要用一開始律定的技術
這是開發的紀律,要用請用在別的案子
很簡單,專案不是給你練功夫的
你懂別人不懂
不代表你厲害,只代表你"搖屁股",替"隊友"製造麻煩而已
像我就遇過很有進取心的同事
每一個功能,只要有進化的可能,他都要做點小修改
然後最初的功能跟最後寫的差很大...
等到他走了
接手他的功能,大家幹到沒力!
老兄,你還不如每個功能都一樣寫法!
以RD來說,這當然是有點不進取,我也承認啦
不過就像前面說的
個人維運做很久
有時候必須想的不全然只有自己的立場
抱歉以上得罪諸多高手之處,再一次致上歉意
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.125.79
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462763041.A.66F.html
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Mon May 9 20:30:34 2016
我只能說多數人很容易陷入以為全世界就是自己看的那樣
以成語來說大概就是以管窺天吧
你說每個類別都乖乖複製貼上
你有沒有遇過一次改版要改全部系統
然後你那些貼上的地方要一個一個改的情況?
我還真的有遇過而且才剛結束
有時候我真的很好奇是不是有公司用程式碼長度來算薪水的?
明明就是一樣的東西一樣的動作
就是有人不喜歡抽離成一個工具方法
然後每一個地方都複製貼上
最後如果要改版就得全部挖出來一個一個改
然後改的時候還要確認是不是有跟其他複製的地方不一樣
這樣有比較爽嘛?
我認為寫程式所謂的優美
指的是程式簡潔好讀
這不是什麼潔癖
而是為了讓你能準時下班的必備coding style
我名言就是「偷懶的最好方法就是一次把程式寫好」
一次寫好抽離能抽離的部份使之能改到最少
你程式問題少user也就少來靠北
你能準時下班的機會就多
一堆人寫出來的程式耦合性強到靠北
然後要改的時候就跟玩疊疊樂一樣
可能抽一塊積木就整個垮了
這時候也只能加班收拾自己造的孽不然還能幹麻?
然後因為耦合性太強太難改就會想一堆奇奇怪怪的解決方法
最後終於長成四不像的怪獸天天浪費自己甚至下一個接手人的生命
而且就我觀察
這種人幾乎都是覺得寫程式就是這樣阿
也不會再去思考是否有更好的解決方案
每次聽到有人在那邊大放厥詞說什麼物件導向、重構、設計模式沒用我就心裡偷笑
這跟公開大聲跟大家說「老子實力弱到連物件導向的好處都體會不到」一樣意思
這種東西你本來就是要會遇到你才知道他的好
沒有實際遇過你跟講一百遍你還是無法體會
寫過好幾年程式還不能體會這些好處
那我只能說什麼樣的人就會待在什麼樣等級的地方
這是我幹過駐點待過公司看過一堆人之後的心得
也是我給自己最大的警惕
※ 引述《allenxxx (fufuxxx)》之銘言:
: 個人是半路出家,去資策會閉關半年入這行的
: 不學無術先請別見怪
: 以我自己來說,從來不覺得程式寫法有甚麼優劣,程式是幫客戶解決問題的
: 只要能達到目的,效能可以達到,維護不困難
: 沒必要在那裏鼓吹什麼手法
: 當然或許是因為我做過很久的維運
: 個人反而不喜歡一堆抽象化的手法
: 當客戶火燒屁股電話追殺的時候
: 我還必須要追到抽象的類別或介面,然後判斷到底產生的是啥鳥物件
: 到底幹了那些好事
: 那開發者你還不如每一個類別乖乖地用複製貼上,我還比較好追
: 每個人都有自己立場
: 開發的人覺得自己的程式寫得很"優美",不重複
: 後頭維運的人如果技術層次跟不上
: 只有兩種可能,想辦法跟上,或是把問題踢回給你自己處理
: 另外像我有一個傾向
: 就是一個專案只要開始做,大家決定用甚麼技術後
: 不管有甚麼新的了不起技術
: 開會只要有人要用新東西,個人一概反對到底
: 除非不用無法解決現行問題,不然不管多沒水準還是一律要用一開始律定的技術
: 這是開發的紀律,要用請用在別的案子
: 很簡單,專案不是給你練功夫的
: 你懂別人不懂
: 不代表你厲害,只代表你"搖屁股",替"隊友"製造麻煩而已
: 像我就遇過很有進取心的同事
: 每一個功能,只要有進化的可能,他都要做點小修改
: 然後最初的功能跟最後寫的差很大...
: 等到他走了
: 接手他的功能,大家幹到沒力!
: 老兄,你還不如每個功能都一樣寫法!
: 以RD來說,這當然是有點不進取,我也承認啦
: 不過就像前面說的
: 個人維運做很久
: 有時候必須想的不全然只有自己的立場
: 抱歉以上得罪諸多高手之處,再一次致上歉意
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.229.138
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462797038.A.76A.html
簡潔的確在軟體中有很多含意
在這我的確指的是邏輯易讀好懂
像是code會有點髒但比較好讀跟簡潔但不好讀的寫法
我同常還是會選擇前者
我只黑特拖我下班時間的打字工(根本就不是工程師好嗎!!!)
※ 編輯: aoksc (114.42.229.138), 05/09/2016 21:50:30
也沒那麼神
也是有人濫用搞到最後我還是要多花時間去處理的例子
技術的好壞最後還是操之於實現的人
還好啦
至少我都嘴的有所本
不服的話我也很歡迎來討戰…喔是討論
受教了
我會再思考看看什麼情況用複製貼上是最好解法
但我看過的Code幾乎都是為了複製貼上而複製貼上…
※ 編輯: aoksc (114.42.229.138), 05/09/2016 23:22:22
標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Wed May 11 21:20:51 2016
原原PO令我想起我之前遇過一間公司也很奇葩
他們公司有訂coding style
然後你空格空錯主管就會用一種你殺他父母一樣的口氣吼你
吼到整間辨公室都知道你空格空錯 你程式有漏洞他們都還沒這麼兇
重點是我寫的是PHP 不是PYTHON那種空格有嚴格要求的程式
我勸他們用code formatter他們也不要
他們說"code formatter會安插程式碼在你的程式裡"
最好笑的話他們公司裡老屁股最大
我寫jquery時用了trigger這個function
他們就說"這個function在我們公司沒人用過 所以你不能用"
覺得他們太奇葩 就離職了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.121.218.99
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462972853.A.B77.html
--
※ 作者: terievv 時間: 2016-05-15 08:27:27
推 : 換部門?? XD1F 05/07 20:24
→ : 注重記憶體有他的寫法 一般DP重點在好懂好改2F 05/07 20:25
推 : 四人幫是亂寫一通?? 科科3F 05/07 20:26
推 : 又要Code Review又不接受新知識的主管真另人頭疼4F 05/07 20:27
推 : code維護的頻率高嗎?還是寫完之後幾乎不會動?5F 05/07 20:28
推 : 有很多程設習慣並不適用於硬體資源受限如embedded6F 05/07 20:28
→ : 現在PC都強到不行,為了那一滴滴滴效能犧牲維護性,划不來7F 05/07 20:28
→ : 的情況?8F 05/07 20:29
推 : 很難說主管是對是錯... 要看立足點 只是如同 mithuang大9F 05/07 20:30
→ : 把程式貼出來才知道問題在哪裡10F 05/07 20:30
→ : 說的 為了一點效能犧牲維護性...11F 05/07 20:30
推 : 要看看你要解決什麼問題才看看要不要用設計模式 過度設計12F 05/07 20:32
→ : 這種時候就聽主管的 出事他負責13F 05/07 20:33
推 : 好像以前盛行了十數年的Frame Pointer Omission現在也14F 05/07 20:33
→ : 造成的成本可能比缺乏設計還要高 看你們要追求的是開發速15F 05/07 20:34
→ : 為了方便除錯時做stack trace而預設關閉了.16F 05/07 20:34
→ : 度還是效能 才能決定用哪種作法17F 05/07 20:34
→ : 自己的作品這樣寫就好了 上班就不要跟主管爭了18F 05/07 20:34
→ : 主管也是個不好學的人 設計模式和重構算是基本的東西了19F 05/07 20:35
→ : 不過你也不必看了什麼書就覺得那本書的方法好棒棒一定要
→ : 用 學東西是為了面對未來的挑戰而學的 有一天你公司的東
→ : 西需要好的架構 這些設計模式就會派上用場了
→ : 不過你也不必看了什麼書就覺得那本書的方法好棒棒一定要
→ : 用 學東西是為了面對未來的挑戰而學的 有一天你公司的東
→ : 西需要好的架構 這些設計模式就會派上用場了
推 : 你的主管可能是以前是搞韌體之類的23F 05/07 20:38
推 : 你不是在工作嗎?他是你主管 你還想說什24F 05/07 20:38
→ : 麼
→ : 麼
推 : 作者對你的影響力 沒有主管的萬分之一26F 05/07 20:38
→ : 對你而言 主管比賈伯斯比爾蓋茲耶穌上帝天王老子 更
→ : 對你而言 主管比賈伯斯比爾蓋茲耶穌上帝天王老子 更
→ : 唉,我就只是難過被人身攻擊28F 05/07 20:40
→ : 大 主管怎做就怎做 好壞不重要29F 05/07 20:40
→ : 違背他 做爛就算 做好他更氣 表示你比他厲害
→ : 違背他 做爛就算 做好他更氣 表示你比他厲害
推 : 以他說的為主,不然就是分析優劣給他看31F 05/07 20:42
推 : 推樓上32F 05/07 20:43
推 : 什麼都塞建構 就祈禱這物件不會被當樣板大量衍生33F 05/07 21:01
→ : 你要的是這公司的$還是自己的競爭力,2選134F 05/07 21:03
推 : 照他說的寫。比較好的方法本來就萬百種。不是嗎?35F 05/07 21:03
→ : 等著見識超肥大檔案載著幾十種規則誕生36F 05/07 21:03
推 : 換公司37F 05/07 21:04
推 : 換吧 反正台灣寫程式錢都差不多少38F 05/07 21:06
推 : 溝通有問題,說服不應該一直丟書丟連結;再者主管堅持39F 05/07 21:10
→ : 應該就直接用主管的方法,畢竟出事是主管直接被定
→ : 應該就直接用主管的方法,畢竟出事是主管直接被定
推 : 真的是出來混才知道守舊又自負的人比想像中多很多,人家41F 05/07 21:15
→ : 一句以前都這樣做還不是好好的,你只能摸摸鼻子,畢竟
→ : 那也是事實,不行就換工作吧
→ : 一句以前都這樣做還不是好好的,你只能摸摸鼻子,畢竟
→ : 那也是事實,不行就換工作吧
推 : 離職44F 05/07 21:16
→ : 不過像用在嵌入式系統的程式似乎確實要斤斤計較?45F 05/07 21:19
→ : 我覺得要看原PO的使用情境?
→ : 以效能與memory來說,應該可以分析產生數據來說明?
→ : 我覺得要看原PO的使用情境?
→ : 以效能與memory來說,應該可以分析產生數據來說明?
推 : 拿compiler課本,翻到dataflow analysis和SSA的章節嗆他48F 05/07 21:23
推 : 單方說詞..建議請你主管出來辯論 (先等我買雞排..)49F 05/07 21:32
推 : 那就 跟他說好然後 改code給他看50F 05/07 21:32
→ : 然後編譯自己的code
→ : 然後編譯自己的code
推 : 你的主管很明顯是早期寫C出身的人,但是現在新的compile52F 05/07 22:08
→ : r很強,就算embedded 都不一定要那麼麻煩了...
→ : r很強,就算embedded 都不一定要那麼麻煩了...
→ : 時代不同 以前系統規格差的時後 只能省則省硬幹54F 05/07 22:14
→ : code寫得醜難維護 換個角度其實是讓自己不易被取代
→ : code寫得醜難維護 換個角度其實是讓自己不易被取代
推 : 錄音 換公司?56F 05/07 22:16
推 : 他不明白stack heap gc的運作吧57F 05/07 22:34
推 : function傳入值十幾個還不宣告class包起來真的很有事
推 : function傳入值十幾個還不宣告class包起來真的很有事
→ : 文人相輕59F 05/07 22:37
推 : 切入的角度不同吧…我覺得沒有對錯60F 05/07 22:50
→ : 而且盡信書不如無書,書上說的不一定都要遵循啊!
→ : 而且盡信書不如無書,書上說的不一定都要遵循啊!
推 : 從敘述來看我看不出有哪裡人身攻擊62F 05/07 23:06
→ : 這是典型剛出社會的人的毛病,丟網址給別人看更是蠢63F 05/07 23:48
→ : 對解決問題一點幫助也沒有 而且只想著對與錯 也不考慮
→ : 背景、場合 什麼平台 開發週期長短及產品導向也不清楚
→ : 只因為自己學了認為對的東西就戰無不勝 這個主管可能很爛
→ : 對解決問題一點幫助也沒有 而且只想著對與錯 也不考慮
→ : 背景、場合 什麼平台 開發週期長短及產品導向也不清楚
→ : 只因為自己學了認為對的東西就戰無不勝 這個主管可能很爛
推 : 你需要看Clean Code的番外篇 專業程式設67F 05/07 23:53
→ : 計師的自處之道
→ : 計師的自處之道
→ : 但你用的方式就算證明你是對的又如何?69F 05/07 23:53
推 : 不過我想你還是快逃吧70F 05/07 23:57
→ : 雖然覺得是看案例,不過看文章推測該主管沒提出原因,71F 05/08 00:19
→ : 單純說DP作者在亂寫就知道素質了
→ : 單純說DP作者在亂寫就知道素質了
推 : 其實和學校教授一樣,用嘴寫的一手好程式73F 05/08 00:27
→ : 我覺得直接丟書本或丟網址有點強迫逼人接受的感覺74F 05/08 00:29
推 : 找些軟體 實測啊 用數據說話75F 05/08 00:30
→ : 自己活用書中知識 以你們的案例為例解釋可能較好76F 05/08 00:30
→ : 不過 review 不是為了這個吧 又不是要寫書77F 05/08 00:30
→ : 直接丟個書名或網址 好像網路上在筆戰78F 05/08 00:31
→ : 就像房子亂蓋也是挺快的79F 05/08 00:32
→ : 你能說出這個case,為什麼用這寫法比較好嗎?80F 05/08 01:59
推 : 軟體豬就是種種主張弄出來的,然後一堆自以為管理很優81F 05/08 02:06
→ : 的笨蛋交出更多笨蛋,以光速抵銷摩爾定律的進步。讓計算
→ : 機性能永遠不夠快...想想8088跑DOS的算PI速度為什麼
→ : 比WINDOWS+i7+32GRAM還快?
→ : 的笨蛋交出更多笨蛋,以光速抵銷摩爾定律的進步。讓計算
→ : 機性能永遠不夠快...想想8088跑DOS的算PI速度為什麼
→ : 比WINDOWS+i7+32GRAM還快?
推 : 說不定你拿去實測後,你的code會比較快85F 05/08 02:29
→ : 不過從你這文沒解釋清楚來看,你溝通上對
→ : 主管製造的困擾可以不少
→ : 不過從你這文沒解釋清楚來看,你溝通上對
→ : 主管製造的困擾可以不少
推 : 程式員相輕?88F 05/08 03:25
推 : 要說出為什麼要這樣寫,不是一昧說某大神怎麼都怎麼89F 05/08 08:44
→ : 寫
→ : 何況,2個方案都可以 work ,要說明挑哪一個優劣
→ : 寫
→ : 何況,2個方案都可以 work ,要說明挑哪一個優劣
→ : 主管讓你怎麼寫就怎麼寫,只要沒有什麼後遣症就好92F 05/08 09:30
→ : 等swtich case不好維護時再來重構,到時不是更好說明
→ : 變數怎用,參數怎傳,就都不是那麼重要,習慣問題罷了
→ : 等swtich case不好維護時再來重構,到時不是更好說明
→ : 變數怎用,參數怎傳,就都不是那麼重要,習慣問題罷了
→ : 說起來這個 case 其實編譯器可能會最佳化掉95F 05/08 10:15
→ : 同valen的意見96F 05/08 10:23
→ : 你的舉例太空泛,很難判斷。DP是累積歸納出的解題結構。專98F 05/08 11:11
→ : 對付OO會遇上的問題。
→ : 對付OO會遇上的問題。
推 : 有時候某些寫法,是程式架構大才有利,程式架構小反而會100F 05/08 12:23
→ : 顯得累贅
推 : 像是switch case如果只有三個,而且也不會再增加,你就
→ : 沒必要寫得那麼"厚工",除非case的數目會一直膨脹,你才需
→ : 要一開始就把架構弄好
→ : 顯得累贅
推 : 像是switch case如果只有三個,而且也不會再增加,你就
→ : 沒必要寫得那麼"厚工",除非case的數目會一直膨脹,你才需
→ : 要一開始就把架構弄好
推 : 如果主管在意性能或記憶體用量,那就是去做實際的量測105F 05/08 12:43
→ : 若程式碼更好維護,也沒有耗用更多記憶體或者變慢
→ : 可省記憶體是省了多少,快了多少都要用科學的方法量測
→ : 如此一來才能有雙贏的局面。
→ : 若程式碼更好維護,也沒有耗用更多記憶體或者變慢
→ : 可省記憶體是省了多少,快了多少都要用科學的方法量測
→ : 如此一來才能有雙贏的局面。
→ : 小魯只會用profiler跑數據,用眼睛跑功力不夠還真不行XD109F 05/08 13:27
推 : Clean code 看一下110F 05/08 13:37
推 : 出來混個性別太硬 公司要你怎麼寫 你就怎麼寫 東西出來就好111F 05/08 14:09
→ : 如果覺得公司怎麼都叫我寫些垃圾 好極了 這代表你根本不該
→ : 待在這種鬼地方 太埋沒你的才能了
→ : 工作就完成主管交辦事務 想寫自己理想中的東西 就在自己的
→ : side project愛怎麼玩就怎麼玩吧!
→ : 如果覺得公司怎麼都叫我寫些垃圾 好極了 這代表你根本不該
→ : 待在這種鬼地方 太埋沒你的才能了
→ : 工作就完成主管交辦事務 想寫自己理想中的東西 就在自己的
→ : side project愛怎麼玩就怎麼玩吧!
噓 : 只覺得主管人身攻擊就不對116F 05/08 15:21
推 : 有技術 處事這種態度 你就慢慢等你的柏樂吧117F 05/08 15:25
噓 : 噓人身攻擊118F 05/08 16:08
→ : 不用辯 實力累積夠了就跳 很多主管都不容別人質疑119F 05/08 22:13
→ : 文人相輕而已 這種要說對錯要把全部的情境需求釐清才知道120F 05/09 09:00
→ : 拿建構子來說 我自己也是會盡可能讓建構子完成大部分參數
→ : 的帶入 在有多型需求的時候才會用.with或.put給值@@
→ : 你們的溝通有問題 而且看起來你沒有弄很清楚為何書上那樣教
→ : 所以不太有辦法拿出強大說服力 如果都到那個程度主管還是不聽
→ : 那就是他不願意溝通 你們就自求多福吧XDD
→ : 拿建構子來說 我自己也是會盡可能讓建構子完成大部分參數
→ : 的帶入 在有多型需求的時候才會用.with或.put給值@@
→ : 你們的溝通有問題 而且看起來你沒有弄很清楚為何書上那樣教
→ : 所以不太有辦法拿出強大說服力 如果都到那個程度主管還是不聽
→ : 那就是他不願意溝通 你們就自求多福吧XDD
→ : 看怎樣用,跟怎樣的組譯器,不覺得你主管說的全然是錯126F 05/09 09:20
推 : 主管說的都是對的 Yes Your Highness! 這樣回就對了 幹嘛辯127F 05/09 10:05
推 : 主管想法有點舊128F 05/09 11:12
→ : 果然是毛語錄一出,紅衛兵們都說好。129F 05/09 11:26
噓 : 書本裡說的就一定對?書本裡的情境跟你的團隊相同?130F 05/09 14:24
→ : 情願相信外國的13道金牌,也不相信在戰場上拼戰的人?
→ : 團隊合作求的是一致性,或許你比其它人強,但不代表別人
→ : 也必需要跟上你的腳步,腳步一致才能一起做事
推 : 再來是接下來怎麼辦,如果你還是想拼技術,那就得離開
→ : 朝向假DevOpt真統包工程師的路,很可能是走孤狼路線
→ : 不然就是要學習如何與團隊相處,特別是怎樣表達想法
→ : 情願相信外國的13道金牌,也不相信在戰場上拼戰的人?
→ : 團隊合作求的是一致性,或許你比其它人強,但不代表別人
→ : 也必需要跟上你的腳步,腳步一致才能一起做事
推 : 再來是接下來怎麼辦,如果你還是想拼技術,那就得離開
→ : 朝向假DevOpt真統包工程師的路,很可能是走孤狼路線
→ : 不然就是要學習如何與團隊相處,特別是怎樣表達想法
推 : by case啦,記憶體多當然用物件,記憶體不夠只好用傳統137F 05/09 19:00
→ : 寫法但難維護
→ : 寫法但難維護
推 : 我覺得我完全可以理解你的心情...139F 05/09 23:04
推 : 你老闆怎麼會這麼不求上進...用procedure programming寫140F 05/10 14:54
→ : 寫code寫得這麼醜又難擴展跟debug真的有比較好? 這種人感
→ : 覺大概就這樣了...
→ : 他可能沒看過真的寫得很好的程式 只能說原po加油!
→ : 寫code寫得這麼醜又難擴展跟debug真的有比較好? 這種人感
→ : 覺大概就這樣了...
→ : 他可能沒看過真的寫得很好的程式 只能說原po加油!
→ : 老闆說省記憶體 你就得省記憶體 不然哩144F 05/10 15:27
→ : 你應該要找出更能省記憶體的方法阿
→ : 你應該要找出更能省記憶體的方法阿
→ : 就說不要搞嵌入式了,難學,薪水又低146F 05/10 19:01
推 : 語言?是否embedded? embedded有自己特殊的policy147F 05/11 15:36
→ : 另外design pattern基本上只會用更多記憶體 很少有反例
→ : 因為他重點在於好修改好擴充 而非好效能跟節省資源
→ : 在resource critical的環境加上錯誤語言下 DP只是找事
→ : 把整個環境攤開看一下比較好討論
→ : 另外design pattern基本上只會用更多記憶體 很少有反例
→ : 因為他重點在於好修改好擴充 而非好效能跟節省資源
→ : 在resource critical的環境加上錯誤語言下 DP只是找事
→ : 把整個環境攤開看一下比較好討論
→ : 第一個例子不都是區域變數嗎,應該沒省到吧152F 05/13 00:21
→ : 用temp有時就真的是temp,或懶得想名稱
→ : 用temp有時就真的是temp,或懶得想名稱
推 : 結果寫甚麼code沒說 有些就是resource有限154F 05/13 23:20
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sat May 7 22:52:38 2016
我也是比較認同你做法,
不過說實話,code review本來就會出現這種狀況,
很多人在code review時,
是抱著去批評別人的態度在做的,
想著我比你利害,我方法比你好,你要改成我方法,
什麼寫法比較好其實已經不是問題了,
問題是你們這樣已經失去了code revew的意義,
搞到你們關系也會影響到,
現在電腦跑夠快了,
為了計較省記憶體或參數要怎麼丟而傷和氣這非常的傻,
等於是把小小且沒什麼影嚮的技術問題搞成人的問題,
你主管一直對你人身攻擊這個是不好的,
但你其實也不用太和主管硬碰硬,
尤其是這種小事....
在座大家很多人的工作經驗都很多,
遇過"不合理"的要求的經驗也很多人有吧,
你這個爭議點真的算很小了,
我隨便說說我遇過不合理的要求:
1.美術不想切圖,就要程式去切圖
2.連資料庫時,不準用sp和暫存表,一定要在client端把sql拼出來送,而且join只能用left
3.變數命名要求用a1,a2,a3...
至於被人身攻擊的經驗,
也多到我數不完,
最常被人身攻擊的點,
我相信90%的工程師也這樣被攻擊過,
那就是被批評為不懂使用者,
你主管的用詞我看是還好,
有人用詞更難聽,國罵都出來了,
所以看開點囉,
不要去在意這種小事,
因為有更多大事值得注意,
也不要和主管唱反調,
如果主管沒逼你一定要改成他寫法的話,
你就聽聽就好吧,
如果你主管逼你改的話,
你就聽你主管改看看,
改了有問題,影響到你做事的效率的話,
那麼就看你這公司想不想待,
不想待,忍不了的話就離開,好聚好散吧,
只是你可能要做好心理準備,
搞不好下個主管會更沒sense,
其實事情就是這麼簡單,
加油吧,別被小事打擊到,
你會寫這些,會想這些,你己經贏過很多人了,
也記得以後,
你當主管時,
要對別人code review時,也千萬不要去人身攻擊,
就算你覺得對方寫得很爛,也要保持尊重
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
while(me.isLonely){
me.girlFriend = new girlFriend();
me.isLonely = me.girlFriend.isReal?false:true;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.94.92.41
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462632772.A.728.html
推 : 難道主管會對你說:你好棒棒嗎?就算再厲害也會挑你毛病!1F 05/07 22:56
推 : 推文人相輕,Code Review淪落為鬥爭工具...2F 05/07 22:57
推 : 出社會要學會面對各種惡意,文人相輕的事從來沒少過3F 05/07 23:19
→ : Photoshop 有切圖的套件4F 05/08 00:53
→ : 為什麼我遇到的同事跟主管人都很好5F 05/08 00:59
→ : 也沒看過其他人有這種事情發生 難道我活在平行世界@@
→ : 也沒看過其他人有這種事情發生 難道我活在平行世界@@
推 : 參數用a1 XDDD7F 05/08 01:12
推 : @GoalBased想見識一下的話可以提出來啊 XDD8F 05/08 01:30
推 : 例如樓上?9F 05/08 01:38
→ : 跑去問主管可不可以這樣,他會不會以為我是M阿...10F 05/08 01:41
→ : 我已經離開那樣的環境了,不過想體驗的話是可以引薦 XD11F 05/08 01:42
推 : <(▔ c▔)y▂ξ12F 05/08 03:17
推 : 推換位思考~13F 05/08 08:17
→ : sql 一定要拼出去,只能用 left join,會不會是資料庫不支援14F 05/08 10:17
→ : 或效能太差?
→ : 或效能太差?
→ : 不是的,資料庫是ms sql server 200516F 05/08 10:46
→ : ..超討厭317F 05/08 16:09
→ : 還有表a1,a2..的更慘
→ : 還有表a1,a2..的更慘
→ : 推這篇~講的很中肯19F 05/08 23:40
推 : api不寫bo,叫api的consumer自己寫,無言20F 05/09 01:02
推 : 目前遇到的窘境
推 : 目前遇到的窘境
推 : 推22F 05/09 09:09
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 00:18:45 2016
好熱睡不著回一下XD
其實你跟你主管兩個都沒錯
只是立足點不同而已
你使用的方式都是以方便維護為主要考量
你主管的方式則是盡可能榨出所有效能出來
兩個完全不同方向的怎麼吵也不會有結果
之前就遇過一個用 java 實作了類似 goto 方法的同事
成功之後他整個笑開懷 一整天心情都超爽的
說效能提升多少多少
之前要跑幾十分鐘現在只要幾分鐘
然後跟我說他寫程式的成就感就在調校這個部分
但聽完我只覺得三個月後可能沒人看得懂他在寫什麼...
可是有的時候就是需要犧牲維護性來追求那一點點的效能
因為當那段程式碼需要跑幾千萬次的時候
能提升一毫秒都是很大的進展了
拿比較簡單的寫資料庫來說
每次新增資料就是產生一次 insert statement
但如果一次要寫上萬筆呢
只好寫成 stored procedure
一個好維護 另一個速度快
但如果那個只是個 singleton 的物件初始化呢?
應該沒有主管會希望有人在這裡下太多功夫調校
可是如果說有一天你的程式碼要移到哪個有資源限制的地方
這時你的主管建議的方法就會有幫助了
寫程式就是一直不斷的判斷與選擇
有時 a 方法好 有時 b 方法適合
過了一陣子後 可能有文章表示 a, b 方法都爛透了
如果是我站在原 po 的立場要我選擇的話
程式是我在寫 維護的也是我
我才不管主管怎麼說咧
隨便應個 喔喔 好 我再找時間改
然後就不鳥他了啦
誰要跟你花時間在那邊開會啊
搞不好還會耽誤到我下班時間
不過記得千萬不要跟老闆頂撞
上次我這樣做 然後...
就寫了一封道歉信 很不方便
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.90.49
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462637927.A.A2C.html
推 : 推這篇,就跟當兵時被督就一直回"報告是",回頭怎麼做自己1F 05/08 01:00
→ : 方便為主。
→ : 方便為主。
推 : 然後...... code review 永遠過不了.....3F 05/08 08:56
→ : 然後就沒有然後了
→ : 然後就沒有然後了
推 : 我也在想他主管是90年代程式出來了,往好方向想,至少他5F 05/08 11:09
→ : 主管還會重視效能,很多主管是不論效能還是維護性都不管
→ : 主管還會重視效能,很多主管是不論效能還是維護性都不管
推 : 主管有時候只是想告訴你"我是主管喲"7F 05/08 11:46
→ : 有preparedstatement可以用 不一定要用SP8F 05/08 21:59
推 : 推這篇9F 05/08 22:45
→ : SP不就是要效能嗎?不過不知道preparedStatement慢多10F 05/08 23:11
→ : 少
→ : 少
→ : 就看你會不會reuse了12F 05/09 00:56
推 : 你的CodeReview不過, 就不能Submit!請問這樣能打混嗎?13F 05/09 15:11
推 : 一次寫上萬筆可以用MERGE啊14F 05/10 14:42
推 : 支持,個人觀念:沒有最標準,只有最適合15F 05/11 09:05
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 00:39:49 2016
我的建議是,如果你沒有辦法說服你的老闆,那表示你也還沒有通透為什麼
書上要這樣寫,也只是知其然不知其所以然,那就再努力點把更多細節搞懂,
對你也不是壞事。
比方說吧,建構子到底是要參數吃到飽還是分開寫get/set,跟他放在你整個
架構的哪一層有很大的關係。跟將來維護的頻率也有很大的關係,不是一定
哪個好哪個不好。
把更多細節搞清楚也是未來溝通很重要的工具,你也許今天說服不了你老闆,
輸了沒關係,卻可以讓你變得更強大。總有一天你會說服下一個老闆的。
但是結論是,既然他是老闆,照他說的改吧。之後如果要維護改code,因為
之前的彈性都沒了,現在時間要比較多,他也只能吞了。所以,記得發個
email給老闆確認code review的結果,免得到時後到打一靶說,工程師亂寫...
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 75.17.244.220
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462639192.A.F90.html
推 : 既然有code review 就有PR紀錄1F 05/08 01:34
→ : 出事的時候老闆要從大老闆那脫罪,你有PR/email是有啥2F 05/08 01:44
→ : 用啦 XDD
→ : 用啦 XDD
推 : 是能出什麼事?最慘的不就是找人重寫而已,很正常啦4F 05/08 09:25
→ : 而且重寫可能是一年後了,或許更久以後才發生
→ : 而且重寫可能是一年後了,或許更久以後才發生
推 : 一個會動的程式,就是好程式 (X6F 05/08 10:34
→ : 說不定就永遠不會改了呢 xD
→ : 我是認為建構子一堆參數我很難 new
→ : 如果真要全在建構子做,用 option 模式可能會好些
→ : 說不定就永遠不會改了呢 xD
→ : 我是認為建構子一堆參數我很難 new
→ : 如果真要全在建構子做,用 option 模式可能會好些
推 : 我也傾向不在建構子加參數,建構子加一堆參數不好改10F 05/08 11:06
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 01:00:22 2016
推薦你看這本書,或許會對你有幫助:
無瑕的程式碼 番外篇:專業程式設計師的生存之道
http://www.books.com.tw/products/0010598217
裡面大概是在講身為一個Clean Coder,
在職場中如何處理「人」方面的問題。
---
從你的文章看起來,你對於所受到的質疑,
處理的方式好像是將參考資料直接丟給對方,
說服的理由上則是「因為大師們這麼建議」。
但Martin Fowler與Joshua Kerievsky,兩本重構著作的作者,
他們在書中大量提到的是「程式碼的壞味道」及其帶來的可能壞影響,
同時也提到不要過度設計、以及什麼樣的重構手法會帶來哪方面的trade-off。
有個很重要的觀念是,要根據你的程式、自己判斷是否真的適合某個重構手法。
以下分享我看重構相關書籍的一些心得,
並不是說你就有這些問題(因為文章中也看不完全),
只是一些相關的心得分享~
Inline Temp
暫時變數並不是個絕對要移除、或是絕對要保留的東西,
Martin Fowler在書中並沒建議你別用暫時變數,
而是「當你發現它妨礙你的其他重構手法時,則該移除它」。
暫時變數的問題在於,當你需要Extract Method時,
會因為它的存在而需要把它透過參數傳遞,
因而導致壞味道「過長的參數列」。
如果沒有這個問題(或其他的問題),暫時變數並不是壞事。
適當的暫時變數,可以透過命名,提升程式碼的可讀性。
見Introduce Explaining Variable一章。
在這個場合下,引入暫時變數反而是比較好的做法,
有時甚至需要先Inline Temp、再Extract Method,最後再把Temp Extract回來。
至於記憶體議題要看場合,
以現在的硬體來說、應該大多都不需要擔心這個問題。
如果profiler的效能剖析真的指出效能瓶頸在這方面再來處理即可。
工廠模式
head first design patten這本書就跟許多的設計模式書籍一樣,
容易看了之後就染上模式癖,忽略了有時可以用更簡單的解法處理問題。
在重構--向範式前進(Joshua Kerievsky)一書中,
就提到了如何透過許多重構手法往設計模式前進、但不過度設計的作法。
你主管說的作法,在某些情況下的確有可能是更好的作法。
工廠模式的優點在於程式碼分屬各自的class中、未來容易擴展,
但是也為程式帶來額外的複雜度。
如果某個地方的物件創造,未來不太會出現太多的類型變種,
的確是透過switch case+Creation Methods搞定就好了。
不需要特別引入工廠模式,帶來額外的複雜度。
Introduce Parameter Object
「過長的參數列」的確是個明顯的壞味道,
這個壞味道在重構與Clean Code(Martin, Robert C.)兩本書中都有提到。
這個壞味道主要的問題在於:
1. 可閱讀性降低
2. 未來維護參數/Method不易
我看不太懂你文中的set get是什麼意思,
如果是以下寫法的話,在語意上會有點不一樣:
User user = new User("Jack");
User user = new User();
user.setName("Jack");
後面這種寫法雖然可以減少1個建構式參數,
但是語意上比較偏向是「將原本沒有名字的使用者改名為Jack」。
這方面比較見仁見智,只是稍微說一下可能會有這樣子的理解。
要消除過長的參數列這個壞味道,
手法在書中大概有提到了4個,包括:
1. Replace Parameter with Explicit Methods.
2. Replace Parameter with Method.
3. Introduce Parameter Object.
4. Preserve Whole Object.
你的文中最有著墨的Parameter Object與34比較有關,
也並不一定就是「建立一個物件」,
而是「將各自相關聯的參數以物件包裝起來」。
例如,假設在一個租書店的程式中有以下程式碼:
BookPreservation bookPreservation = new BookPreservation(
"Jack", "1433717", "2016/5/8", "2016/8/8");
其中4個參數分別為 userName, userId, startTime, endTime,
比較好的作法是將各自相關聯的參數各自包裝,變成:
BookPreservation bookPreservation = new BookPreservation(
new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8"));
這個重構手法能帶來的好處如下:
1. 提升可讀性
2. 未來維護簡單
3. 容易因此將相關功能移入新造的class中,改善程式碼分工
試著像這樣將原作法的壞處與新作法的好處跟主管說看看吧。或是塊陶。
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.166.119
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462640428.A.59D.html
推 : 謝謝大大分享1F 05/08 01:32
推 : 感謝,學習了2F 05/08 02:06
推 : 第三個案例也可選擇使用builder pattern3F 05/08 03:40
推 : 感謝分享心得4F 05/08 03:46
推 : 推認真 真的也要看code才知道5F 05/08 04:50
推 : 這篇認真.. 給推!6F 05/08 07:23
推 : 推 ~7F 05/08 07:59
推 : 這篇吊出許多好文8F 05/08 09:29
推 : 謝謝9F 05/08 09:43
推 : 推,好文,感謝大大分享10F 05/08 10:00
推 : 謝謝大大教學 又上了一課了11F 05/08 10:00
推 : 推推推12F 05/08 10:28
推 : 很棒的分享, 推~13F 05/08 10:44
推 : 把書的知識應用在現實中的好例子14F 05/08 11:02
推 : 感謝分享!有實例好懂好多15F 05/08 12:24
推 : 推這篇,程式碼的重構目標應該是可讀性優先,程式碼本16F 05/08 13:10
→ : 來就是寫給人看的,因此大家都看的懂比較重要
→ : 來就是寫給人看的,因此大家都看的懂比較重要
推 :18F 05/08 14:30
推 : 推~19F 05/08 14:51
推 : 推20F 05/09 01:00
推 : 沒想到過第三點這種語意的問題21F 05/09 02:30
推 : 快陶XD22F 05/09 09:07
推 : 早上看到原PO推薦的書籍~真是本好書23F 05/09 17:15
→ : 對於擁有不擅交際、孤僻個性的我很有幫助
→ : 對於擁有不擅交際、孤僻個性的我很有幫助
→ : 老實說,那樣的主管,還會看這些大師的書嗎?25F 05/10 12:54
→ : 甚至有可能他連design pattern都沒聽過呢!
→ : 甚至有可能他連design pattern都沒聽過呢!
推 : 程式寫久了大多不是技術瓶頸,而是心態瓶頸27F 05/10 23:24
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 10:01:50 2016
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式?
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
我重構的方法是用樣板簡單工廠合併
1.模組由樣板實作
2.產品由工廠實作
在工廠階段通過參數switch決定要什麼樣板
並實作樣板內容
我認你老大要的是動態時期注入什麼方法
這的確在初期會減少記憶體,在測試上也比較彈性
再來我會開始定義領域物件,透過IResult泛型做統一回傳class,並定義該工廠的Reapon
se class裡面定義不同樣板Domain class,
重構以後程式結構大概如下
http://i.imgur.com/XSxp7Pv.jpg
我重構得前提是維持住現有的商務邏輯,透過封裝和釐清權責後再重構,先決定領域,將
相關的領域從原本大雜燴的程式抽離,將共同部份放到樣本主類別,子類別決定細節,工
廠階段則決定要何種子類別。
這樣閱讀性和效能說真的比原先好多
我重構也會找組長和長官討論多請益,基本上codereview前先討論,並能說明該方法好處
在哪,我想不會被刁難
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.166.3
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462672912.A.E0B.html
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 10:27:33 2016
以下不見得跟 Java 有關,純粹討論一點關於函數參數過多可能
導致的問題
1.難以閱讀、修改不容易
函數的參數越多,表示一個人要使用或是編輯的時候,需要判斷
斷詞 (想不到比較好的說法) 的地方就越多,也越容易失誤。
有些編輯軟體可能會幫你 highlight 你目前編輯到的參數,或是
提供額外彈出的提示 (如自動完成) ,但不是所有的都會。也有
方法在寫的時候讓他更明確,如一個參數放一行,但也不是每個人
都喜歡這樣的 coding style。而且十個參數就是十行,也占據了
不少版面。
參數多,漏給參數的機會也增大。如果好死不死有許多類似的函數
多載 (在建構子遇到的機會應該不小?) 且參數型態又一樣,是不是
很容易呼叫到不正確的建構子呢?
此外, C++ / Java 有 namespace / package 要寫,參數型態本身
就已經夠長到不好閱讀了。
2.效能 & 空間
我不確定其他高階程式語言怎麼實作,至少在 C / C++ 裡面,某些
平台上最前面幾個 (0~4, 看平台) 參數是用 register 傳,剩下的
要放在stack 上。通常編譯器做最佳化的時候已經會直接一次把需要
的空間留下來,效能上大概不會有差,因為編譯器可以安排運算指令
讓需要傳的資料事先存在對的位址。但是堆疊的空間仍然是需要的。
在多緒執行的程式裡面,程式堆疊不一定如大家預期的是可以一直
成長的。在一些系統裡面,程式堆疊是固定大小,且這個大小還會
影響到開新的執行緒的速度。
最後,寫程式很多選擇都是取捨。要知道一個方法取什麼捨什麼,
才能真的判斷當下用這個方法適不適合。或許你的主管有他的想法
他沒講清楚 (可能他認為你還 junior? 我無從得知),也可能單純
是他鴨霸而已。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.30.76
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462674456.A.BE6.html
推 : 推1F 05/08 11:11
推 : 推2F 05/08 11:38
推 : 效能的部份我從來沒有想到過 XD,學習了
→ : 。
推 : 效能的部份我從來沒有想到過 XD,學習了
→ : 。
推 : 從來不管效能 只在乎程式美不美5F 05/09 11:19
→ : 推~6F 05/09 23:06
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 14:43:53 2016
※ 引述《ADYex (寵物狼音樹)》之銘言:
: 例如,假設在一個租書店的程式中有以下程式碼:
: BookPreservation bookPreservation = new BookPreservation(
: "Jack", "1433717", "2016/5/8", "2016/8/8");
: 其中4個參數分別為 userName, userId, startTime, endTime,
: 比較好的作法是將各自相關聯的參數各自包裝,變成:
: BookPreservation bookPreservation = new BookPreservation(
: new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8"));
: 這個重構手法能帶來的好處如下:
: 1. 提升可讀性
: 2. 未來維護簡單
: 3. 容易因此將相關功能移入新造的class中,改善程式碼分工
: 試著像這樣將原作法的壞處與新作法的好處跟主管說看看吧。或是塊陶。
這個的話還需要看在用甚麼程式語言吧.
像在VB和C# v4+上也可以這樣寫:
BookPreservation bookPreservation = new BookPreservation(
userName: "Jack",
userId: "1433717",
startTime: "2016/05/08",
endTime: "2016/08/08");
這樣寫比分拆成用property設定更好. 也是你之前說的「在初始化時設定」
和「先全部初始化成null, 在建構完成後再設定」的差別.
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.238.59.15
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462689836.A.F5A.html
※ 編輯: leicheong (61.238.59.15), 05/08/2016 14:44:55
推 : 是啊,不過能這樣指定的是少數1F 05/08 23:11
→ : 所以跟語言有關...2F 05/08 23:44
→ : 不能這樣用的語言,其實也可以把一個物件拆成多個小物件
→ : 藉此減少參數量
→ : 不能這樣用的語言,其實也可以把一個物件拆成多個小物件
→ : 藉此減少參數量
推 : 寫程式跟作文一樣,文字的呈現也是種藝術5F 05/10 23:28
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 14:49:29 2016
我覺得在台灣跟別人code review常常會有三種結果
第一種是覺得我以前這樣寫都沒問題
幹麻還要用另外一種寫法
第二種是物件導向、重構、設計模式洗三小
書上的東西不能拿來現實中用
我只知道硬幹一樣可以解決問題啦!
第三種就是可能知道物件導向、重構、設計模式洗三小
但也沒說到精通的地步
可是你一跟他討論就一副老子就是要跟你戰到贏的姿態
第一種最容易在主管身上出現
第三種最容易在還在coding階段的工程師身上出現
第二種則是資深工程師跟資深主管最容易出現
我覺得code review除了可以知道自己程式哪裡寫的不好
同時也是可以知道自己哪裡不足
或是還有哪些招式可以用的最好時機
因為每種解法都代表著每種不同的思維
但也許是台灣教育從小缺乏批判性的思考與自省
所以有些工程師從一開始寫程式就是硬幹硬幹硬幹
從來沒考慮過是否還有更彈性更好的寫法
然後只要稍微要改需求就整個崩潰
只要出現一個bug就要加班好幾天
以為寫程式本來就會有bug
所以硬幹就對了有bug再說
然後整天靠北當軟體工程師好苦天天都要加班
明明就是自己造孽的結果
一種就是我講的還沒討論之前他就已經認為他已經是對的
遇到這種我覺得最靠北
這種人偏偏又似懂非懂
像是我遇過國內前三大資工畢業的
看到我的SQL有用join居然問我用join的效率不是很差嘛
當下我是還滿想酸難道要像現在一樣所有欄位都用子查詢
同一個talbe每一個欄位要取對應的資料就全部查一次效率才好?
不過這問題太…超乎我的程度我直接轉移話題懶的去澄清
有些人則是在討論的時候狂攻擊你的論點
然後你用另外一個回答反駁的時候他又繼續找下一個問題攻擊你
反正不管怎樣他的結論就是「你錯了」
這些人基本上我都能避免跟他們討論就避免
因為除了浪費時間外
可能因為你砍站不夠、不夠資深就覺得你一定是錯的
這種想法也是很狹隘
良性的互戰可以從溝通中攻擊對方論點的不足
以及被對方攻擊自己的論點
尤其是自己的論點被攻擊時
也代表著也許你對這事物的觀念還有你似懂非懂的地方
這時就是可以進步的地方就可以讓自己越戰越強(誤)
也可以反芻自己所學過的東西
但可惜我看到的很多還是重點不是在討論而是怎麼戰贏對方
最後對方不爽
自己也沒發現自己觀點缺陷的地方變成雙輸的局面
回到原PO的問題
我相信原PO也是求道之人
也是希望程式能寫的更好才會去翻那些書學那些技巧
但有的時候你真的無法跟夏蟲語冰
效能跟可讀性有時本來就要有所取捨
但現在硬體設備越來越強大的情況下
除非真的系統有超級高效能需求或是嵌入是系統資源少到靠北
否則還是應該要以可讀性為主
縱使會犧牲一點效能(不影響使用者體驗的情況)
也許你主管那時代就是對效能斤斤計較
現在他幹主管了還是那一套思維
你也知道台灣一狗票人當主管後
程度、知識水平就停在他離開工程師職位的那一瞬間了甚至還倒退
這種情況下勸你還是少費唇舌說服他
因為從你的內容來看他已經有「你一定是錯的」主觀意識了
所以你怎樣講都沒用
尤其他現在可能也不寫程式了
摔坑的人也不是他
所以他更難體會可讀性是三小這回事了
結論
如果你真的很在意你想的是精進自己程式功力
那就離職吧
我認為無腦的東西也不會因為你寫過一萬次就變得有腦
面試時其實就可以多問問公司內部開發上有沒有相關的觀念
沒觀念也沒關係
至少主管不要來亂就好
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.44.10.232
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462690172.A.0B3.html
推 : 推這篇1F 05/08 15:37
推 : 同推本篇,這大串很明顯的就是例案三的情況2F 05/09 14:17
→ : code review的用意很多,有時即使或許你是對的,但管理
→ : 面上,你的技術水平太過突出團隊,還是要把你打下來
→ : 不然將來code沒人接手怎辦?身處團隊就要跟著團隊走
→ : code review的用意很多,有時即使或許你是對的,但管理
→ : 面上,你的技術水平太過突出團隊,還是要把你打下來
→ : 不然將來code沒人接手怎辦?身處團隊就要跟著團隊走
→ : 雖然我是想推 公司要垃圾就給垃圾啦.只是我沒想過竟然這種6F 05/09 14:22
→ : 想法還可以再往上升一級.變成樓上大大的那種說法=_=
→ : 當團隊招人招來的都是垃圾(不可回收) 所以就算是非垃圾也要
→ : 一起做垃圾事 不然後面可回收的離職..再招進來垃圾造成程式
→ : 接不起來怎辦?嗯~這真的是另一種"維護性"的考量...
→ : 只是大概這種"維護性"大概不是發明這些東西的人之目標就是
→ : 想法還可以再往上升一級.變成樓上大大的那種說法=_=
→ : 當團隊招人招來的都是垃圾(不可回收) 所以就算是非垃圾也要
→ : 一起做垃圾事 不然後面可回收的離職..再招進來垃圾造成程式
→ : 接不起來怎辦?嗯~這真的是另一種"維護性"的考量...
→ : 只是大概這種"維護性"大概不是發明這些東西的人之目標就是
→ : 還滿中肯的~12F 05/09 23:07
推 : 開頭的前三點,就代表你知道的太多了..13F 05/10 12:58
推 : 這篇中肯14F 05/11 18:03
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Sun May 8 18:32:07 2016
繼續占版面分享少許心得。
在Python中也有類似直接指定參數的寫法,如:
book_preservation = BookPreservation(user_name="Jack",...)
如果這些參數只是單純指定進去當作fields的話,
的確這樣的寫法就夠用了:)
下面分享一下這個重構手法的第3個好處:
3. 容易因此將相關功能移入新造的class中,改善程式碼分工
假設在我們的租書店程式中,在caller端有以下程式碼:
class PreservationChecker{
void checkPreservation(
String userName, String userId, String startTime, String endTime){
BookPreservation bookPreservation = new BookPreservation(
"Jack", "1433717", "2016/5/8", "2016/8/8");
if(!isInTime(
bookPreservation.getStartTime(),
bookPreservation.getEndTime())){
return;
}
// 其他動作
}
boolean isInTime(String startTime, String endTime){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
// 其他 methods
}
透過上一篇文章中提到的重構手法,我們可以得到以下程式碼:
class PreservationChecker{
void checkPreservation(
String userName, String userId, String startTime, String endTime){
TimePeriod timePeriod = new TimePeriod("2016/5/8", "2016/8/8");
BookPreservation bookPreservation = new BookPreservation(
new User("Jack", "1433717"), timePeriod);
if(!isInTime(
timePeriod.getStartTime(),
timePeriod.getEndTime())){
return;
}
// 其他動作
}
boolean isInTime(String startTime, String endTime){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
// 其他methods
}
以及2個根據參數關係所分離出來的class: User與TimePeriod。
接下來,因為caller端的程式碼可能已經太多了,
或是在其他地方也有使用到TimePeriod的時間檢查,
好比說、可能另外有個租書店用來舉辦活動的程式碼,
用來檢查今天是不是應該給客人30元優惠:
class FesCoupon{
private String startTime;
private String endTime;
double getCouponAmount(){
if(!isInTime(
this.getStartTime(),
this.getEndTime())){
return 0;
}
return 30;
}
// 以下是重複碼
boolean isInTime(String startTime, String endTime){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
}
因為我們先前把BookPreservation的2個時間相關參數,
透過Extract Class,得到了TimePeriod這個class,
我們現在就可以把重複碼isInTime()放進去,得到:
class TimePeriod{
private String startTime;
private String endTIme;
boolean isInTime(){
Calendar calendar = Calendar.getInstance();
// 檢查過程
return result;
}
}
然後、上述兩個引用點就可以精簡為:
class PreservationChecker{
void checkPreservation(
String userName, String userId, String startTime, String endTime){
TimePeriod timePeriod = new TimePeriod("2016/5/8", "2016/8/8");
BookPreservation bookPreservation = new BookPreservation(
new User("Jack", "1433717"), timePeriod);
if(!timePeriod.isInTime()){
return;
}
// 其他動作
}
// 其他methods
}
class FesCoupon{
private TimePeriod timePeriod;
double getCouponAmount(){
if(!timePeriod.isInTime()){
return 0;
}
return 30;
}
}
如此,
不僅消除了2個caller class當中的重複碼,
也將isInTime()這個methods放到了與最相關的class當中(也就是TimePeriod)。
即使在支援直接指定參數寫法的語言,如Python中,
也能因為這個重構手法,而獲得以上2個改善的好處。
※ 引述《leicheong (睡魔)》之銘言:
: ※ 引述《ADYex (寵物狼音樹)》之銘言:
: : 例如,假設在一個租書店的程式中有以下程式碼:
: : BookPreservation bookPreservation = new BookPreservation(
: : "Jack", "1433717", "2016/5/8", "2016/8/8");
: : 其中4個參數分別為 userName, userId, startTime, endTime,
: : 比較好的作法是將各自相關聯的參數各自包裝,變成:
: : BookPreservation bookPreservation = new BookPreservation(
: : new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8"));
: : 這個重構手法能帶來的好處如下:
: : 1. 提升可讀性
: : 2. 未來維護簡單
: : 3. 容易因此將相關功能移入新造的class中,改善程式碼分工
: : 試著像這樣將原作法的壞處與新作法的好處跟主管說看看吧。或是塊陶。
: 這個的話還需要看在用甚麼程式語言吧.
: 像在VB和C# v4+上也可以這樣寫:
: BookPreservation bookPreservation = new BookPreservation(
: userName: "Jack",
: userId: "1433717",
: startTime: "2016/05/08",
: endTime: "2016/08/08");
: 這樣寫比分拆成用property設定更好. 也是你之前說的「在初始化時設定」
: 和「先全部初始化成null, 在建構完成後再設定」的差別.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.166.119
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462703532.A.A73.html
→ : 雖然是用Java舉例,希望這樣看得懂在其他語言中的適用性 :P1F 05/08 18:35
推 : 推2F 05/09 00:49
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Mon May 9 01:54:24 2016
看完後這整件事情其實都不是在技術上,都是在人身上,主管與員工的相處
組員一直頂撞主管,先不論主管組員的技術與知識
1. 對組員而言,是希望往好維護方向前進
2. 對主管而言,效能效能效能,我才是強者....
好了,其實有一種主管就是,他甚麼都覺得自己最強,照他的做,不要頂嘴
(你這次考績已經黑了)
有一種組員就是程式我在維護的,我當然是寫好維護的
反正就是人生的道路上你們兩個是衝突的。
你今天上來講這件事情,或許想解決這個問題,或許也只是討拍文
我是覺得寫程式沒有甚麼對錯,可以跑出正確結果就是對的
程式只能比執行速度跟有無bug,好不好維護都是"人"的問題
(今天要新增功能,好維護有可能開發速度快,但是,是人開發的速度
對客戶而言,你時間內可以把程式交出來就好,對主管而言,他只要掌控Dead line就好)
大家立場不同,如果你不想離職,先想想看往後遇到同樣Case要怎麼應付
如果想要離職,也不用想後續結果了,做自己開心的。
可以對技術執著,但是不要鑽牛角尖,寫程式是快樂的,不要把自己逼到這種地步。
分享你可以分享在網路上面,認同或者被你幫助的人自然會把你的理念再繼續散發出去
※ 引述《purin88 (原來我是憤怒的鄉民)》之銘言:
: code review時,主管說暫存變數可省記憶體,不用一直建立變數佔記憶體,我就說重
: 構這本書作
: 者建議別這樣做,我就拿下面這個重構作者的網址
: https://sourcemaking.com/refactoring/split-temporary-variable
: 他就說這個作者有問題,說我跟他寫一樣出去別人
: 會笑我
: 接著,我程式有用簡單工廠模式,就像head first design patten的內容一樣建立pizza
: 店的工廠,他又
: 說為什麼要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我說每間pizza店
: 產生pizza囗味,方法不同,他又說建立A pizza店,B pizza店
: 產生物件浪費記憶體,為何不用switch case判定
: 是A或B,直接寫各店pizza的作法及口味,產生pizza的作法何必封
: 裝在A pizza物件,或B物件中,全寫在pizza這個程式中,寫一個類別靜態方法回傳pizza
: 一樣的,他沒看過design patten,也覺得四人幫在亂寫一通,建立物件是浪費記憶體
: https://rongli.gitbooks.io/design-pattern/content/chapter1.html
: https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact
: ory-pattern.aspx
: 然後談到建立物件,我是用set get的方式設置參數,他就覺得為什麼不用建構子把好幾
: 個參數丟進去,我一樣拿出
: https://sourcemaking.com/refactoring/smells/long-parameter-list
: http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change
: .html?m=1
: 重構的作者是建議參數不用丟太多,建立一個物件,
: 設定物件的值,把物件丟進建構子,或方法參數中,然後我這樣跟我主管說,他又說我沒
: 腦袋嗎
: 沒辦法判定這個作者有問題
: 參數本來就全丟給建構子,讓建構子去塞,即便
: 參數很多也沒關係,說我物件導向沒學好
: 反正一直在對我人身攻擊,即使我提到重構
: 設計模式,對他來說就是爛書,作者亂寫
: 請問我該如何是好?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.166.145.9
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462730066.A.78F.html
→ : 滿中肯的~1F 05/09 23:10
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Mon May 9 11:03:59 2016
個人是半路出家,去資策會閉關半年入這行的
不學無術先請別見怪
以我自己來說,從來不覺得程式寫法有甚麼優劣,程式是幫客戶解決問題的
只要能達到目的,效能可以達到,維護不困難
沒必要在那裏鼓吹什麼手法
當然或許是因為我做過很久的維運
個人反而不喜歡一堆抽象化的手法
當客戶火燒屁股電話追殺的時候
我還必須要追到抽象的類別或介面,然後判斷到底產生的是啥鳥物件
到底幹了那些好事
那開發者你還不如每一個類別乖乖地用複製貼上,我還比較好追
每個人都有自己立場
開發的人覺得自己的程式寫得很"優美",不重複
後頭維運的人如果技術層次跟不上
只有兩種可能,想辦法跟上,或是把問題踢回給你自己處理
另外像我有一個傾向
就是一個專案只要開始做,大家決定用甚麼技術後
不管有甚麼新的了不起技術
開會只要有人要用新東西,個人一概反對到底
除非不用無法解決現行問題,不然不管多沒水準還是一律要用一開始律定的技術
這是開發的紀律,要用請用在別的案子
很簡單,專案不是給你練功夫的
你懂別人不懂
不代表你厲害,只代表你"搖屁股",替"隊友"製造麻煩而已
像我就遇過很有進取心的同事
每一個功能,只要有進化的可能,他都要做點小修改
然後最初的功能跟最後寫的差很大...
等到他走了
接手他的功能,大家幹到沒力!
老兄,你還不如每個功能都一樣寫法!
以RD來說,這當然是有點不進取,我也承認啦
不過就像前面說的
個人維運做很久
有時候必須想的不全然只有自己的立場
抱歉以上得罪諸多高手之處,再一次致上歉意
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.125.79
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462763041.A.66F.html
→ : 肯定你對維運的想法, 不過完全這樣子執行也會有盲點1F 05/09 11:11
→ : DevOps也是因為這個盲點應運而生 可以參考看看
→ : DevOps也是因為這個盲點應運而生 可以參考看看
推 : my code is elegant3F 05/09 11:26
推 : 這種做法就是code無限增加,最後要耗費極4F 05/09 13:07
→ : 龐大人力在維護舊code上
→ : 金融業很多這種code
→ : 龐大人力在維護舊code上
→ : 金融業很多這種code
推 : 所以別請這種技術跟不上也不想跟上的人來拖累團隊7F 05/09 13:36
推 : 這種寫法除非你們不給客戶改規格,不然遇到一些特定的事情8F 05/09 13:52
→ : 的時候會很慘就是了(比如有上百個同樣的程式碼之中的一處
→ : 需要修改的時候)
→ : 程式碼要寫的大家都懂才好維護沒錯
→ : 的時候會很慘就是了(比如有上百個同樣的程式碼之中的一處
→ : 需要修改的時候)
→ : 程式碼要寫的大家都懂才好維護沒錯
→ : 我會覺得這是開發者的水準還不夠 因此不好維護12F 05/09 13:55
→ : 沒考慮到維護問題的話其實有隨意交差的感覺
→ : 我之前維護的code就是這樣 我還因此補了一份文件XD
→ : 結果最後出問題居然是交接人的在版本控管上弄爆了...
→ : 沒考慮到維護問題的話其實有隨意交差的感覺
→ : 我之前維護的code就是這樣 我還因此補了一份文件XD
→ : 結果最後出問題居然是交接人的在版本控管上弄爆了...
→ : 我是看不出來你所謂的不重複是什麼,但如果是說DRY的話16F 05/09 13:58
→ : 絕對不是他有問題.....
推 : 補充:除非他是到濫用的地步
→ : 絕對不是他有問題.....
推 : 補充:除非他是到濫用的地步
→ : 別請技術跟不上的 VS 不收水準太高的(相對) XD.以慣老闆的19F 05/09 14:36
→ : 角度來說 如果維運不是問題(反正燒時間是工程師的事) 那當
→ : 然是前者好...(雖然日後要改組後者時 通常會死路就是了XD)
→ : 角度來說 如果維運不是問題(反正燒時間是工程師的事) 那當
→ : 然是前者好...(雖然日後要改組後者時 通常會死路就是了XD)
→ : 不能怪你, 因為我在太多公司看過這種觀念的RD22F 05/09 15:11
→ : "達到目的,效能可以達到,維護不困難"這不就是優劣之分了嗎?23F 05/09 15:28
推 : 我是覺得 請見人說人話 見鬼說鬼話 如果你的公司就是這樣24F 05/09 15:38
→ : 那拒絕任何新東西 完全土法煉鋼 也無所謂 但如果你公司對於
→ : 這樣子玩覺得很落伍 風氣就是開放和實驗精神 那就從善如流
→ : 那拒絕任何新東西 完全土法煉鋼 也無所謂 但如果你公司對於
→ : 這樣子玩覺得很落伍 風氣就是開放和實驗精神 那就從善如流
推 : 那如果出bug的是在你們重複貼上多次的code怎麼辦...27F 05/09 15:40
→ : 改到死然後可能在某個角落還是沒改到 找到機會再來陰
→ : 大家一把? 專案多小才能這樣玩?
→ : 改到死然後可能在某個角落還是沒改到 找到機會再來陰
→ : 大家一把? 專案多小才能這樣玩?
→ : 回樓上 ctrl + shift + f 全資料夾搜索一個一個改阿~XDDD30F 05/09 15:42
推 : sed -i 's/old/new' *31F 05/09 15:58
→ : @johnny: 這個時候就要學著寫程式碼產生器了32F 05/09 16:00
噓 : 那你的團隊只需要大學生剛畢業就好33F 05/09 16:17
→ : 自己火候不夠,連看懂別人的程式都是困難
→ : 自己火候不夠,連看懂別人的程式都是困難
推 : 可是這麼為接手的人著想 對自已有好處嗎35F 05/09 16:46
→ : 大不了註解寫清楚一點 邏輯別搞太亂就好了
→ : 大不了註解寫清楚一點 邏輯別搞太亂就好了
→ : @vi000246: 懂得如何教人也是一種學習印證啊37F 05/09 16:47
→ : 當然從收入來看又不會多份文件多拿錢...XD
→ : 當然從收入來看又不會多份文件多拿錢...XD
推 : 身為一個碼農 農就對了39F 05/09 17:03
推 : 推,有時候小小的功能還要抽介面實在是過度優化40F 05/09 17:29
推 : 有點像文學 有人覺得能表達就好 有人就很在乎文法詞41F 05/09 17:38
→ : 藻
→ : 藻
→ : 不同意43F 05/09 17:58
噓 : 不同意44F 05/09 18:47
噓 : 如果鼓吹abstract是多餘的,那鼓吹duplicate code又是45F 05/09 19:03
→ : 哪招?
→ : 哪招?
推 : 想不到已經2016年了會看到這種言論 XDD47F 05/09 19:38
→ : 這概念偷換有點嚴重喔,前面說不要用新技術,後面砲有48F 05/09 20:06
→ : RD 改 code。難道改 code 是一種新技術?
→ : 另外我是覺得很奇怪啦,code應該每個人都在PR時就該看
→ : 過了,不懂要問,不然就打槍。到最後才看不懂顯然是沒
→ : 做好自己的工作。
→ : RD 改 code。難道改 code 是一種新技術?
→ : 另外我是覺得很奇怪啦,code應該每個人都在PR時就該看
→ : 過了,不懂要問,不然就打槍。到最後才看不懂顯然是沒
→ : 做好自己的工作。
→ : 如果沒方法跟有方法,可以做到一樣的產出,那麼此文成立53F 05/09 20:51
→ : 不過常看到沒方法做著做著就落後/到屏頸了
→ : 不過常看到沒方法做著做著就落後/到屏頸了
→ : kerker,這種你要挑戰年薪破兩百就有點難了55F 05/09 21:36
噓 : 火燒屁股是因為沒把程式寫好 而不是抽象化的問題56F 05/09 21:37
噓 : 不同意57F 05/09 23:53
噓 : 基礎功不好,這樣你程度就跟英文比較好的高中生一樣58F 05/10 01:12
→ : 第二段無法認同59F 05/10 08:54
噓 : 完全不會比較好追 莫名其妙60F 05/10 09:33
噓 : 資策會的,不意外61F 05/10 13:06
噓 : 資策會出來也就這種程度了 你還是洗洗睡吧62F 05/10 13:32
推 : 不過真的要看隊友程度啦63F 05/10 13:43
→ : 簡單來說工作寫程式最難處理的部分是人XD64F 05/10 18:26
→ : 每個公司有每個公司的做法,但這種公司不會是高手的公司65F 05/10 19:48
推 : 這不是誰對誰錯的問題,而且程度跟思維差太多的結果66F 05/10 21:54
噓 : 但我可不記得資策會的吳老師是這樣教我的....67F 05/11 13:07
噓 : 資策會不意外 先學學怎麼寫log68F 05/12 06:33
推 : 複製貼上維護的時候會精神衰弱...「不是改過了?」69F 05/12 19:18
推 : 全部複製貼上,你在開玩笑嗎?如果要改邏輯!怎麼辦?70F 05/14 21:33
→ : 我也是資策會出來的!完全無法認同這作法...
→ : 我也是資策會出來的!完全無法認同這作法...
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Mon May 9 20:30:34 2016
我只能說多數人很容易陷入以為全世界就是自己看的那樣
以成語來說大概就是以管窺天吧
你說每個類別都乖乖複製貼上
你有沒有遇過一次改版要改全部系統
然後你那些貼上的地方要一個一個改的情況?
我還真的有遇過而且才剛結束
有時候我真的很好奇是不是有公司用程式碼長度來算薪水的?
明明就是一樣的東西一樣的動作
就是有人不喜歡抽離成一個工具方法
然後每一個地方都複製貼上
最後如果要改版就得全部挖出來一個一個改
然後改的時候還要確認是不是有跟其他複製的地方不一樣
這樣有比較爽嘛?
我認為寫程式所謂的優美
指的是程式簡潔好讀
這不是什麼潔癖
而是為了讓你能準時下班的必備coding style
我名言就是「偷懶的最好方法就是一次把程式寫好」
一次寫好抽離能抽離的部份使之能改到最少
你程式問題少user也就少來靠北
你能準時下班的機會就多
一堆人寫出來的程式耦合性強到靠北
然後要改的時候就跟玩疊疊樂一樣
可能抽一塊積木就整個垮了
這時候也只能加班收拾自己造的孽不然還能幹麻?
然後因為耦合性太強太難改就會想一堆奇奇怪怪的解決方法
最後終於長成四不像的怪獸天天浪費自己甚至下一個接手人的生命
而且就我觀察
這種人幾乎都是覺得寫程式就是這樣阿
也不會再去思考是否有更好的解決方案
每次聽到有人在那邊大放厥詞說什麼物件導向、重構、設計模式沒用我就心裡偷笑
這跟公開大聲跟大家說「老子實力弱到連物件導向的好處都體會不到」一樣意思
這種東西你本來就是要會遇到你才知道他的好
沒有實際遇過你跟講一百遍你還是無法體會
寫過好幾年程式還不能體會這些好處
那我只能說什麼樣的人就會待在什麼樣等級的地方
這是我幹過駐點待過公司看過一堆人之後的心得
也是我給自己最大的警惕
※ 引述《allenxxx (fufuxxx)》之銘言:
: 個人是半路出家,去資策會閉關半年入這行的
: 不學無術先請別見怪
: 以我自己來說,從來不覺得程式寫法有甚麼優劣,程式是幫客戶解決問題的
: 只要能達到目的,效能可以達到,維護不困難
: 沒必要在那裏鼓吹什麼手法
: 當然或許是因為我做過很久的維運
: 個人反而不喜歡一堆抽象化的手法
: 當客戶火燒屁股電話追殺的時候
: 我還必須要追到抽象的類別或介面,然後判斷到底產生的是啥鳥物件
: 到底幹了那些好事
: 那開發者你還不如每一個類別乖乖地用複製貼上,我還比較好追
: 每個人都有自己立場
: 開發的人覺得自己的程式寫得很"優美",不重複
: 後頭維運的人如果技術層次跟不上
: 只有兩種可能,想辦法跟上,或是把問題踢回給你自己處理
: 另外像我有一個傾向
: 就是一個專案只要開始做,大家決定用甚麼技術後
: 不管有甚麼新的了不起技術
: 開會只要有人要用新東西,個人一概反對到底
: 除非不用無法解決現行問題,不然不管多沒水準還是一律要用一開始律定的技術
: 這是開發的紀律,要用請用在別的案子
: 很簡單,專案不是給你練功夫的
: 你懂別人不懂
: 不代表你厲害,只代表你"搖屁股",替"隊友"製造麻煩而已
: 像我就遇過很有進取心的同事
: 每一個功能,只要有進化的可能,他都要做點小修改
: 然後最初的功能跟最後寫的差很大...
: 等到他走了
: 接手他的功能,大家幹到沒力!
: 老兄,你還不如每個功能都一樣寫法!
: 以RD來說,這當然是有點不進取,我也承認啦
: 不過就像前面說的
: 個人維運做很久
: 有時候必須想的不全然只有自己的立場
: 抱歉以上得罪諸多高手之處,再一次致上歉意
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.229.138
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462797038.A.76A.html
推 : 不學無術請別見怪 人間已經打好預防針了1F 05/09 20:49
推 : 也有例子是過度抽象化 改版也改不動的2F 05/09 21:22
→ : 簡潔應指邏輯和演算法簡潔, 不是語法簡潔
→ : 簡潔應指邏輯和演算法簡潔, 不是語法簡潔
簡潔的確在軟體中有很多含意
在這我的確指的是邏輯易讀好懂
像是code會有點髒但比較好讀跟簡潔但不好讀的寫法
我同常還是會選擇前者
推 : 這篇要轉到軟體黑特版嗎XDD(誤)4F 05/09 21:43
我只黑特拖我下班時間的打字工(根本就不是工程師好嗎!!!)
※ 編輯: aoksc (114.42.229.138), 05/09/2016 21:50:30
推 : 原PO怨念深重5F 05/09 22:03
推 : 敏捷開發和重構需要拉扯一下 但是6F 05/09 22:29
→ : 複製貼上和單元化 工廠化 之間沒有什麼懸念呀
→ : 我曾經有一個多月和原Po有類似想法 鼓勵原Po多體會 DP意
→ : 義阿
→ : 複製貼上和單元化 工廠化 之間沒有什麼懸念呀
→ : 我曾經有一個多月和原Po有類似想法 鼓勵原Po多體會 DP意
→ : 義阿
→ : 嗯,物件大師, 高手.10F 05/09 22:32
→ : 用了物件導向,就必然好維護,寫得快. 準時下班.
→ : 用了物件導向,就必然好維護,寫得快. 準時下班.
也沒那麼神
也是有人濫用搞到最後我還是要多花時間去處理的例子
技術的好壞最後還是操之於實現的人
推 : 物件導向用的好的人 懂一些註解之美還是會讓程式很好讀12F 05/09 22:34
→ : 的
→ : 的
推 : 看完這篇感覺大大就是最會嘴炮那型吧??14F 05/09 22:42
還好啦
至少我都嘴的有所本
不服的話我也很歡迎來討戰…喔是討論
→ : 物件導向不夠潮惹 現在最潮的是AI debug還有ML15F 05/09 22:47
推 : 有時候重複貼也不一定是壞事 例如一開始可以共用16F 05/09 22:47
→ : 但後來因需求改變 必須獨立出來不再共用 重複貼就很方便
→ : 所以我覺得這depend on project 很難說誰對誰錯
→ : 但後來因需求改變 必須獨立出來不再共用 重複貼就很方便
→ : 所以我覺得這depend on project 很難說誰對誰錯
受教了
我會再思考看看什麼情況用複製貼上是最好解法
但我看過的Code幾乎都是為了複製貼上而複製貼上…
推 : 你慘了,提到OOP,等一下又有人要跳出來推廣他的神見解了19F 05/09 23:04
→ : 話說@yyc1217,有需要獨立出來再COPY就好了啊XD,怕東西以
→ : 後會獨立出來所以就重複貼不是因噎廢食嗎XD
→ : 想想aoksc加班前說的話(誤)
※ 編輯: aoksc (114.42.229.138), 05/09/2016 23:18:43→ : 話說@yyc1217,有需要獨立出來再COPY就好了啊XD,怕東西以
→ : 後會獨立出來所以就重複貼不是因噎廢食嗎XD
→ : 想想aoksc加班前說的話(誤)
※ 編輯: aoksc (114.42.229.138), 05/09/2016 23:22:22
推 : 現實上 C&P的人因為產出比較多, 生的比較快23F 05/09 23:49
→ : 維護? 反正他升了, 這些東西留給下個人煩惱
→ : 維護? 反正他升了, 這些東西留給下個人煩惱
→ : 我遇到的是健保費 前人設計時沒想到後來有二代健保費25F 05/10 00:09
→ : 科技部 自籌款 邁項頂尖大學計畫扣除的對象 比例都不同
→ : 甚至學校 學院 系所等扣除的比例也不一樣 都是當初不會
→ : 想到的 因為最初就一個健保費 誰知明後年會不會多個三代
→ : 四代 又或是加收國保費之類的
→ : 所以我想說的是複製貼上不一定是壞事 因為需求會一直變動
→ : 最初設計的架構不一定能滿足後來的要求
→ : 阿我講的是大學裡的狀況
→ : 科技部 自籌款 邁項頂尖大學計畫扣除的對象 比例都不同
→ : 甚至學校 學院 系所等扣除的比例也不一樣 都是當初不會
→ : 想到的 因為最初就一個健保費 誰知明後年會不會多個三代
→ : 四代 又或是加收國保費之類的
→ : 所以我想說的是複製貼上不一定是壞事 因為需求會一直變動
→ : 最初設計的架構不一定能滿足後來的要求
→ : 阿我講的是大學裡的狀況
推 : 複製貼上,用來因應的是一次性,或者可預見的未來不會33F 05/10 00:24
→ : 變動的需求,因為可能根本沒有下次用到的機會,或者跟
→ : 本沒有修改的需要。反倒是如果預期每年規則都會有些修
→ : 改,更需要設計一個有彈性的架構
→ : 變動的需求,因為可能根本沒有下次用到的機會,或者跟
→ : 本沒有修改的需要。反倒是如果預期每年規則都會有些修
→ : 改,更需要設計一個有彈性的架構
推 : 同感37F 05/10 00:28
推 : 太中肯38F 05/10 00:43
推 : 頗為同意39F 05/10 08:47
推 : 我也同意 但有時就是人在江湖 身不由己 最好的解決辦法 就40F 05/10 09:21
→ : 是換一個工作 不然就算拿你寫的跟主管據理力爭 大概又會被
→ : 罵得更難聽 沒辦法 社會上這些人數量還不少
→ : 是換一個工作 不然就算拿你寫的跟主管據理力爭 大概又會被
→ : 罵得更難聽 沒辦法 社會上這些人數量還不少
推 : 現在同事寫了十支程式 結果每支有90%是copy % paste43F 05/10 11:06
推 : 請他們去維護寫得好的, 之後就會從那 copy 去改了 :D44F 05/10 13:34
→ : 現實上要知道功能是不是一次性有時很難45F 05/10 16:11
→ : 沒那麼複雜,寫的時候問一下自己:下次什麼時候要跑這46F 05/10 17:23
→ : 個?跑的時候要不要改東西?是不是參數改一下就可以?
→ : 這樣大概就抓得出來。如果寫完下次要用發現要改code,
→ : 就可以開始評估要不要簡單refactor。
→ : 個?跑的時候要不要改東西?是不是參數改一下就可以?
→ : 這樣大概就抓得出來。如果寫完下次要用發現要改code,
→ : 就可以開始評估要不要簡單refactor。
→ : 我之前有遇過要對兩種不同的class做很類似的事情50F 05/10 20:28
→ : 除了class不同之外要回傳的顯示訊息也不太一樣
→ : 還有兩個雖然做的是很類似的事但分屬不同功能區
→ : 但是因為只有兩種而且要做的東西已經發展滿成熟了
→ : 之後不太需要再變動 所以複製貼上應該也是不錯
→ : 可以直接看出兩個方法用的東西不一樣
→ : 不過如果勉強要抽離的話 我猜大概用泛型化或是參數
→ : 除了class不同之外要回傳的顯示訊息也不太一樣
→ : 還有兩個雖然做的是很類似的事但分屬不同功能區
→ : 但是因為只有兩種而且要做的東西已經發展滿成熟了
→ : 之後不太需要再變動 所以複製貼上應該也是不錯
→ : 可以直接看出兩個方法用的東西不一樣
→ : 不過如果勉強要抽離的話 我猜大概用泛型化或是參數
推 : 樓上的狀況感覺蠻直觀, 丟個 msg map 進去要秀時 call57F 05/10 20:33
→ : 傳入的複雜一點 裡面還要做一些分流判斷機制做不58F 05/10 20:34
→ : 方法 showMsg(key), 這樣可以用同一個方法秀不同訊息59F 05/10 20:34
→ : 同處理 不過為了兩種東西還有之後確定幾乎不會再60F 05/10 20:34
→ : 做的事類似就抽 util 以上吃晚餐中隨便說 @@61F 05/10 20:34
→ : 擴充的情況 我覺得複製貼上應該是比較清楚62F 05/10 20:35
→ : 之後不會再動的話就隨便了 XD63F 05/10 20:35
→ : msg抽出來也是可以 不過我覺得例如錯誤訊息64F 05/10 20:36
→ : 直接寫在那個方法的catch本身應該比較好讀
→ : 例如有兩個類別在方法中間五各有5個trycatch訊息
→ : 都有些不同,全抽出來丟到一個msg用key判別
→ : 這樣看方法的時候每次看訊息都要再跑到msg方法裡找
→ : 直接寫在那個方法的catch本身應該比較好讀
→ : 例如有兩個類別在方法中間五各有5個trycatch訊息
→ : 都有些不同,全抽出來丟到一個msg用key判別
→ : 這樣看方法的時候每次看訊息都要再跑到msg方法裡找
推 : 我說的很難判斷是不是一次性, 是指像是2代健保的狀況69F 05/10 20:51
→ : 喔喔, 原來是 class 裡自己的訊息 @@70F 05/10 20:51
→ : 有些政策面的改變會導致過去的假設失效71F 05/10 20:52
→ : 他沒有任何邏輯可言
→ : 他沒有任何邏輯可言
推 : (補推73F 05/10 21:36
→ : 推這篇~觀念比較正確74F 05/10 23:13
推 : 2代健保當然是當成一次性啊 XDD 這種東西不會每個禮拜75F 05/11 01:30
→ : 改啦,至少是以年在計算的
→ : 改啦,至少是以年在計算的
推 : 推77F 05/11 08:06
推 : 我們team之前的做法是bad smell出現時會紀錄到管理技術78F 05/11 08:32
→ : 債的表格,通常在下個sprint會做完修正,另外,紀錄的
→ : 當下就會大略評估最晚何時要改。比如效能大約可以知道多
→ : 少流量是極限,duplicate code這種我們會在出現第三次
→ : 的時候開始設計重構。
→ : 債的表格,通常在下個sprint會做完修正,另外,紀錄的
→ : 當下就會大略評估最晚何時要改。比如效能大約可以知道多
→ : 少流量是極限,duplicate code這種我們會在出現第三次
→ : 的時候開始設計重構。
推 : 講得不錯啊!然後居然有人覺得複製貼上較好,神奇83F 05/12 09:59
看板 Soft_Job
作者 標題 Re: [討論] 主管不認同書本的知識,說我沒學好程設
時間 Wed May 11 21:20:51 2016
原原PO令我想起我之前遇過一間公司也很奇葩
他們公司有訂coding style
然後你空格空錯主管就會用一種你殺他父母一樣的口氣吼你
吼到整間辨公室都知道你空格空錯 你程式有漏洞他們都還沒這麼兇
重點是我寫的是PHP 不是PYTHON那種空格有嚴格要求的程式
我勸他們用code formatter他們也不要
他們說"code formatter會安插程式碼在你的程式裡"
最好笑的話他們公司裡老屁股最大
我寫jquery時用了trigger這個function
他們就說"這個function在我們公司沒人用過 所以你不能用"
覺得他們太奇葩 就離職了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.121.218.99
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462972853.A.B77.html
→ : 他有說你沒學好程設嗎?1F 05/11 21:29
推 : 之前忘記有版友說遇過公司規定不能寫func2F 05/11 22:22
→ : tion的
→ : tion的
→ : 好像是有關code style的系列文中有一篇寫到trigger4F 05/11 22:40
→ : 我也有看過
→ : 我也有看過
推 : 樓上看過的,應該就是PO文者以前發的文章 XD6F 05/11 22:54
→ : PO文的人就是我自己XD7F 05/11 23:57
→ : 太神了XD8F 05/12 00:19
推 : 會code review又沒雅量的人,程度根本不夠,夠格的project9F 05/12 00:41
→ : leader根本不需要code review就能讓整個大project照他的
→ : 意思走
推 : 有沒有用trigger根本不是重點,根本見樹不見林
→ : leader根本不需要code review就能讓整個大project照他的
→ : 意思走
推 : 有沒有用trigger根本不是重點,根本見樹不見林
推 : 笑了13F 05/12 10:00
推 : XDDDDDD14F 05/12 10:08
推 : 哈哈哈哈15F 05/12 10:38
→ : 要求format卻不用formatter是哪招16F 05/12 10:51
→ : 就跟很多企業要求寫code卻要自己當compiler一樣啊(啥17F 05/12 11:05
→ : 不用自動formatter是因為他怕合併的時候,發現原來自己的18F 05/12 11:20
→ : 寫的code也沒有很合乎規則,整個程式異動部份太多不好比對
→ : 寫的code也沒有很合乎規則,整個程式異動部份太多不好比對
推 : 二愣子的老屁股也太到處都是了20F 05/12 19:14
推 : 我也有遇過刁 縮排 跟 空格的XDDD21F 05/12 22:22
推 : 2樓,你講的就是我22F 05/13 01:06
推 : 我覺得單就縮排和空格要整齊本來就是基本23F 05/13 01:27
→ : 條件,lint沒過連commit都送不出才對。
→ : 條件,lint沒過連commit都送不出才對。
→ : 那就要用formatter啊XD25F 05/13 01:50
→ : 是覺得縮排、空格這種細節,講第一次是提醒,講第二次是確26F 05/13 09:03
→ : 認工程師是遇到什麼問題,講到第三次發火很正常阿
→ : 認工程師是遇到什麼問題,講到第三次發火很正常阿
推 : 你要用formatter就要確保非這次commit範圍的code不會動到28F 05/13 15:24
--
※ 作者: terievv 時間: 2016-05-15 08:27:27
※ 看板: terievv 文章推薦值: 0 目前人氣: 0 累積人氣: 760
回列表(←)
分享