看板Soft_Job
舉一個自己碰到的真實例子。
前幾天在寫類似 Facebook 塗鴨牆的 content list UI,
這個 list 中的每一個 element 中的一些資料需要指定 element 才能拿到。
也就是說跟 DB query 第一次會拿到 list,裡面裝著 elements;
接著再 iterate 一次 list,才能把每個 element 裡面的資料拿回來。
我負責 UI 的部分,因為趕時間,所以只有做一個 updateList() 的 function,
這個 function 會刷新整份 list。
這時候問題就來了,我在每一次拿到新資料時,就叫一次 updateList(),
所以那個畫面的 UI 要閃動很多次才會完成。
雖然這是一個很簡單的問題,很快就能處理掉,
不過如果有學過時間複雜度,可以很清楚的知道,
這是因為整個更新 UI 的流程居然是 O(N^2)。
: : 分享些看法,約在 5~10 年前,資工系的人根本就不碰Web-based System,
: : 原因是因為,台灣電子產業太發達了,隨便去電子業上市櫃公司撈,
: : 薪水都比做Web-based Systems 的人高太多了。
: : 看到的履歷都是 C、C++、Algorithm、Firware、Driver....
: : 沒想到近五年,尤其是這兩三年,
: : 資工系的履歷幾乎全部變成 Web-based,或 Andoid 的人變多了。
: : 這還不打緊,可怕的是怎麼幾乎所有的人都在學"開發工具"阿
: : back-end:
: : PHP各種Frameworks、ASP.NET、Java 各種 MVC Framworks、
: : Python、Ruby各種 Frameworks。
: : front-end:
: : jQuery、bootstrap、各種主流JS Frameworks
: : Mobile:
: : Android 各種API怎麼呼叫、IOS 各種 API怎麼呼叫。
: : 這些都是國外幫你寫好好的 "開發工具",不太需要很難的知識,
: : 依照規定做事,看文件與範例程式,熟能生巧就會,只是快與慢的差別而已。
: : 到最後,台灣所有在寫軟體的人,有九成九的工作都是在學 API怎麼用而已。
: 其實我覺得大家都只是混口飯吃又不是每個人都想當技術狂熱者
: 明明就有現成的在那邊,知道怎麼改不就好了!?
: 基本上老闆管你會哪些東西? 老闆只會丟一個專案上來問你多久可以做完
: 整天趕專案都飽了回家還要Study,搞得自己完全沒有生活品質
: 當然以上感想是因為只待在中下階層...我了解中上階層是另外一個世界
: : 老鳥與新手的差別,就是多做幾年,可能做系統比較順與快一點而已。
: : 你覺得這種工作的薪資會高到哪?
: : 少學這些"開發工具",多去學數學、演算法、統計等基礎科目,
: : 再來就是各種演算法與數學的應用,如機器學習、
: : 影像處理、數值預測、使用者需求預測等等,你才有機會喊薪水阿。
: 老實說大家都說開發這些Mobile Soft,Web-based System
: 需要學"所謂基礎課程" (數學、演算法、統計)
: 但是每次問到學這些到底可以"應用"在哪?
: 大家只會說:這是基本功,這是應該學的,這是有幫助的
: 實在不解...
: 而且真正私底下問幾個已經從事以上工作3年的前輩
: 他們卻說:根本用不太到阿!!
: : 看到資工系的學生在學校都在學開發工具,
: : 或看到一些年近40歲的Programer的履歷,都只是各種API的呼叫,
: : 真的很為這些人擔心阿。
: 當然以上只是討論而已,因為進入這產業沒很久
--
http://changyuheng.github.io/
--
只針對基礎無用的部分回應,基礎讓我們在這個 case 可以立即找出 root cause。
因為那是用 API 去問的,API 的作者只提供這樣的方式。
因為 updateList() 要刷整份 list 所以是 O(N),
每處理一個 element 都 call 一次 updateList() 就要 O(N * N)。
這邊的立場是針對前一篇,因為有提到「知道怎麼改就好」,
所以這邊的「蠢方法」和「聰明知識」是要分開看的。
我假定前人先寫出了「蠢方法」,而現在接手這份 code 要改善這個問題,
當然解決這個問題還有其他方法、工具,解法也有很多種,
不過我想說的是最初級的演算法也能應用在平常工作中而且隨處可見。
※ 批踢踢實業坊(ptt.cc), 來自: 36.231.31.118※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1417507527.A.EED.html
推 Ting1024: 喔 12/02 16:15
推 Peruheru: 只有我覺得這篇是還沒打完就按到送出嗎? 12/02 16:24
推 osnq: 哈,我也覺得好像還沒講完~ 12/02 16:43
推 yourinfo: 為什麼不把elements和資料一次撈回來? 12/02 18:10
推 givemepass: 為何會是n^2 12/02 19:42
推 sing10407: 因為迴圈裡面又有迴圈;n平方是電腦可以忍受的最高複 12/02 19:46
→ sing10407: 雜度 12/02 19:46
推 CRPKT: 電腦複雜度再高都可以忍受吧,不能忍受的是人吧 XD 12/02 21:22
推 drajan: ....sing的理論是哪來的 12/02 22:04
推 sing10407: 做過insertion sort(n^2),10萬筆就要十秒,差不多了 12/02 22:48
→ x000032001: 差不多是...算超過十秒電腦會爆炸嗎? 12/02 22:53
推 sing10407: 也不是啦XD 複雜度在超過就...程式會跑比較久一點 12/02 22:54
推 kiii210: 10秒電腦不會爆炸 但是user會爆炸 12/02 23:29
→ tw689: 10秒電腦不會爆炸,主管會把你電到爆炸 12/02 23:30
→ qrtt1: 等不耐煩的 user 一直重新整理,你的 server 也可能爆炸油 12/02 23:42
→ TonyQ: 你先用一個蠢方法,然後再用聰明知識知道蠢的原因... 12/03 02:47
→ TonyQ: 總感覺哪怪怪的。 12/03 02:47
推 Push5F: 開一個arry(stack)把data都丟進去,pop出去的清掉吧@@??? 12/03 07:31
→ Push5F: 時間是O(2N~3N) 12/03 07:32
推 howdiun: 對基礎有了新的詮釋 12/03 09:13
推 GoalBased: 說真的..就算沒學過複雜度 也知道巢狀迴圈會比一個迴圈 12/03 10:35
→ GoalBased: 還有久呀.. 12/03 10:35
推 sing10407: 時間複雜度沒有O(2N)或O(3N),直接用O(N)表示就好 12/03 11:58
推 x000032001: ...有甚麼問題 糾正電腦知識跟我扯主管和user 別跳針 12/03 11:58
→ x000032001: 好嗎 12/03 11:58