2008年3月31日星期一

一封回信

多希望能给十几年前的自己,也抄送一份……

在08-3-31,... <...> 写道:
- 隐藏引用文字 -
我是大一新生,半学期的大学生活,迷茫了。
现在学校学的是C++可是我以后希望能在嵌入式或者是linux下有所发展,
请问我现在该学些什么呢?
最近C++方面在看primer
还在看清华出的begining unix
下一步准备看APUE
不过还是希望您能给我点建议谢谢了。。。。该怎么发展。。。该怎么学习。请指点下。谢谢了。


从我的经验讲一点吧,个人体验,不一定就准确,希望能对你有些帮助
:)。
我想,数学是要好好学的。其实程序语言的语法,不拘哪一种教育背景的人,都是可以学会的。像我现在在ACCP做讲师,我的同事有个观点,只要能看懂冒泡排序的,就能做程序员。这个起点不可谓不低。未来的职业生涯,你可以倚之超越同侪的,首先就是数学功底。更重要的是,这种功力只有在教室中才有机会系统的学习。一旦你离开校园,被生活所累,几乎再无机会去增长数学知识。未来人生路远,只要你有成就,大把时间用来学习前卫的编程技术,享受电子游戏、体育竞技、甚至那些贵族化的娱乐。然而决定你未来能否卓而不群的这一基本功,却没有什么机会再来。
其次,课业中的数据结构、算法、组成原理等基础课,确是枯燥。但是不妨规矩的学一学,至少应该在中等以上。以上这些知识,包括数学,也许以后都不会直接用到。然而,要知道,一来书到用时方恨少,现学是来不及的,技多不压身,机会永远只留给有准备的人;二来,它们的潜作用是非常大的,基本功好与不好,直接决定未来的升值潜力。这方面我推荐机械工业出版社的一本老书《编码的奥秘》,绝对是本有趣有智,深入浅出的绝佳读物。
编程语言,不妨从简单的学起。C++是个好东西,不过只学它,可能会陷入困局。为语法束缚。可以学一学纯C,对C++的学习不无启发。C++解决了哪些C的问题?带来了什么新的问题?学习中如何取舍?两厢比对,会有很大收获。另外一些C的代码,历经时间考验,绝对是提升水平的上等教材。比如Apache或Python的源码、或Linux内核,或BSD内核。Bjarne有云,真正的OO高手,写纯C代码也能有良好的OO,这里面有些东西并不是非常深奥的。我自问并非C/C++高手,然而Python的内核代码一样让我受益良多。推荐你读一下Robert Chen的《Python源码剖析》。他的Blog上有,可以Google到。这个教程今年就要出版,不妨买一本细读。
另外,对于C++程序员,候捷先生编写的一系列有关C++,特别是泛型方面的书,很值得一读。当然书海无边,所费又颇高,可以与同学交错购买,交换阅读。不一定要遍阅。如有时间,不妨多写些代码。
对于初学者,我想最大的挫折莫过于成就感,重型编程语言,特别是没有IDE支撑的重型编程语言,往往要花费大量精力于编写重复的辅助性代码。这是非常折磨人的。所以我推荐学习一两门轻量的脚本语言,做为平时辅助思考,编写原型,甚至用来实操。
这方面,我个人推荐Python为首选。首先它非常易学,上手极快,然而又有比较完整的模型,更难得是与C良好的结合,可称C程序的良伴。在掌握一些类似SWIG的桥接工具后,C+Python发挥出的威力,并不弱于C++。再加上现在国内对它的关注日重,资源非常丰富,以后用来找工作,也是非常好的。而且它严格的编码排版要求,正是初学者养成良好编码风格与美感的力助。
我自己目前在学Perl,但是Perl应该说还是有一定门槛的,等到你大量编写*nix Shell或文本处理,再来学习不迟,不过Perl的很多思想,都极为精巧,有很高价值。如果在易学方面,Ruby和LUA,甚至JS,我都是很推荐的。如有精力,不妨学习一下Lisp语言,不必深入,花上一两周,用来开拓眼界就好。
可以预期的未来,嵌入式领域无非C/C++/Java,其它技术会有多种令人惊喜的发展,但是五年内,恐怕这三种语言的地位仍难被动摇。故如果想要在嵌入式领域深入,C是一定要学好的。多写些代码。或者不妨找一些Java环境,如Google的ADT工具,学习一下实用程序的开发。会对应用需求的把握有很大帮助。
工欲善其事,必先利其器,我推荐你读些专门介绍VI/Emacs使用的书籍(O'Reilly的就很好),这些工具的价值,绝非商业IDE可比。等你熟悉这些高度可扩展的编辑器,再学习IDE和RAD工具,会觉得了然于心,得心应手。
要学会用编程解决日常问题,学会超越Framework的束缚,快速直接的表达思想,学会优雅友好的代码风格。而在这种时候,快速轻量的脚本语言,它们的价值就体现出来。另外脚本语言的动态对象模型,也有助于我们跨过过度设计的障碍,理解设计与编码的本意
不知不觉说了很多,都是一个并不成功的过来人,所经历和感受到的,如果能使你的职业道路轻松一些,不胜荣幸。

2008年3月28日星期五

學習使用TiddyWiki

今天試用TiddyWiki,果然是個好東西。比較了一下,還是准備用繁體中文版。一來這個領域繁體中文社區比較活躍,二來最近正在用繁體,都統一在這上面看起來比較一致。
就是擔心以後要是給出版社交稿子,都是繁體怎麽辦XD。
話說我觀察了一下,這個繁體中文版雖然運行無礙,但是這一會兒已經被Firebug抱怨出了有五十個錯了,而且還在不斷的上升中==!。倒是簡體中文站上下載的那個頁完全沒有錯誤。不知道是不是PTW的這個2.30版太激進了,當然,我更懷疑是頁面上哪個插件在鬧事兒。

現在幾點?(Emacs:2008年03月28日 11:52 五 下午)剛才我把編碼改成UTF-8(默認BIG-5),錯誤好像少了些。

我想一段時間內我還是會使用Emacs Wiki為主,一來Emacs Wiki導入導出還是比較容易的,二來Emacs Wiki那個無限擴充的編程語言支持能力太逆天了……

2008年3月14日星期五

關于文本生成的惡趣味代碼

ZT我自己的文章:贊美Lee大神的存在,是他使得這篇博從正文到回復都充滿了愛……

----------下面就開幕的不再跑題分割線--------------------

緣起于 wayhome 朋友發到Python中文社區的一封郵件:

今天看书看了一个如下的ruby程序,于是想着用python来实现。就是从一个字符串产生一系列片段字符串

---------我的插入線--------------

CU的代碼高亮裏居然不包括Ruby!

---------我的飄走線-------------

#!/usr/bin/ruby

sentence = "refractory anemia with excess blasts in"
sentence_array = sentence.split
length = sentence_array.size
length.times do
(1..sentence_array.size).each do
|place_length|
puts sentence_array.slice(0,place
_length).join(" ")
end
sentence_array.shift
end
exit


如上,处理字符串为"refractory anemia with excess blasts in",
最后打印结果为:
refractory
refractory anemia
refractory anemia with
refractory anemia with excess
refractory anemia with excess blasts
refractory anemia with excess blasts in
anemia
anemia with
anemia with excess
anemia with excess blasts
anemia with excess blasts in
with
with excess
with excess blasts
with excess blasts in
excess
excess blasts
excess blasts in
blasts
blasts in
in

自己试着用python改写了下,发现自己写的长多了,还不得不写了一个方法。也许是自己Python学的不到家,有人也能用Python实现的像ruby那么简单么?

------------------面對踢館的應戰分割線----------------------

馬上 Samuel Chi 同學響應號召,寫出了如下代碼:



sentence = "refractory anemia with excess blasts in"
array = sentence.split()
length = len(array)
for i in range(length):
for j in range(length - i):
print ' '.join(array[i:i+j+1])


真是帥呆了……Wayhome同學也給出了自己改進後的實現代碼:


sentence = "refractory anemia with excess blasts in"
sentence_array = sentence.split()

while len(sentence_array):
for i in range(len(sentence_array)):
print ' '.join(sentence_array[0:i+1])
del sentence_array[0]


Lee 同學很快寫出了一個比較雷的代碼,如果你去看郵件,會發現他是在Shell裏寫出來的,還能看得到提示符:

foo = lambda m, x:[m and x[i:] or x[:i+1] for i in range(len(x))]
s = "refractory anemia with excess blasts in"
print "\n".join(map(lambda k:"\n".join(map(lambda i:" ".join(i),
k)), map(lambda x:foo(0, x), foo(1, s.split())[::-1])[::-1]))


大概怕把人民大眾嚇著,Lee隨後寫了一個稍稍不那麽雷的偽從良版本:


s = "refractory anemia with excess blasts in"

foo = lambda m, x:[m and x[i:] or x[:i+1] for i in range(len(x))]

print '\n'.join(["\n".join([" ".join(i) for i in k]) for k in
[foo(0, x) for x in foo(1, s.split())[::-1]]][::-1])


隨後有 George Lu 同學發了一個天雷陣陣的版本:


print '\n'.join(['\n'.join([' '.join(s.split()[i:][:j+1]) for j,x in enumerate(s.split()[i:])]) for i,t in enumerate(s.split())])


後 面還有三五個版本,都脫不出用索引+切割的方式來組合字符串的思路,我就想,如果可以用正則表達式,也許可以更簡單一些。不過這兩天忙著給公司配發的工作 機升級硬盤,一團亂糟糟,什麽都沒搞成。其實,這只是數學上簡單的組合,我們不用正則表達式,甚至不依賴索引,也可以寫得很清楚,當然,沒有這麽短(男人 幹嘛要追求短?XD):


# 文本在這兒
sentence = "refractory anemia with excess blasts in"

# 首先,我們切割出單詞數組
words = sentence.split()

# 其實,我們需要的是,每一個元素,和它後面的部分,因此,我們應該把它們 pop 出來,記得要從前面pop:):
while words:
# 從一個空列表開始
left = []
# 接收words中pop出來的單詞為起始
left.append(words.pop(0))
# 打印我們的起點
print left[0]
# 用餘下的部分復制出一個復本
right = words[:]
# 將餘下的部分逐個推到左邊
while right:
left.append(right.pop(0))
print ' '.join(left)



當然,這個代碼只是為了盡可能清楚的表現出操作的過程,它的特色就是完全沒有利用到數組長度這個指標,完全就是通過迭代實現的,如果你喜歡比較雷人的效果,不妨把它改為更簡短的方式。
今 天我在讀《精通正則表達式》的時候,學到這麽幾個知識點,一個呢,是Perl的正則表達式,可以通過(?:{...})嵌入代碼;另一個是(?!)可以告 知(欺騙?)正則引擎,當前的匹配失敗,讓它去嘗試下一個;最後就是/x可以將搜索“固化”,避免重復搜索。于是,這個程序在Perl中,只需要一行混合 了打印代碼的正則表達式……Perl果然不虧是文本處理之王!

my $sentence = "refractory anemia with excess blasts in";

$sentence =~ m/(?:\w+(?:\s|$))+?(?{print "$&\n";})(?!)/x;


其實要說雷,有什麽能比Haskell更雷呢?只是我對這東西還不熟,嘗試了一下,不能,就做罷鳥……有機會再試吧……

2008年3月9日星期日

窺看 2008 亞洲編程節

本來呢,潘縂發信,邀我同去來著。那個時候手上有個班的課沒結,加上以爲自己這個月就要去培訓,就沒敢答應。其實心裏那個嚮往啊……
最吐血的是,後來排出來,到四月份都沒我的培訓。在帶那個班嫌我講得不好,不聼我的課了,只好改了波波同學去上EJB。整整好到編程節那天沒事做。周五那個鬱悶啊……
……被老婆BS了……老婆說你早不跟我商量,早說我一定鼓動你去!……
……感動……老婆大人滿賽!……
其實,我週五就該翹班去圍觀的。但是又覺得不好意思去打擾Lee和老潘他們做事情,就一邊看Lee的現場郵件直播一邊流口水……555……
周六我過生日啊,大家見個面縂可以嘛……於是我周六下午跑去探班去鳥……
以下照片基本都來自ZQ同學的好看簿博客。大家要愛他,贊美他……

Lee怕我這路痴不認路,問我,你知道怎麽走麽?
嘿嘿,我終于揚眉吐氣了一次,昂首挺胸的說,當然知道,我以前就在這裡上班……
進來以後看招牌,原來是Google贊助,主辦方GDLC就不用説了,省府背景的,來頭還是挺大。參加的人員水平差距比較大,有老潘和ZQ這樣的名ID,還有國外來的高人,也有些職業學校的年輕學生,還沒什麽基礎,不過這樣也好,Open Source就是要平民化。這些年輕人接觸到了高水平的圈子,對他們以後的發展,多少會有些正面的影響吧。
參會的還有來自香港的團隊,以及SUSE Linux的團隊,據説水平都很高。可惜週五的開幕,周六白天的講課我都錯過了。

左起:成功企業家潘縂,猥瑣中年阿叔就是本人我,用小白的可愛小帥哥是Lee,最右邊的是某高校的老師,不熟。我進來以後,就很快跟潘宗搭上訕鳥……拍照的是ZQ,坐他身邊的是日本來的Niibe(新部裕)老師。

新部老師人很熱情很認真,活動期間一直在跟大家交流。我的英語很差,只有坐聼衆的份兒。最觸動我的是,我等ZQ他們人到齊,出去過生日的時候,Niibe老師和另一位日本前輩的盒飯到了,打開盒飯的第一件事,Niibe老師把蓋子上的飯粒一顆顆拈下來吃掉了。
除了談論技術的時候滔滔不絕,Niibe老師其實能看出是位比較内向的人。他為我們帶來了一個非遞歸分佈式的漢諾塔算法。重劍無鋒,大巧不工,可謂名匠風範。我在用Perl仿造他的算法,還沒有完成。

晚上聚會的合影……真是基情四射啊……我就不說有多混亂了……(其實一點也不混亂的說,哈哈哈)……
第二天藉口來幫忙,我順利混進鳥會場……

Lee大叔的招牌Show,帥吧。

老潘的團隊。我太太看了以後感慨,誰說IT界只有唐鳳一個美女的……該美女昨天上午做了一個簡單的分析案。上來第一句話“Python的字符串沒有類型約束麽?”……其實思路還算清晰,大概以前對動態語言沒有接觸吧。
Niibe老師有十幾年的Schema和Lisp經驗,另一位日本前輩是老Perl程序員。早上看我抱了本大駱駝書進來,很親切的問,你用Perl?我只好羞答答的承認,剛剛開始學……我整個上午都在忙著寫Perl版的漢諾塔,未遂……


可能是在場唯一一位白人,據説Ruby高手,中文極棒,可能中午的時候就是他在我後面輔導學生。完全聼不出來不是華人==!
我的Linux是早上才開始裝的,Ubuntu的國内鏡像好像出了問題,折騰了好久。時間不夠,我沒有等到活動結束就走了。漢諾塔只有等這幾天有空了來改。
走之前跟老潘他們打了招呼,本來想跟Niibe道個別,看到他正在給ZQ他們講Debian(Niibe老師是Debian社區的開發成員),我就離開了。
很懷念,希望下次這樣的活動不會錯過。