【專訪】黃健宏:為什麼真正的聰明人喜歡用笨方法?
*黃健宏(huangz),一位1990年出生的計算機技術圖書作譯者,《Redis設計與實現》一書的作者,《Go Web編程》《Redis實戰》一書的譯者。除了已出版的兩本作品之外,他還創作和翻譯了《Go標準庫中文文檔》《Redis命令參考》《SICP解題集》等一系列開源文檔。要了解關於黃健宏的更多信息,請訪問他的個人主頁http://huangz.me。
他是一個極致的完美主義者,為翻譯《Go Web編程》一書,他曾經去過各大GO學習社區,精修專業技術;為了讓譯文更有「中文味」,大多數譯文都已三易其稿,有時候僅僅為了挑選出一個更恰當的詞語或成語,他不得不對著詞典推敲半天。從0到1、從初入茅廬編程小子到暢銷書作譯者,他對寫作、翻譯、閱讀、學習、生活都有著獨到的見解。
互聯網和書本是他獲取知識和信息的兩個主要途徑。在深入地閱讀一本書的時候,通常會花很大的力氣,爭取把書本「吃透」,而做筆記則是把書本「吃透」的其中一種辦法。然而正是這個耗費力氣的「笨辦法」讓他的基本功更加紮實。
非同步社區:可以先介紹一下你自己嗎?
非同步社區的讀者朋友們,大家好,我叫黃健宏(huangz),是一位來自廣東清遠的計算機圖書作者和譯者。我之前分別創作和翻譯過名為《Redis設計與實現》和《Redis實戰》的Redis圖書,我的最新作品是目前正在預售的《Go Web編程》,這是我的第二本譯作,也是我第一次出版Go方面的圖書。
除了正式出版的三本圖書之外,我還翻譯和創作過一些開源文檔,比如《Go標準庫中文文檔》(http://cngolib.com)、《Redis命令參考》(http://redisdoc.com)以及《SICP解題集》(http://sicp.rtfd.org)等。
關於我個人的詳細信息以及相關鏈接可以在我的個人主頁http://huangz.me上找到。
非同步社區:在你的個人筆記中,對每本閱讀的圖書都進行了分類以及寫了詳細讀書筆記?能說說你的做讀書筆記的心得嗎?
互聯網和書本是我獲取知識和信息的兩個主要途徑。我在深入地閱讀一本書的時候,通常會花很大的力氣,爭取把書本「吃透」,而做筆記則是把書本「吃透」的其中一種辦法。
以下是一些我在讀書的時候經常會做的事情:
- 通過畫線、畫圈、添加註釋等方式,用筆在書上標記出重點的字句、段落;
- 把書中介紹的重點知識摘錄到個人筆記網站或者博客上面,以此來加強自己的記憶,也方便以後有用時進行檢索;
- 通過實踐驗證書中的知識,以此來將書中介紹的知識轉化為個人的能力和經驗;
- 寫讀後感,跟其他讀者分享、交流自己的收穫和心得。
關於如何讀書的問題,《如何閱讀一本書》這本書裡面有很好的介紹,裡面教授的讀書方法都是非常有用和實用的。
非同步社區:作為一個高內容輸出者,你的典型的一天是如何度過的?你是如何保持高效率的?
我的基本作息時間跟大家一樣,都是日出而作、日落而息。
在工作方面,我使用一種簡單的TODO方法去驅動自己的工作:我會把所有待完成的任務都寫在一張A4紙上面,然後每完成一項任務就在紙上把已完成的任務劃掉,然後繼續進行下一項任務,如此往複直到所有工作都完成為止。
在生活方面,我在工作之餘會看一些電影、動漫、遊戲直播來放鬆自己,為了避免自己只讀計算機方面的書籍,我也會有意識地看一些小說和跟計算機無關的書本。在結束一天的工作之後,我會在家附近的公園裡散步或騎行,以此來鍛煉身體。
我在工作時不會特意去追求效率,更多的是想辦法去點燃和保持自己的熱情:當我對一項任務非常有熱情的時候,完成該任務的效率通常就會很高,而產出的內容質量也會有保證。舉個例子,在開始一天的工作時,我通常會想「今天就讓我來寫出漂亮的一章吧」,而不是想「今天至少要完成書本的這一章才行」,這兩者之間的區別是非常大的。
實際上,我的工作效率在很多人看來是非常低的:《Redis設計與實現》寫了一年半,《Redis實戰》翻譯了一年半,《Go Web編程》也翻譯了一年,而現在正在寫的《Redis使用教程》則已經寫了兩年多了。在很多人看來,以年為時間單位完成一本計算機圖書可能是一種天荒夜談,但為了保證書本的質量,有時候大量的時間投入是必需的。
非同步社區:豆瓣中看到你分享了很多的書?你平時都選擇哪些書閱讀呢?有什麼選書的經驗可以分享嗎?
我在剛開始學習編程的時候,閱讀的都是一些經典的計算機基礎書籍,而之後閱讀的則是介紹某種特定技術的書籍,比如學Ruby的時候就找一本Ruby書來看,學MySQL的時候就找一本MySQL書來看,諸如此類。
最近這幾年開始寫作和翻譯之後,我就比較少像以前那樣完整、深入地去閱讀一本書了,通常都是快速地瀏覽書中一兩個自己想要了解的章節就算了,現在更多的是在網上查資料以及閱讀軟體的官方文檔。
關於如何選書是一個非常大的問題,認真要說的話也許可以說上一整天。簡單來說,我建議大家理性消費,只買自己要讀的書,而不是在書店搞促銷優惠的時候買一大堆自己不會讀的書,這樣做是無益反有害的;另外要注意的一點是,盡量不要在讀書之前讀書評或者讀書筆記,以免對書本產生先入為主的看法,影響自己的思考和判斷。
非同步社區:大家知道你最早是在 2011 年開始接觸 Redis,一直在學習和研究 Redis ,並會分享自己的學習心得,寫一本書和寫技術博客相比,有哪些不一樣的地方呢?
寫博客和寫書的主要區別在於幾個方面。
首先,從嚴謹程度來說,我在寫博客的時候,記錄的通常都是一些剛開始接觸到的知識,這些內容可能只是為了加強自己的記憶,又或者以拋磚引肉的方式吸引其他同好來進行交流,而博客的內容本身可能並不成熟和不嚴謹,又或者有這樣那樣或嚴重或輕微的錯誤;但是在寫書的時候,我會通過測試程序或者閱讀源碼來對寫下的每個知識點進行驗證,從而儘可能地確保書本上不會出現有錯的內容。
其次,在組織方式上面:博客的文章通常都是自成一格的,一篇文章可能跟另一篇文章沒有什麼關係,又或者介紹的是兩種完全不同的知識;但是在寫書的時候,章節之間的內容通常是互相關聯的,一章中的各個節則為不同的知識點服務。
最後,從內容上來看,書本的內容通常都會比一般的博客文章更豐富和詳盡,這是博客無法與書本比擬的地方。
非同步社區:你在學習redis時,如果碰到自己解決不了的問題,怎麼辦呢?
如果在學習過程中碰到問題,我通常會使用以下方法來嘗試解決:
- 通過搜索引擎進行搜索;
- 閱讀官方網站、文檔和博客;
- 查看源碼;
- 在微博或者問答網站上發問;
- 求助朋友和同行。
目前來說,我在學習Redis的過程中還沒有遇到過解決不了的問題。
以我的個人經驗來看,對於Redis這樣的開源軟體,絕大多數問題只要通過上面提到的方法1 ~ 3就能解決了。
非同步社區:你曾說在自己的群內禁止傳播盜版資源的,作為版權保護的倡導者,能談談初衷嗎?
對於所有創作者來說,盜版都是一個無法避免的現實話題。盜版會導致創作者的收入減少,而如果創作者付出的努力沒有得到適當的回報,那麼他們就無法繼續進行創作,最後只能黯然離開,這種結果實際上對於所有人來說都是一種損失。舉個例子,如果一個音樂人因為無法得到足夠的報酬而離開,那麼他的樂迷將無法再聽到他創作的歌;而如果一個圖書作者因為無法得到足夠的報酬而放棄寫作,那麼同樣地,他的所有讀者將無法再看到他的新作品。
因為我自己的圖書也曾經遇到過幾次較為嚴重的盜版事件,有些至今還沒有得到妥善的解決,所以我在創建自己的聊天群時,就定下了不能傳播盜版的規矩,其中禁止的不僅僅是不能盜版我的書,而是不能傳播任何盜版資源。定下這條規則的初衷很簡單,那就是,雖然自己管不了——也不可能管得了——整個網路,但至少在我自己的小小空間里,我希望大家能夠拒絕盜版,不要傷害那些花了很多時間辛苦地為我們貢獻出作品的創作者。
非同步社區:平時關注哪些技術論壇或博客?
我比較少關注特定的論壇和博客,更多是根據正在研究的技術去閱讀相應的網站:當我在學習Go的時候,我就會到Go的相關網站上去看看;當我在學習Redis的時候,我就會到一些介紹Redis的網站上去逛逛,諸如此類。
在開始進行寫作和翻譯之後,我便開始有意識地不再去瀏覽一些跟手頭上的問題沒有直接關聯的網站,因為我希望自己腦子裡面記憶的都是當前正在研究的問題的相關細節,而不是流行明星的花邊新聞,又或者一些我永遠都不會用到的知識,我相信只有這樣,自己才能創作出真正對這個社會有價值的作品。
非同步社區:《Go Web編程》這本書的翻譯花費了多長時間?期間碰到什麼困難嗎?
我從2016年8月開始進行《Go Web編程》的翻譯工作,到2017年8月提交初稿,中間跨越了整整一年的時間。
完成這次翻譯工作的其中一個主要困難,就是要克服自己對Go的不熟悉——正如我前面在自我介紹時所說的那樣,在翻譯《Go Web編程》之前,我主要進行的是Redis相關的工作,當我剛開始進行《Go Web編程》的翻譯時,我對Go這門語言只能說是了解,但是離熟悉還有很遠的距離,特別地,因為《Go Web編程》書中包含大量對標準Go庫的使用和介紹,如果對標準Go庫不夠熟悉,只是單純地按照書中的文字進行翻譯,那麼出現翻譯事故是可以預見的。
為了解決這個問題,加深對標準Go庫的認識,我將書中用到的標準Go庫的文檔都仔細地閱讀了一遍,並按需閱讀了某些庫的源代碼,甚至還親自把其中一些庫的文檔翻譯成中文放到了《Go標準庫中文文檔》上面。完成上述工作雖然花費了額外的時間,但經此一役,我對Go語言特別是標準Go庫的了解上了一個新的台階,在翻譯書中的內容時,我不僅能根據文字進行翻譯,還能夠從技術上的角度來審視書中的內容,從而發現其中的優點、不足以及錯誤。具體來說,在翻譯《Go Web編程》的過程中,我對書本的不少內容做了微調,讓它們閱讀起來更加流暢和易懂,並且還修正了書中大大小小尚未公開的數十個bug——如果我沒有深入地研究標準Go庫,那麼我想自己是不可能發現這些錯誤的。
另外一件讓我印象深刻的事情是在書本審較過程中發生的,當時我和楊海玲編輯在一個問題上出現了不同的意見,我堅持自己的方案A,而楊編輯則堅持自己的方案B,為此我們進行了好幾次溝通,但雙方都沒有辦法讓對方完全信服,當時急性子的我差點就要和編輯鬧矛盾,但幸好我最後還是沒有那麼做。後來我冷靜下來重新審視這個問題的時候,發現的確是楊編輯的方案B更好,我很慶幸自己當時沒有在這個問題上和編輯鬧翻,經過這件事,我也懂得了在跟人合作的時候應該放下自己頑固的自尊心,以開放的態度去聆聽協作者的意見,我想只有這樣,才能從協作者身上受益,才能大家齊心協力把一件事做好。
非同步社區:《Go Web編程》是你的第二部譯作,在翻譯第一部譯作《Redis實戰》的時候,你曾說因為受經驗、知識以及時間等條件限制,只能把時間盡量花在保證譯文的準確性上,這次的翻譯過程中有什麼變化?
翻譯跟其他很多工作一樣,都是以知識為理論基礎,經驗為實踐指導的一門手藝,即使是同一個譯者,隨著他擁有的知識和經驗的變化,他產出的作品也會有非常大的變化。
具體來說,在翻譯《Redis實戰》的時候,我只有翻譯軟體文檔和博客的經驗,完整地翻譯整本書的經歷還是一片空白,所以之後回過頭去審視這個譯本的時候,就會覺得當時有很多地方是可以做得更好的。因為在翻譯完《Redis實戰》之後,我又學習了一些新的翻譯知識,並且也通過實踐積累了更多翻譯經驗,所以當我接到《Go Web編程》的翻譯委託時,我便決心將自己自《Redis實戰》以來學到的新知識和新經驗應用到這本新書當中,從最終的成品來看,我對《Go Web編程》這本作品還是非常滿意的。
因為時間、報酬和譯者質素等種種問題,中文技術圖書的翻譯質量一貫是為大家詬病和懷疑的,但無論是之前的《Redis實戰》,還是現在的《Go Web編程》,我都花費了非常多的時間和精力在上面,我相信讀者在閱讀這兩本書的時候,是可以切實地感受到它們跟一般譯作之間的不同之處的。
關於《Go Web編程》的翻譯過程和思考,我在書本的《譯者記事》一文中也有敘述,大家如果對這個主題有興趣的話也可以去讀一讀這篇文章:http://www.epubit.com.cn/book/onlinechapter/60300
非同步社區:你理想中的工作是什麼樣的?
關於「什麼是理想的工作」,我想每個人都會有不同的答案,但這個答案無疑跟每個人自身的性格是息息相關的。對於我這個離群索居、不愛交際、討厭循規蹈矩並且懶惰的人來說,像寫作和翻譯這樣的工作無疑就是我理想的工作——對於現在的我來說,之後要做的就是繼續努力,創作出更多能夠讓大家喜愛的作品就可以了。
試讀本書:《Go Web編程》
推薦閱讀:
※函數式編程的函數是如何實現的?
※為什麼C++中會把文件操作抽象為fstream?
※怎樣理解Haskell中的High Order Function?