大貓共和國

Meow

如何定義 "會" XXX 程式語言

這是一篇我在Soft_Job版回應的文章。

其實我平時是不逛Soft_Jobs版的,寫這篇文章是因為女友在PTT看到這個主題,好奇我對於這件事的想法。開始動筆後不小心越寫越長,加上那陣子比較忙,結果花了十幾天才段段續續寫完。也感謝女友發揮編輯專業幫我潤稿 :)

以下保留BBS的排版風格,原文轉載於此。

作者: yzugsr (Big Cat) 看板: Soft_Job
標題: Re: [討論] 如何定義 "會" XXX 程式語言
時間: Sun Apr  1 23:43:02 2012


面試一個程式設計師時,要注意的面向很多
像是學習能力、溝通協調能力、實作能力…等等

在下是一名阿宅工程師,有時會需要一起面試未來的同事
在這些面向之中,我個人最重視實作和程式語言的部份(其他部份自然也有其他人把關)

以下就「Coding能力」、「語言的概念」、「語言的細節」、「函式庫的使用」幾項
與大家分享一下我在面試時會注意的事

# Coding能力

個人認為測驗Coding能力最有效的方式是「紙筆測試」
也就是不靠電腦/編譯器/除錯器的狀況下,請對方當面完成一段精簡的程式

有人覺得這樣考太難,面試考紙筆寫程式太殘酷
我聽聞不少公司會這樣考(ex. Facebook, Google, 國內一些軔體公司)
約耳趣談軟體中,也有一篇談論到這樣的測驗方式 http://goo.gl/YSCGy
我的標準也比約耳等人要寬鬆許多

拿約耳書上用C語言來考字串反轉的例子說明好了
我會在白板上寫下 void reverse(char * s),然後提問:

(1). 請實作將字串原地反轉的函式,不得呼叫其他函式
(2). 承上,不得進行動態記憶體配置
(3). 承上,不得使用數值(numeric)型別及運算

並且告訴對方:
不用緊張,沒有一次寫對沒關係,許多人都無法一次寫對。
但希望你能認真思考、除錯。

我會先從(1)問起,如果對方寫對,就再加上(2)和(3)的限制
如果是C語言高手,你給他(1)的限制,他通常會精簡的直接寫出(3)的答案

如果有錯誤,我會告訴面試者會出現什麼樣的錯誤
(Ex. Segmentation fault, compile error)
再詢問對方遇到這種狀況會如何除錯

P.S.提問者至少需要能夠人腦compile&emulate這些程式
    我可以在C/C++/Java/Ruby/Python上做到
    當然…不一定是考同樣的題目

我認為這樣的測驗可以看出許多東西(視題目的性質而定):
邏輯、思考方式、演算法、抗壓性、對寫程式的熟悉程度
我相信在面試的手法中,這樣做最能直接看出寫程式的實力

# 語言的概念

每個語言都是由若干概念組成的,先從一個例子開始說明吧:

  當一個只會C的人初學Java時,可能會碰到相當的瓶頸
  因為他不只學習了新的語法,還接觸了各種新的概念
  包括object oriented, garbage collection, class, interface, …

  當他再學習C#時,他會發現他只需要學習Java一半的時間,就能熟習C#的基本概念
  在看到某些設計時,他會想到:「喔喔,C#也有類似的設計」

  有一天他突然對腳本語言有興趣,所以他學習了Python,然後又遇到了撞牆期
  他同時接觸了以indent為block的語法
  還要學習dymanic typed, duck typing其實相關的設計方法

  當這個人再去學習Ruby時,他會發現他只需要學習Python一半的時間就學會基本
  當他再學習Lua時,他發現他只需要半天就可以看完語法,可以寫些簡單的小程式了

  數年後,他又因為興趣開始學習Erlang
  第一次接觸到Single-assignment, Functional Programming
  要入門又有好長的一段路要走

我認為重要的不是「會使用多少語言」,而是「對各種概念有多深的了解」
如果對方說會C++和Python,我會問他覺得兩種語言各有什麼特性、優缺點

很多時候對方會講不出來,或許不是面試者完全不了解
可能是對方不夠熟悉,或是不懂特定的專有名詞
這時可以再問一些問題,去試探對方對這些概念的了解程度

前面有版友提到:「我怎麼很少聽到有人自稱會很多程式語言的」
我相信在熟悉各種概念的前提下,要會很多種程式語言並非真的這麼稀奇

但就像Google在某些地區的徵才說明:

  请确保你简历中的所有内容都是可被核实的。例如,如果你的主要编程语言是Java或者
  Haskell,那么面试过程中就可能被问及此类话题。

如果有人說自己會C++
但發現他不懂template,甚至講不清楚物件導向的基本概念
列出C++不但不會加分,還會倒扣一些分數

很多時候,對方對程式設計的了解深淺,只要聊幾句就可以摸清楚
有時還是會碰到不確定對方實力的狀況,這時就看對方在紙筆測驗的表現當參考了

我不會因為對方在履歷上列出很多程式語言而扣分
但會希望列在履歷上的技能都是真材實料的,並會努力(笑)核實這些技能

# 語言的細節

我將初學時比較不會碰到,而在實戰、或看書深入研究才會了解的知識分為此類

舉例來說,像前面版友提到的:
* variable shadowing http://goo.gl/uy9In
* object slicing http://goo.gl/Gk6Ud

要自稱「精通」某個程式語言,就必需熟悉這些部分
才能在事前避開地雷,不致寫出有問題的設計及實作
也能在其他人遇到這類問題時,迅速幫助他找到原因

就我而言,對junior engineer來說這些是bonus,而不是requirement
只要基本概念、邏輯好,這些應該都很容易pick up

對於senior enginner而言
若團隊需要的是精通特定語言、技術的人,這點就很重要
換句話說,若是看重其他經驗/學習的potential
而需要能夠快速上手pick up各種技術的員工,這點就可以比較不看重

但若對方自稱擁有四年C++業界經驗
卻沒碰過、也沒聽過object slicing, variable shadowing
我也會對他的實力產生很大的疑惑

# 函式庫的使用

寫程式的人應該都聽過這句話:「不要總是重新發明輪子,要站在巨人的肩膀上。」
固然,為了練功去重刻底層函式庫是值得鼓勵的
但身為程式設計師,學習迅速利用、整合現有的工具,也是重要的課題

若團隊需要專精某Library/Framework的人材
面試者如果原本就精通那些函式庫,會有很大的加分作用
不過,老話一句,這些能力都是會在面試過程中被仔細提問核實的

然而,比起「用過那些函式庫」,我更重視是否理解函式庫的概念
這點與「語言的概念」相似,每個函式庫都可以拆解成一些核心概念

比方說,Spring核心最重要的概念,或許是Inverse of Control和Dependency Injection
若對方說用過Spring,我會對方為什麼選用Spring,他有什麼重要的特性
如果他說不出專有名詞,我會試著以例子測試他是否理解這些概念

接下來,我可能會問對方覺得Spring有什麼優點與缺點
能講出一些優點,算是基本的合格條件
有時被官方文件/書籍洗腦的結果,大多數的人都可以掰出一些優點
但如果優點/缺點都能侃侃而談言之有理,就代表他真的懂了

我同意約耳說的:「不會因應試者不掌握一種特定的技巧而拒絕他」
這裡我看重的有兩點:

1. 如果真正了解函式庫的概念,學習其他概念相似的函式庫時,很快就能上手
2. 如果對方本身碰的東西夠多,又在許多領域都能提出良好見解
我會相信對方對於學習新概念,也比較具有熱情跟效率的

此外,使用函式庫的時候,難免遇到種種問題
這些問題會來自於自身邏輯的錯誤、對函式庫的誤解、甚至函式庫本身的bug
這部份可以請對方談談之前的開發遇到的問題,以及解決問題的流程
試著了解對方是否擁有獨立解決問題的能力

----

不同的人,不同的團隊風格,在面試時會在意不同的事
以上是我的觀點,分享給大家參考

後記:
其實這篇文章十幾天前就開始動筆寫了
不過越寫越長,加上最近太忙,所以到今天才寫完

--
※ 發信站: 批踢踢實業坊(ptt.cc)

Comments