2015年11月22日 星期日

我是平凡程式員

我很猶豫要不要發表這篇文章, 畢竟要把自己的平凡處曝露出來還蠻沒有面子的, 不過承認自己的不足之處也是一種勇氣的表現。

雖然我們公司 90%的工程師都用你開發的工具,但我們還是不聘用你》這篇文章有些時間了, 一開始也是很流行的話題, 在 facebook, 程式討論區很容易就可以看到一大串的討論。當初就想寫篇文章來抒發自己的想法, 不過我到最近才有空複習 tree, 總是要寫出 invert binary tree 再來抒發自己的想法比較實在, 嘴炮之餘也不忘練習, 嘴炮很過癮, 練習就痛苦多了。資工人寫不出 tree 沒有任何藉口, 是自己努力不夠, 亡羊補牢為時未晚。

演算法與資料結構不是我的強項, 網路上各種面試題目很容易就可以難倒我, tree 是很重要的資料結構, 我竟然不會寫, 很驚訝吧! 這是我的平凡之其一, 我總是靠著標準程式庫來迴避這問題, 而每當面試時, 就得拿出來複習一次。當然按照慣例也沒多久就忘了。

拜 google 之賜, invert binary tree 這題目網路上的討論很豐富, 以下是找到的相關資料:

[LeetCode] Invert Binary Tree
Invert Binary Tree
Microsoft Interview Question for Software Engineer / Developers

Usually 'reversing of a binary tree' means mirroring of the tree. So reversing of the tree:


original tree

  a
 / \
b   c
     \
      d

is the invert tree

    a
   / \
  c   b
 /
d 

leetcode 標示的困難度是: easy, 不過我連 binary tree 都建不出來如何還要談反轉它呢?

從建立一顆二元樹開始吧! 我參考 linux c 編程 - 一站式學習 (p 432) 先建立一顆 binary search tree, 再改成 template 版本, 準備用來實作 map/dictionary 這樣的資料結構。順便好好把 tree 複習一下, 什麼 pre-order, in-order, post-order 早已不復記憶。

我只學習 c++ 這個語言, 還是學不好, 連 template 也不會寫, 這次的 template 版本遇到不少難關, 總算寫出來, 這是我的平凡之其二。template 是 c++ 很厲害的一個特色, 用別人寫好的很過癮, 自己完成 template 版本就痛苦多了。

original tree

     c
 ____|____
 |       |
 b       f
_|__  ___|___
|  |  |     |
      e     z
     _|__  _|__
     |  |  |  |
           n
          _|__
          |  |
             u
            _|__
            |  |
            p
           _|__
           |  |

is the invert tree

       c
    ___|____
    |      |
    f      b
 ___|___  _|__
 |     |  |  |
 z     e
_|__  _|__
|  |  |  |
   n
  _|__
  |  |
  u
 _|__
 |  |
    p
   _|__
   |  |


平凡之其三, 這是我從網路上抄來的答案, 我沒能自己想出解法。

看完醫龍裡頭的霧島平凡人之說後, 第一個感想是: 「這不就是我嘛!」也和漫畫裡頭的平凡醫生們一樣, 放下心中重石, 我不能和朝田的天才手術相比, 但我也可以完成相同的心臟手術, 對我來說當然不是心臟手術, 而是軟體開發。可能我的程式技巧無法和天才程式員相比, 但我可以用普通的寫法來完成同樣的功能, 效率也許慢點, 程式可能大點, 但在現在計算機的發展下, 這些差異不會有巨大的影響。

一个平庸程序员的自白》更能描繪出這樣的心境, 不過我喜歡「平凡」這個詞而不是「平庸」。


可以平凡,不能平庸

平凡與平庸,是生活的兩種狀態,兩種心境。平凡的人,是機器上的一顆螺絲釘,毫不起眼,但在發揮著自己的用處,實現自己的價值。平庸的人,是一顆廢棄的螺絲釘,身處機器運轉之外,無心也無力參與機器的運作。

原來有好多平凡軟體開發人員也有同樣的困擾, 就讓我們接受平凡的自己與展現自己不平凡的本領吧!



如果有看這個 blog 的技術文章, 應該有發現到一個現象, 我最後留下的參考資料, 很大一部份都是中文的資料, 這是我的平凡之其四, 你一定常聽到軟體開發人員需要看原文資料吧! 不過他們指的原文通常是英文, 我不信原文是俄文你也能看得懂。我很需要翻譯或是中文的參考資料。

有沒有平凡之其五平凡之其六平凡之其七呢? 饒了我吧, 指出自己四個平凡之處, 面子已經掛不住了, 我可不想表現太多的平凡之處。

遇到C語言相關的兩個問題讓我心情壓抑 》這篇文章提到這樣的寫法:

for(unsigned int i = n - 1; i < (unsigned int)-1; i--)
我不會用這樣的寫法, 我的平凡腦袋轉了好幾圈, 在 A4 白紙上計算了很久我才搞懂。我會用一個變數來承接 n-1, 多了 4 byte (假設一個 int 佔 4 byte), recursive 200 次也才多了 800 byte, 就算在記憶體只有 32k, stack 規劃了 8k 的開發環境中, 也不是太大的負擔; 甚至在某些狀況下也可以用 static variable 來存, 就只會耗掉 4 byte, 怎麼看都比用這樣方式划算。我認為只有遇到像是標準程式庫那種要求才會有需要寫出這類的程式, 否則還是讓這些心法存在心中就好。

類似的東西:

if (!strcmp(str1, str2))
if (!ptr)    

我會儘量用下面的寫法:
   
if (strcmp(str1, str2) == 0)

编程的智慧》也提供了不少建議。

科技業老闆別再靠北沒人才了,先自問你有把人才當人看嗎?》台灣沒那麼多一定要人才才能做的工作, 大部份都是像我這樣的平凡人就可以勝任了, 或是一個團隊只需要一個人才, 剩下的就是平凡人可以發揮的空間, 但這些面試都很容易就刷掉我這樣的平凡人, 一樣沒有藉口, 是自己努力不夠。 自己雖然也對白板題很苦惱, 但我覺得這是很好的實力養成方式, 沒有編譯器的輔助, 在在都需要仔細考量, 才容易一次就寫出對的程式, 很久很久以前寫錯程式可是要付出很大的代價才能讓程式再重跑一次, 每個學生可是希望一次就寫對程式, 不想經過那痛苦的重跑程序, 現在編譯、執行程式很容易, 就忽略了這樣的練習。

當然通過艱難面試的人, 也要記得索取對應的報酬, 那是你應得的。報酬不一定是金錢, 正常的工作時數, 適當的工作時程都是。

 invert binary tree code:
https://github.com/descent/progs/tree/master/tree
./bst | ./tree/tree

可以看到漂亮的樹狀圖形。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。