Who Am I | 分類 | Q&A |
Pick-ups
> F.I.R 和Globe 和Keiko
> 有關玩TFT 的啟示
> 升4段後有感,這是有關圍棋的心路歷程
> Monster Hunter 中的龍屬性到底是甚麼?
> MySQL 的Linear Hash 到底有多「不亂」

Archive
2022-04
> 艾爾登法環結局淺解
2022-03
> Is Golang's error handling good or bad, comparing to `try...catch`?
2021-07
> 我又用Frameset 了
> 請不要參加Web Summit 2017 年的活動
> 制限籃球
> 雀魂
2021-04
> The things I tested on a broadcast queue - multiqueue2
> MySQL 的Linear Hash 到底有多「不亂」
2021-03
> Svelte 推坑文
2021-02
> 說說關於反射的那些事
2020-10
> Monster Hunter 中的龍屬性到底是甚麼?
2020-09
> MHW 遊記 ScreenShot 節錄 - 1
> MHW 遊記 ScreenShot 節錄 - 2
> MHW 遊記 ScreenShot 節錄 - 3
2020-08
> 升4段後有感,這是有關圍棋的心路歷程
2020-07
> How To Save your Facebook Archive
> 有關玩TFT 的啟示
2020-06
> Decompiling Eurobeat
> 有關Expressiveness (1)
> 有關正向心理學的突破的網友們的討論
> 完全信息遊戲的雜談
> 拆掉六人造人的勇氣
> 對話節錄 - 有關plurk推拉
> Github Daily Trending
2020-05
> 8. aCore - CPU 異常處理(1)
> 7. aCore - 全局界面
> 5. aCore - 正確寫入Buffer 的姿勢 - Volatile
> 6. aCore - 繼續完善字符輸出程序
> 4. aCore - 抽象化VGA
> 屎山推倒計劃
> 1. aCore - 配置Rust Project 和第一次建置
> 2. aCore - Boot image
> 3. aCore - Hello World
2019-11
> Export Facebook Friends list
2019-10
> Development Story on a Standalone Eventually Consistent KV-Store
2019-08
> now blog url
2019-06
> 北極光
> The things I tested on a broadcast queue - multiqueue2
2019-05
> Mio Based Coroutine Libs
> Benchmarking nom 2
> Benchmarking nom
> How does nom v.5 work?
> Multicasting in Rust
2016-07
> 戰zen5
2016-02
> 日記
> PHP7 Upgrade
2015-10
> 刻章的刻
> 日記
2015-07
> 手提裝置漫談
> Touhou Classic Techno 101
2015-06
> SEGA 麻雀能否與雀龍門和天鳳抗衡?
> 如何評價彭羚這個香港歌手?
> Feel Like Dance
> F.I.R 和Globe 和Keiko
> borders
> 在lol 中的情史-下
2015-05
> Old song suggestions - Coldplay - Paradise
> 山伯臨終
> 介紹
> 在lol 中的情史-上
> 在lol 中的情史-中
2015-04
> 中國易經歷史進化哲學原理
> 十年
2014-12
> [借來的CD]金曲蛻變 顧嘉煇 - 我稱之為顧嘉煇的電子樂器初體驗
> [我有的CD] Cling Cling
2014-11
> 夢幻ノ光
2014-07
> 簽名會
> Diary
> [隅田川夏戀歌]好難聽啊! 聽住咁多先orz
> 歸屬感
> [日麻]首次役滿
2014-06
> 試試用九方
> 雜記
> 雜記
2014-05
> 有關我的音樂
2014-04
> 旅遊中一瞬的回憶閃光更新
2014-03
> 推介:2048
> 一頁馬上高大上
> Marasy 回帶彈舊歌
2014-02
> DEA@KAC 2013 Champion 獎品
2014-01
> 轉貼: 2011年好聽粵語歌
> 又寫下音樂(Smile 1-15)
> 回覆備份
> 楊千嬅之老死
2013-12
> DEA
> fb
> 無待堂: 是的,我地柒咗
> backup Facebook 糟點
2013-11
> [NLP]踢爆坊間自我 增值 / 提升 大騙局手法!
> SNS 上最反智的舉止
> 三多蘭
> theme ec
> [中譯]中島みゆき - 清流
2013-10
> 回顧S3 展望S4
> 日記
> 最惡毒的公司
> Memorios
> 就我的圈子而言的普偏偏見 2
> 就我的圈子而言的普偏偏見
> 本気すぎるww曲に合わせてイルミネーションされる民家が凄過ぎる件w
2013-09
> diary
> 日記
> 良曲表
> 再說Daisuke
> 音樂日誌
> 一些apple 產品剛推出時的感覺
> 徒步1400公里返家 新聞
> 日記
> 日記
2013-08
> 20 Windows DAWs Worth Using
> 流水帳日記一份
> 雜記
> o2jam 今天的玩家水平
> 日記
> 日記
> 日記
2013-07
> ienaitoki
> 最近
> 風吹不走笑容
> Rock
2013-06
> [自翻]ロンドンは夜8時 中譯 中文歌詞 日文歌詞 (2015年2月5日更新)
> Daisuke 付拍子歌詞
> [DEA] 合體 行くぜっ!怪盗少女 の違い
> 論TPA 做戲的可能性
2013-05
> Show Line Number in Xcode
2013-04
> DEA 歌曲和編曲個人感想(5月6日更新)
> bitcoin
> 正面標簽和負面標簽
> 知識豆
> 最近
> 勘誤
2013-03
> 近日記たち
> Renoise
> F# 學習筆記 3 List
> F# 學習筆記 3 陣列和Assoc
> F# 學習筆記 5 等位和記錄
> F# 學習筆記 6 記錄和類別
> 最近的遊藝
> F# 學習筆記 7 介面
> 評價蔣薇的《表哥……不要搶我吃的,我餓了……》
> A little C programming...
> Programming for adults
> 遊戲日誌
2013-02
> Good Subjective, Bad Subjective
> 日記
> 0118 999 881 99 9119 725 3
> 日記
2013-01
> 日記
> 最近的更多記事 + Blood Brothers放售
> 2012 回顧
> 日記
2012-12
> 記事
2012-11
> 電話占い
2012-10
> DDR 各代最深印象曲
> Performance of OOP PHP versus non-OOP
> 漫談15年以來網頁開發的心路歷程
> eclipse "required version 8" not installed
2012-09
> 有關比較特別的日本商標的名字的來源
> 雜記
2012-08
> 桌球入門
> FIBA 2008年10月新規則
> Pentile
> Perfect Cherry Blossom 的聲圖大結合
> RF 和 X-Kizz 有感
2012-07
> 華匯
> old timetable
2012-04
> キミの隣で
> How to Launch Multiple Instances of Notepad++
> 數字和架空世界
> 粵語國語英語日語
2012-03
> 音樂日誌 : trust you, 213 原曲 【神霊廟 Stage1 ボス】 『ゴーストリード』
> 真三國無雙6 monster hunter tri-3g
2012-02
> 【初音ミク】千本桜 【歌詞 - 平假名あり】
> 神啊神啊
> F# 學習筆記 1 變數和函數
> F# 學習筆記 2 Tuple 和其他型別
> F# 學習筆記 4 更多函式
> [lol]全坦隊伍
> 百變香江
2012-01
> 小美
> つよがり
2011-12
> LEVEL5 -Judgelight-
> 厄爾尼洛
2011-11
> 偏好
> 續昨日的話
> 不得不說我的命是很希望和世界接通
> 20111105
> quota
2011-10
> locus (part1)
> FB 的惡劣生態
> template 留低
> 有關白書
2011-09
> 日記 - 感情線上
> 有關lol
> 日記
> 天下間最可怕的
> 抽象滲漏法則
2011-08
> KIMONO♥PRINCESS
> 音樂日誌
> 網遊
> viewed
> 瀏覽器
2011-07
> 摘錄
2011-06
> 回覆一篇
> 頂級期待列表
2011-05
> 和我玩是最悠閒的...這次是最終章了
> 強くなGoogle
> 丁噹 { 我是一隻小小鳥 } MV官方完整高清版
> 對細明體的愛
2011-04
> 留link
> 留link
> 日記
> 日記
> 【遊戯王5d's】遊星のテーマ
> No way : 門都沒有
2011-03
> Program
> They
> 每日都會做既事
> 日記
> 繼續寫煌黑心得
> 極好用
> Diary
> 日記
> ただ一つの願いさえ
2011-02
> 我看groupon
> 追憶
> 息子よ
> hanamizuki
> Sweets Time Midnight [東方Vocal] (附中譯歌詞、拼音及裏歌詞) [HQ]
> SI
> セブンスヘブンMAXION -Vague Ontology-
2011-01
> Asynchronization for Adsense, is that difficult?
> Vanni G - I say Yeah (extended version)
> 【化物語】高音質「君の知らない物語」FULL【ED】
> 日記
> 日記
> 有關打字
> Scotty - Pirates Of The Caribbean (Dave Darell Remix)
> 日記
> irresistiblement-sylvie vartan
> Irrésistiblement
> 在rb 底部加入...
> 日記
> 是日遊踪
> 深刻的啟示
2010-12
> Bang - Shooting Star (original)
> shooting star - bang original (from DDR 4th Mix)
> [pop'n]凛として咲く花の如く -- 歌詞
> いとくとら [恋愛サーキュレーション] 踊ってみた
> 心情
> 彼岸になりし曼珠沙華、其の輝図は何処
> In PHP a string is actually an array
> 其實我覺得我的人生只有快樂
> blog 系統之思
2010-11
> 日記
> 日記
> 愛物
> Diary
> I met Alexander today, on Skype.
> 夏祭り 羅馬字易唱易讀 lol
> 日記
> 留言備份
> 小小資訊-請各位友人看看
> Tetris - Radical / Instant Gravity Experience
> 上位人物
> 成功は_分の努力と_分の才能の兼ね合い
> 今日o2 成績
2010-10
> 好物
> DDR 好聽物
> 最近的生活
> 日記
> Diary(chronological)
> 雜記
> 日記
> 動漫
> 日記
> 音樂日誌
> ipad 最希望會有ge game
> Y Combinator 的話
> 音樂日誌
> Super Driver
> 回應我的blog 文
> 成吉思汗
> 情意結 陳慧嫻
2010-09
> 通識陷阱
> Discuz 和phpwind 的循環抄
> Quick Inspirations
> 你喜歡甚麼?不喜歡甚麼?
> Cups 網絡對戰版
> .htaccess - Allow Only By Referer
> 是我們對清純要求太高,太落伍,太糾結嗎?如果它曾經真的存在,現在又貌似死亡,那究竟是誰「謀殺」了清純?
> 初音ミクが円周率10,000桁覚えたようです。
> 亞貝的天堂template 分享(三欄, 灰)
> 造了新主題呢
> Tsukasa - Landscape
> 和我一起去隅田川吧!
> 【分享】隅田川夏戀歌 完整版 歌詞翻譯(微調7/6)
> Best Programming Jokes
> 電影(9月7)
> 外語歌(9月7)
> 那一夜,我哭跪在女兒面前:丫頭,你做什麼不好?!
> 異種
> ohohoh
2010-08
> 轉變
> 超神器
> 我想提倡英文引入一個ee 尾的用法
> Big4 其實黑過墨豆
> 感悟
> 日記
2010-07
>
> 小事回憶
> 積極
> 我打的日本麻將
> 我為甚麼打三麻?
> 東風三麻的思考方針
> 談論防守
2010-06
> 我最愛的專輯 - 東方蒼幻燈
> iTouch 2G 從iOS4降級出現3194未知錯誤的解決方案
> PHP 6 的新特性
> 現在寫 PHP6-compatible 的一些技巧
> APC(Alternative PHP Cache)
> Nobody
> BUG
> [文Bug]謝謝你的不珍惜,讓我學會了放棄
> 原來天使也會累
> 手紙 ~拝啓 十五の君へ~
> 上傳好物
2010-05
> [遊戲王]1000理論
> [遊戲王]壓縮卡組的價值
> [遊戲王]怪獸的平衡點
> 好歌 張學友的神之領域
> 盛大網絡的積極性
> 日記
> 證義搜查線
> ie-css3
> yugioh @ rm2k3
> When KISS is not DRY
> [mind streaming]What is the matter?
> A little bit earlier
> 失眠
2010-04
> Diary
> [分享]人魚
> 俄羅斯, 美國, 中國
> Girls' Generation
> 最近的生活
2010-03
> PHP Template Engine Critique
> [舊聞]Microsoft Zune HD(32G銀色)評測 (轉自IT168數碼網)
> 最近的生活
> ohoh
> Short, Simple and Full guide to install tomcat6 on ubuntu 9.10
> [分享]極好用的color picker
> PSP 的地球
> 真三国无双 MR2
2010-02
> 試想中國近二十年的教育狀況
> −華恋 −emotions− 「A.K.A. 華爛漫 -Flowers-」
> 好神
> 小數
> 超經典的
2010-01
> Youtube player ytp
> 加點
> 小故事
> 這個分類
> Colors of the Wind
> 續星之夢
> 鍵盤攻略
> 如何才能獨立?
> 如何才能獨立生活?
> RealWiki
> 微軟的好事
> 4k 之內
2009-12
> 笑起上黎
> 化妝
> 一個初學PHP 的人
> Dependency
2009-11
> 轉貼:重新理解社区概念——写在PHPWind7.5发布之际(一)
> 預期的天氣
2009-10
> 感動至深的AVG
> 最近tags
> 矛盾
> 日記
> 今日早上突發奇想
2009-09
> 晚上總是善感的
> 上面的歌...
> サクラ大戦 歌謡ショウ 檄!帝国華撃団(改)
> 檄!帝國華擊團
> 雜言
> 一直都好討厭反問句...
> 恒 生 指 數 ETF vs 盈富基金
> 《貝多芬病毒》
> 點解點解!!??
2009-08
> 34%青少年願援交搵快錢
> My Gadgets
> 打打日記吧
> 一時的和長久的
> 編程的原則
> Beethoven Virus
> 常言道, 劉德華
> 糟透的時間
2009-07
> 林燕妮的數學世界續篇
> 名曲
> 凛として咲く花の如く
> 遲了的日記
2009-06
> Key/Visual Art
> 林燕妮的數學世界
> 日記
> 悲慘世界有很多好聽的曲子呢!!
2009-05
> 最近
> 好熱啊
> 最優秀音頻播放器重新評選(本物評論)
> 愚蠢的錯誤
> 突然想到
> 是日感想
> SABER WING
> 我整個都Saber Wing 了!
2009-04
> 無理的收費
> Creative Accounting 的最大啟示
> 回應先前冰漓的回覆
> ジンギスカン [Oriental-clan Beat Mix]
> 最近興趣
> 記事, 滅亡之章
> AKB48 - 大声ダイヤモンド
> 一百萬零一夜-我最喜愛的角色
> Smile DK ~Koko Soko~
> 迷失的預言
> 三位一体
> 會考與pastpaper
> 真日記
> 電車男形像解釋
2009-03
> 小工具, 大作用
> 開發rf 有感
> 封鎖的靈魂
> Planetarian 星之夢
> 滿足與禁止(一)
> 北歐的簡約生活
> 沉淪的心情
> 負面的心情
> 鄭伊健 - 極速
> 重要事項通告
> 日之風願
> 想做的事
> 以有崖隨無崖
> 我真的很不想
> 萬花止嵐
2009-02
> 很快又會到六月...
> 英文版《上海滩》The Beach of ShangHai
> 本物的外觀觀察
> 充實
> msn 名
> 是日成份
> 日記
> 一理通百理明
> 百變香江
> 週記
> DDRX 的新曲
> DjMax BS中尚未ALL Combo 記錄
> 本物
2009-01
> 華麗的遊戲
> 最近的生活
> The meaning of American Pie
> Artweaver
> 一口氣把勝負師傳說睇完啦!!
> 有關'太空戰士'
> 對於Winamp 的感情
2008-12
> 503 啊
> CG . 韓菱紗
> 日常記事
> 惡搞【KUSO斯巴達300丁丁】
> 成吉思汗啊!
> 津 巴 布 韋 發 行 面 值 5 億 鈔 票
> Bemani 音樂
> 電梯(1)
> Rules of Data Normalization
2008-11
> 其中一首一直很喜歡的歌-Get Over
> You touched me, and my soul.
> 想做的難事(1)
> MSN 記事 11月26日
> You can't be my boyfriend
> 不值錢的棋協段位
> Aqua - Tarzan And Jane
> Flea - Clazziquai Project
> 26歲男教師情困跳樓亡 跆拳高手不敵情關 帶醉怨女友冷落
> 新blog
> Abby 也可以是男生名字喔
2008-10
> 談論主題 YouTube - Google Project 10^100 10 to the 100th Reusable Ground
2008-06
> 解決不能在Windows Live Writer中使用 WordPress MU 1.5.1 的 wp_getUserBlogs錯誤
2008-04
> 夜語
> msn 名
2008-03
> 夢一般的播放器
> 演化至中間碼
> msn 名
> 一句話
2008-02
> 昨天和P女仕聊天, 這種感覺久久不能揮去
2007-12
> Wal-Mart Employees Say 'Merry Christmas'
> msn 名/稱
> 一些知識嗎?
> 平平靜靜才不是平平無奇
2007-11
> Microsoft 的新作品嗎?
2007-10
> 又談.NET
> Gundam Battle Chronicle
> Music
2007-09
> 名?
> 鎖與鑰
> MSN 名
> Msn 名
> Msn 名
> 感想
2007-08
> 影響我最大的朋友
> 請到msn space
> MSN
> msn 名
2007-07
> 一期一會
2007-06
>
2007-05
> 演奏
2007-03
> 搬blog
> Sega 腦快感? future plan for 5years
> 日記
> exciting 2005
> flash memory one
2007-02
> lay lies
> ypn
> 打字速度教學
> google adsense
> Life Grade
> 推介的K 歌
> handicap me
> fainted
2007-01
> Wonderful trip
> 日誌
> (默...)
> online game
2006-12
> 充到你死死實
> go arcade center!
> why are u doing this!!!???
> 好亂的
> Abby艾比
> ac 完結
> 日記
> 油浸豆腐花
> 戒毒第一日
> Smile.dk 舊歌
> unlucky days
> 雜感
2006-11
> how much sleeping?
> jupas temporary sequence
> 近排玩咩呢?
> Edward Elric
> 日記...
> 新mouse 入手
> 無比支力的一day
> 唔打咁多要溫書
> 日記...
> I love Groove Coverage
> Trading...Comparative Advantage
> 雜七雜八
> 7 years and 50 days...by one of my pop singers, groove coverage
> 有d 攰la...
> 一個好的powerpoint 要
> DDR supernova
> 話打話打...都今日先打
> marketing presentation
2006-10
> 昨日和今日
> Google 收購youtube 之我見
> 雙測奇謀 - The Two Tests
> 只打短短的
> 呢排都係baf ga la
> 今日係點呢?
> 問卷接龍
> 更新Xanga 吧~
2006-08
> MSN Spaces to Blogger 搬家工具
> Nice Microsoft Virtual Earth
> PHPwind 和Discuz 之戰....重要的轉變
> EVE Online
> .NET 必勝?
2006-06
> discuz.net 留言...別離
2006-03
> 很久沒更新了...
2006-01
> o2jam 過33級
2005-10
> 世紀帝國3
> 有趣redirection
> 分析智者不亂和仁者無懼
2005-09
> IT 其實好折墮
> 給我帶電話的理由!
> 名(純粹無聊搞笑)
> 夢中情人的連鎖
2005-08
> IR PS DW FW 混用
> Windows media player for Mac
> 日記 與 Action 與 Macro
> 普魯斯特問卷
> ORZ 公仔
> 網誌串聯連鎖反應...
> localhost 與127.0.0.1
> 名 O2JAM
> 名 2005 08 15
> 心測結果
> 名 2005 08 13
> 名 2005 08 08
> 名 2005-08-03
> Microsoft 命名法
> 名(2005 08 02)
> 在中三要諗的科
2005-07
> 句(三)
> 漫漫長長的bt 下載:mandriva 6cd
> Mandriva VS Fedora
> 名句改篇(一)
2005-06
> 大家(2)
> 一青窈 - 大家
> 名句(二)
> 小作品一件 - dcd
> 名句(一)
> 在sourceFORGE 的經歷
2005-05
> 挑釁的反應
> 對LOTR 玩一次anti
> MSN Space
> 發夢
2005-04
> 元素系名字
> "珍惜所有"的矛盾性
> 我論習慣
> 興趣範圍: TT
> .NET 的效率
> 編程世界雜談
> Fedora (2)
2005-03
> 絕世閒人
> Fedora (1)
> 高階與低階
> Zaurus 系列
> Linux 雜談
> gsplayer for Midi
> Spaces 留字版
> Defend your Castle
> Space 的前瞻性
> 歡迎光臨
2003-06
> Deciding to build a FTP server of not

抽象滲漏法則

2011-09-02
好物推介

我是在一個月前看到這篇文章的, 在這個期間, 時不時也會回想起這篇文。

在google 上似乎找不到有人轉載過, 就在這先留種吧!

感想, 本來我是想看看抽象化令事情得到自動化實現的支持理據, 可是卻找到一篇持相反意見的文章, 而家十分有說服力。令我一直的想法幾乎有九十度轉變。

在這特意推薦, 抽象滲漏這四個字實在起得太好了, 不過最可惜的是這種解釋世界演化的觀點也是要被迫於使用電腦概念來解說。

抽象滲漏法則

作者:周思博 (Joel Spolsky)
譯:Paul May 梅普華
Monday, November 11, 2002
屬於Joel on Software, http://www.joelonsoftware.com

你每天不可或缺的Internet裡有個關鍵的小魔法,這個魔法就在TCP通訊協定這個internet的基礎協定裡。

TCP是一種可靠的資料傳輸方法。我說可靠是指如果用TCP在網路上傳一個訊息,訊息一定會到,絕不會亂掉或壞掉。

TCP的用途很多,比如抓取網頁資料或傳電子郵件都是。由於TCP這麼可靠,連那些挪用錢的東非人電郵(譯註:指有陣子常見到的騙人信)都能完整無缺的到達,真是好笑。

相對的有另一種叫IP的不可靠資料傳輸方法。IP不保證資料會傳到,就算到了資料也可能會亂掉。如果你用IP傳送一堆訊 息,很可能只有一半的訊息到達,而且其中還有一些到達的順序和原先傳送時的順序不同,另外可能有幾個訊息的內容會變掉,可能變成可愛的猩猩寶貝照片,更可 能變成一堆看不懂的垃圾,看起來就像臺灣垃圾信的標題一樣。

這裡就是魔法所在:TCP是架在IP上面的。換句話說,TCP不得不靠一個不可靠的工具想辦法可靠地傳送資料。

為了說明這的確是個魔法,想想下面這個本質上相同(雖然有點滑稽),來自真實世界的情節。

想像你有個方法把演員由百老匯送到好萊塢,基本上就是讓人坐上車後開車橫越國家送過去。有些車會出車禍讓可憐的演員掛掉。有時候演員在路上 喝醉了就去剃光頭或刺納粹刺青,結果變得太醜而不能在好萊塢工作。另外由於走的路線不同,演員到達的順序常會跟出發的順序不一樣。現在想像有個叫好萊塢快 遞的新服務,可以把演員送到好萊塢,並且保證演員一定會(a)到達,並保證(b)順序不變而且(c)狀態完美地到達。神奇之處在於好萊塢快遞除了原本的車 子以外,並沒有新的運送方法。好萊塢快遞的作法是在每個演員抵達時檢查演員的狀況,如果狀況不佳就打電話請公司把該演員的雙胞胎送來。如果演員到達的順序 不對,好萊塢快遞會照正確順序重新排好。如果51區有架大幽浮在內華達的高速公路上墜毀阻斷了交通,預定走這條路線的演員就會改走亞歷桑那州,好萊塢快遞 甚至不會把事情告訴加州的導演。導演只會覺得演員來得比平常慢,他們甚至不會聽到幽浮失事的消息。

TCP的魔法大致上就是這樣。這種作法常被電腦科學家稱為抽象:把複雜許多的東西隱藏起來的一種簡化動作。結果很多電腦 程式的設計都是在建立抽象機制。字串程式庫是什麼?它是一種偽裝,假裝電腦能像處理數字一樣輕易的處理字串。檔案系統又是什麼?也是一種偽裝,假裝硬碟並 不是一堆不停旋轉,可以儲存位元的磁性碟片,而是一個有著層層目錄的階層式系統,可以存放一個個由一或多個位元組字串構成的檔案。

把話題拉回TCP。稍早為了讓事情單純一點,我撒了一個小謊,而且現在有些人可能會因為這個謊氣得頭上冒煙。我說過TCP保證你的訊息會到達,其實並不會。如果你養的蛇把連接電腦的網路線咬斷了,就沒有任何IP封包可以通過,這時候TCP當然也不可能讓你的訊息抵達。如果你惹毛了公司的系統管理員,他們為了報復就把你接到已經超過負荷的集線器,因此只有部份的IP封包能通過,這時候TCP是會動,不過一切都會變得很慢。

這就是我稱之為抽象機制有漏洞的狀況。TCP試圖提供一個完整的抽象機制,想隱藏底下不可靠的網路,不過有時候網路會滲漏越過抽象機制,這時就會覺得抽象其實並不太能真的提供保護。這只是我所謂「抽象滲漏法則」的一個例子而已:

**所有重大的抽象機制在某種程式上都是有漏洞的。**

抽象會失效。有時候輕微有時候很嚴重,反正就是有漏洞。事情會因而出錯,而且當你有抽象機制時到處都可能會發生。下面有一些例子。

  1. 像掃描一個大的二維陣列這麼簡單的動作,是由水平方向或垂直方向掃描都會嚴重影響效率,影響的大小依「木紋」(譯註:二維陣列排列的方 式)的方向而定,某個方向可能比另一個方向多產生許多的分頁失敗,而分頁失敗是很慢的。雖然寫組合語言的程式師應該可以假設自己擁有可連續定址的記憶體空 間,不過虛擬記憶體表示這種假設只是種抽象機制而已。當出現分頁失敗時或是某些記憶體讀取時漏洞就會出現,處理時間會比其他記憶體慢幾毫微秒。
  2. SQL語言希望把資料庫查詢的程序抽象化,讓你只要定義想要的東西,查詢動作的細節就交由資料庫去處理。不過在某些狀況下,有些SQL 查詢比邏輯上相等的查詢慢上幾千倍。這有個很有名的例子,在某個SQL伺服器用"where a=b and b=c and a=c"來查詢,會比用"where a=b and b=c"快上許多,可是查詢的結果其實是一樣的。照道理只要指定規格,並不需要在意程序。可是有時候抽象機制會失效並導致很差的效率,於是你就得跳出來用 查詢規劃分析器找出問題,然後想辦法加快查詢。.
  3. NFS或SMB之類的網路程式庫,能讓你「像」處理本機檔案一樣地處理遠端機器的檔案。有時候連線速度會變得很慢或是斷線,這時遠端檔案就不再像是在本機上了,而身為程式師的你必須加程式碼來處理這種狀況。「遠端檔案和本地檔案一樣」的抽象機制出現漏洞了。 這裡有個Unix系統管理員的具體例子。如果你把使用者的home目錄放在用NFS掛入的磁碟上(一種抽象機制),而使用者建了一個.forward檔案 把他們的電郵全部轉寄到其他地方(另一種抽象機制),如果新郵件進來時NFS伺服器停掉了,由於找不到.forward檔訊息並不會被轉寄出去。這個抽象 機制的漏洞就真的會把一些訊息丟掉。
  4. C++字串類別應該能讓你假裝字串是個第一級(first-class)資料。它們嘗試把「字串很難處理」這個事實抽象掉,讓它使用上像整數一樣容易。幾乎所有C++字串類別都會多載+運算子,才能把字串連接寫成s + "bar"。不過你知道嗎?不過怎麼努力,世上還是沒有C++字串類別能讓你寫成"foo" + "bar",因為C++裡的字串常數一定是char*,絕對不會變成字串。這個抽象機制呈現一個程式語言本身不給補的漏洞。(有趣的是,C++隨時間演進的歷史,可以描述成嘗試用修補字串抽象機制漏洞的過程。他們為什麼不直接在語言本身加個原生的字串類別?這實在讓我搞不懂。)
  5. 再來就是下雨天時開車沒辦法開得和平常一樣快,雖然車上有擋風玻璃雨刷有頭燈有車頂還有暖氣,這些裝備應該是讓你可以忽略下雨這個事實 (他們把天氣抽象化了),不過看吧,你還是得擔心天雨路滑,有時候雨甚至會大到你看不遠,所以在只好慢慢地開,因為基於抽象滲漏法則,天氣永遠不能完全被 抽象化。

抽象滲漏法則會造成問題的原因之一,是因為它說明了抽象機制並不真能照原構想簡化我們的生活。當我想訓練某人成為C++程式師時,最好能完全不教char*和指標運算,直接去學STL字串。問題是總有一天他們會寫出"foo" + "bar"這 樣的程式然後看到怪事出現,於是我就得停下來教他們有關char*的事情。他們也可能會試著呼叫某個需要OUT LPTSTR參數的Windows API函數,於是又得把char*、指標、Unicode、wchar_t以及TCHAR含入檔搞懂,才會知道如何呼叫。而這些全都是漏洞。

在教COM程式設計時,最好只要教學生如何使用Visual Studio的精靈和各個程式產生功能。不過萬一出了任何問題,他們根本不會知道怎麼回事,也不知道如何除錯或回復。我還是得教他們IUnknown和CLSID還有ProgIDS以及。哦,饒了我吧!

在教ASP.NET程式設計時,最好只要教學生可以在元件上雙擊,然後就能撰寫使用者點擊該元件時在伺服器執行的程式。不過處理超連結(<a>) 點擊事件的HTML程式,和某個按鈕被按時的處理程式是不一樣的,而ASP.NET實際上是把這之間的差異抽象化了。問題來了,ASP.NET的設計者必 須把HTML無法由超連結傳送表格的事實隱藏起來。他們的做法是在超連結的onclick產理加上幾行JavaScript程式。不過這種抽象機制也有漏 洞,如果使用者關閉JavaScript功能,ASP.NET的應用程式就不能正常的運作了,萬一程式師又不瞭解ASP.NET抽象掉什麼東西,根本不可 能知道出了什麼問題。

抽象滲漏法則表示,當某人發明一套神奇的新程式產生工具,可以大幅提升效率等等,就會聽到很多人說:「應該先學會如何手動進行,然後才用這 個神奇的工具來節省時間。」 程式產生工具假裝抽象掉某些東西,和其他所有抽象機制一樣都有漏洞,而唯一能適當處理漏洞的方法,就是弄懂該抽象原理以及所隱藏的東西。所以抽象機制雖然 替我們節省了工作的時間,不過學習的時間是省不掉的。

而這一切都似非而是地表示,即使我們擁有愈來愈高階的程式設計工具,抽象化也做得愈來愈好,要成為一個純熟的程式師卻是愈來愈難了。

我第一次去微軟實習時,寫了一個在麥金塔執行的字串程式庫。那是一個很典型的任務:寫一個自己的strcat函數傳回指向新字串結尾的指標。只要寫幾行C就夠了。我做的每件事都寫在K&R裡面(一本講C程式語言的薄書)。

今天為了要做CityDesk,我必須會Visual Basic、COM、ATL、C++、InnoSetup、Internet Explorer內部機制、正規表示式、DOM、HTML、CSS以及XML。一大堆比古老的K&R更高階的工具,可是我還是得會K&R 講的東西,否則我就完了。

我們十年前可能想像過,現在會有某些全新的程式設計典範讓程式設計更容易。事實上這些年間所建立的抽象機制,的確讓我們 能處理更高複雜度的軟體開發(如GUI程式設計和網路程式設計),這是十或十五年前無法處理的。這些偉大的工具(比如OO型式的程式語言)雖然能讓我們用 飛快的速度完成許多工作,不過總會有一天我們得去追查因抽象滲漏而產生的問題,到時候就得查上兩星期了。另外雖然你得雇一個以寫VB程式為主的程式師,不 過單純的VB程式師是不夠的,因為當VB的抽象機制滲漏時他們就完全卡住了。

抽象滲漏法則正在拖垮我們。

這些網頁的內容為表達個人意見。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.