我們與PHP的距離(一): gethostbyname()

前言

自從加入a8c,PHP作為常備語言之一,時至今日仍然像顆出奇蛋一樣止不盡的驚喜。天底下沒有完美的語言,但至今確實沒有任何一個我寫過的程式語言比PHP讓我感到更『魔幻』。本系列專為從PHP之外的語言開啟碼農人生、卻因命運安排整天與PHP為伍的人撰寫,收集一些從其他語言的角度看來不可思議的設計。如果能讓在讀這篇文章的你在實務上踩到而懷疑人生前就釋懷,莫大的榮幸。

祝各位天天PHP,天天開心。

進入正題

首先來看看今天的主角:gethostbyname() 在文件中是怎麼描述的吧:

gethostbyname ( string $hostname ) : string

Returns the IPv4 address of the Internet host specified by hostname.

舉例來說:

php> print_r( gethostbyname( 'softman.blog' ) );
192.0.78.25
php> print_r( gethostbyname( 'localhost' ) );
127.0.0.1

很簡單吧。這基本上就是一個gethostbyname()系統函式的包裝,

但問題出在它的回傳值設計。根據官方文件:

Returns the IPv4 address or a string containing the unmodified hostname on failure.

『當錯誤發生時,會回傳無修改的hostname引數』

……………..

這神設計有兩個問題。第一,和許多PHP函式的錯誤行為相悖;第二,複雜的錯誤處理讓這個函式很難正確使用。如果你認為:

$hostname === gethostbyname( $hostname )

這樣就結了,那就太小看PHP惹 …

繼續閱讀 “我們與PHP的距離(一): gethostbyname()"

l()有什麼不對

話說PHP因為不像JavaScript內建的log函式庫就挺不錯,不同的源碼中總是可以看到自己的log函式。最常見的不外乎是可以印出任意個引數值到error log / stdout / stderr,或是印出第一個引數後回傳之。

誒~但可能是大家都想盡量少打些字吧,我發現這類函式經常被命名為 l()。對,就一個一柱定海的l

是很精簡啦,而且l這字看久也蠻美的 … 但個人認為這並不是一個好名字。為什麼?因為不夠明顯啊。這就有點像C++為什麼要引入static_cast reinterpret_cast啥的來取代C-style cast,要特別留意的東西應該要盡量設計成引人注目會比較好。

基於這項理由,我自己在用的是mango()guava()litchi()

……………….

……………….

真的啦,有code為證:

function mango( $val ) {
    if ( is_null( $val ) ) {
        return 'NULL';
    } elseif ( false === $val ) {
        return 'FALSE';
    } elseif ( true === $val ) {
        return 'TRUE';
    }

    return print_r( $val, true );
}

function guava() {
    $arg_strs = array_map( 'mango', func_get_args() );
    $log = join( ' ', $arg_strs );

    error_log( $log );
}

function litchi( $arg, $label = 'log value:' ) {
    guava( $label, $arg );
    return $arg;
}

說真的,自從我把這些log函式從WTF系列改成這台灣味的水果系列,整個人debug起來心平氣和,修為都提升了呢 🤪

而且另外的好處是很好搜尋啊。大家在提交源碼前相信公司都會要求把不必要的debugging log都拿掉吧?(啥?你們公司不用?塊陶啊~) 這樣只要ag guava就一定能找出所有的debugging log了呢。雖然也可以用ag '\bl\('找到所有的l()呼叫,但這打起來手就癢癢的,沒這麼順暢呢 … (個人因素

我在某次working tips分享中分享了這個小撇步,會後有人漲紅著臉拿了這個給我看:

function 👻( $val ) {
if ( is_null( $val ) ) {
return 'NULL';
} elseif ( false === $val ) {
return 'FALSE';
} elseif ( true === $val ) {
return 'TRUE';
}
return print_r( $val, true );
}
function 💩() {
$arg_strs = array_map( '👻', func_get_args() );
$log = join( ' ', $arg_strs );
error_log( $log );
}

嗯 … 真是超級明顯又好搜尋呢

函式的兩易一難

正文開始前,分享一段個人非常喜歡的演講:Philip Wadler的『Propositions as Types』:

其中有一段很讚的話:

Computer Science. There are only two things wrong with it: Computer and Science.

身為CS出身的碼農真的是被婊到心坎裡 …

這句話背後的意義是,我們真正在做的事情,其實是資訊的構築與轉換,計算機或程式語言不過剛好是我們用來處理這些問題的工具,也因此他認為較適合的名稱其實是Informatics之類的東東。什麼意思呢?例如Int版的toString如果用Haskell type annotation來寫,大概是

toString :: Int -> String

也就是從一個結構為整數的資訊到一個結構為字串的資訊的轉換。sort則是

sort :: Ord a => [a] -> [a]

從[a]到[a]雖然沒有發生資訊的類型轉換,但輸出的[a]會是排序過的。這件事通常不會表現在type annotation上,但硬要幹的話應該也不是不行;例如定義一個type叫OrderedArray,上式就變成

sort :: Ord a => [a] -> OrderedArray a

雖然骨子裡我們做的是如此充滿數學與工程的事情,也許正因為語言扮演要角吧?寫過幾年程式後,大家都會發展出自己的風格,為了避免一個code base被搞得像超現實主義的大雜燴,於是有了各式各樣的coding standard來做基本規範。一個好的coding standard,個人覺得會像是制定一個基本框架,讓大家能在維持基本結構統一的情況下發揮創意,就好像七言絕句或詞牌一樣,與各種programming paradigm交叉組合下,漸漸地寫程式這樣聽起來如此geek的事情,本質上好像與更為貼近了。

可能因為個人偏好functional programming吧?我寫程式喜歡以函式為單位開始,而不管用哪個語言,我寫一個函式的原則是兩易一難易讀、易測、難誤用

繼續閱讀 “函式的兩易一難"

OP: 進入業界前,該先學什麼呢?

『在學生時期最好先準備好哪些技能,在業界生存會更容易呢?』
『剛離開校園的菜鳥碼農,最好開始學習什麼?』
『回顧這幾年來的碼農生活,你認為哪些技能最重要?』
『…』

在這個瞬息萬變的資訊業界,只要累積一定年份的資歷,上列問題總是會被問過個幾次的。所謂他山之石可以攻錯,前人踩過的屎坑能不踩當然是不踩比較好;如果能從自己的經驗中提取些什麼,讓後輩可以走得比自己更快更遠,又何嘗不是美事一件?世代更迭,不就是這麼回事。

像什麼追蹤一些重要人物的twitter啦、讀一些經典好書啦、精通至少一項程式語言什麼的,我不覺得我有辦法寫得比Joel on SoftwarePragmatic Programmer之類的更好,但我倒是想推薦大家花點時間去學習一個許多人都忽略、甚至不屑分神照顧的事:

投資理財。

可能資訊產業實在是太夯了,我們從學生時代就聽過數不清的成功故事。創業成功、剛畢業就被網羅入Google、Facebook等大公司薪水多到花不完等等,在在告訴我們:code中自有顏如玉,code中自有黃金屋,放手去闖吧!更何況鑽研演算法和各種酷炫的科技坦白說刺激好玩太多了,結果許多資訊人認為投資理財很遜,根本懶得去碰。

面對現實吧!這些成功故事都屬於那些不到1%天賦異稟的人。像我這樣屬於其他99%的普通人,靠的就只有咬合力100T的牙齦,埋頭苦幹個10年終有小成,才發現黃金屋是有,只是還要再花10年自己蓋。

就我個人的經驗,其實學一些『正常的』投資理財概念不會花很多時間,卻受用無窮。類似的觀念甚至可以用在平日工作的時間分配與專案管理上。而且我認為,如果一個人沒辦法把10元用好,給他10萬元他也沒辦法用好。這就是為什麼經常聽到某些人中了幾百幾千萬的大獎,第一件事就是去買名車,然後過個一兩年還得賣車外加打工還債。

試在心中回答以下問題:

  1. 請問上個月您的儲蓄增/損多少錢?
  2. 請問上個月最大筆的支出來自何處?
  3. 請問您的儲蓄目標為幾年存到多少錢?

如果您很快就可以回答,恭喜您,請左轉ptt去讀些比這篇更有料的東西吧。然而,如果沒辦法不看任何紀錄就大致知道以上的答案,那您很可能跟以前的我一樣,對自己的財務漠不關心,還請你留下來聽我講講古。

以下彙整幾項個人覺得比較重要的概念簡介。

繼續閱讀 “OP: 進入業界前,該先學什麼呢?"