北京物流信息联盟

《Go Web编程》译者黄健宏:为什么真正的聪明人喜欢用笨方法?

2022-04-09 11:43:59

点击标题下「异步图书」可快速关注 


他是一个极致的完美主义者,为翻译《Go Web编程》一书,他曾经去过各大GO学习社区,精修专业技术;为了让译文更有“中文味”,大多数译文都已三易其稿,有时候仅仅为了挑选出一个更恰当的词语或成语,他不得不对着词典推敲半天。从0到1、从初入茅庐编程小子到畅销书作译者,他对写作、翻译、阅读、学习、生活都有着独到的见解。

互联网和书本是他获取知识和信息的两个主要途径。在深入地阅读一本书的时候,通常会花很大的力气,争取把书本“吃透”,而做笔记则是把书本“吃透”的其中一种办法。然而正是这个耗费力气的“笨办法”让他的基本功更加扎实。

异步社区:可以先介绍一下你自己吗?

异步社区的读者朋友们,大家好,我叫黄健宏(huangz),是一位来自广东清远的计算机图书作者和译者。我之前分别创作和翻译过名为《Redis设计与实现》和《Redis实战》的Redis图书,我的最新作品是目前正在预售的《Go Web编程》,这是我的第二本译作,也是我第一次出版Go方面的图书。

除了正式出版的三本图书之外,我还翻译和创作过一些开源文档,比如《Go标准库中文文档》(cngolib.com)、《Redis命令参考》(redisdoc.com)以及《SICP解题集》(sicp.rtfd.org)等。

关于我个人的详细信息以及相关链接可以在我的个人主页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编程》

无论是经验老到的gopher,还是刚开始接触Go语言的Web开发者,这都是必不可少的一本书,本书囊括了关于Go Web应用的开发和部署的全部知识 

本书目录:(滑动手机查看)

第一部分 Go与Web应用 
第1章 Go与Web应用  3 
1.1 使用Go语言构建Web应用  3 
1.1.1 Go与可扩展Web应用  4 
1.1.2 Go与模块化Web应用  4 
1.1.3 Go与可维护的Web应用  5 
1.1.4 Go与高性能Web应用  5 
1.2 Web应用的工作原理  6 
1.3 HTTP简介  7 
1.4 Web应用的诞生  8 
1.5 HTTP请求  9 
1.5.1 请求方法  10 
1.5.2 安全的请求方法  11 
1.5.3 幂等的请求方法  11 
1.5.4 浏览器对请求方法的支持  11 
1.5.5 请求首部  12 
1.6 HTTP响应  13 
1.6.1 响应状态码  13 
1.6.2 响应首部  14 
1.7 URI  15 
1.8 HTTP/2简介  16 
1.9 Web应用的各个组成部分  16 
1.9.1 处理器  17 
1.9.2 模板引擎  18 
1.10 Hello Go  18 
1.11  小结  21 

第2章  ChitChat论坛  23 
2.1 ChitChat简介  23 
2.2 应用设计  24 
2.3 数据模型  26 
2.4 请求的接收与处理  27 
2.4.1 多路复用器  27 
2.4.2 服务静态文件  29 
2.4.3 创建处理器函数  29 
2.4.4 使用cookie进行访问控制  30 
2.5 使用模板生成HTML响应  33 
2.6 安装PostgreSQL  38 
2.6.1 在Linux或FreeBSD系统上安装  38 
2.6.2 在Mac OS X系统上安装  39 
2.6.3 在Windows系统上安装  39 
2.7 连接数据库  39 
2.8 启动服务器  44 
2.9 Web应用运作流程回顾  45 
2.10 小结  46 

第二部分 Web应用的基本组成部分 
第3章  接收请求  49 
3.1 Go的net/http标准库  49 
3.2 使用Go构建服务器  51 
3.2.1 Go Web服务器  51 
3.2.2 通过HTTPS提供服务  53 
3.3 处理器和处理器函数  56 
3.3.1 处理请求  56 
3.3.2 使用多个处理器  58 
3.3.3 处理器函数  59 
3.3.4 串联多个处理器和处理器函数  61 
3.3.5 ServeMux和DefaultServeMux  65 
3.3.6 使用其他多路复用器  66 
3.4 使用HTTP/2  68 
3.5 小结  70 

第4章  处理请求  72 
4.1 请求和响应  72 
4.1.1 Request结构  73 
4.1.2 请求URL  73 
4.1.3 请求首部  74 
4.1.4 请求主体  76 
4.2 Go与HTML表单  77 
4.2.1 Form字段  79 
4.2.2 PostForm字段  80 
4.2.3 MultipartForm字段  81 
4.2.4 文件  83 
4.2.5 处理带有JSON主体的POST请求  85 
4.3 ResponseWriter  86 
4.4 cookie  91 
4.4.1 Go与cookie 91 
4.4.2 将cookie发送至浏览器  92 
4.4.3 从浏览器里面获取cookie  94 
4.4.4 使用cookie实现闪现消息  96 
4.5 小结  99 

第5章  内容展示  100 
5.1 模板引擎  100 
5.2 Go的模板引擎  102 
5.2.1 对模板进行语法分析  104 
5.2.2 执行模板  105 
5.3 动作  106 
5.3.1 条件动作  106 
5.3.2 迭代动作  108 
5.3.3 设置动作  109 
5.3.4 包含动作  111 
5.4 参数、变量和管道  113 
5.5  函数  114 
5.6 上下文感知  116 
5.6.1 防御XSS攻击  119 
5.6.2 不对HTML进行转义  121 
5.7 嵌套模板  122 
5.8 通过块动作定义默认模板  126 
5.9 小结  127 

第6章  存储数据  128 
6.1 内存存储  128 
6.2 文件存储  131 
6.2.1 读取和写入CSV文件  133 
6.2.2 gob包  135 
6.3 Go与SQL  137 
6.3.1 设置数据库  138 
6.3.2 连接数据库  140 
6.3.3 创建帖子  142 
6.3.4 获取帖子  144 
6.3.5 更新帖子  145 
6.3.6 删除帖子  145 
6.3.7 一次获取多篇帖子  146 
6.4 Go与SQL的关系  147 
6.4.1 设置数据库  147 
6.4.2 一对多关系  150 
6.5 Go与关系映射器  152 
6.5.1 Sqlx  152 
6.5.2 Gorm  154 
6.6 小结  157 

第三部分 实战演练 
第7章  Go Web服务  161 
7.1 Web服务简介  161 
7.2 基于SOAP的Web服务简介  163 
7.3 基于REST的Web服务简介  166 
7.3.1 将动作转换为资源  168 
7.3.2 将动作转换为资源的属性  169 
7.4 通过Go分析和创建XML  169 
7.4.1 分析XML  169 
7.4.2 创建XML  177 
7.5 通过Go分析和创建JSON  180 
7.5.1 分析JSON  181 
7.5.2 创建JSON  184 
7.6 创建Go Web服务  187 
7.7 小结  194 

第8章  应用测试  196 
8.1 Go与测试  196 
8.2 使用Go进行单元测试  197 
8.2.1 跳过测试用例  201 
8.2.2 以并行方式运行测试  202 
8.2.3 基准测试  203 
8.3 使用Go进行HTTP测试  206 
8.4 测试替身以及依赖注入  210 
8.5 第三方Go测试库  217 
8.5.1 Gocheck测试包简介  217 
8.5.2 Ginkgo测试框架简介  223 
8.6 小结  228 

第9章  发挥Go的并发优势  230 
9.1 并发与并行的区别  230 
9.2 goroutine  232 
9.2.1 使用goroutine  232 
9.2.2 goroutine与性能  235 
9.2.3 等待goroutine  238 
9.3 通道  239 
9.3.1 通过通道实现同步  240 
9.3.2 通过通道实现消息传递  242 
9.3.3 有缓冲通道  243 
9.3.4 从多个通道中选择  244 
9.4 在Web应用中使用并发  247 
9.4.1 创建马赛克图片  248 
9.4.2 马赛克图片Web应用  251 
9.4.3 并发版马赛克图片生成Web应用  254 
9.5 小结  262 

第10章  Go的部署  263 
10.1 将应用部署到独立的 服务器  264 
10.2 将应用部署到 Heroku  270 
10.3 将应用部署到Google App Engine  273 
10.4 将应用部署到 Docker  278 
10.4.1 什么是Docker  278 
10.4.2 安装Docker  279 
10.4.3 Docker的理念与 组件  280 
10.4.4 Docker化一个Go Web 应用  281 
10.4.5 将Docker容器推送至 互联网  283 
10.5 部署方法之间的 对比  286 
10.6 小结  287 
附录  安装和设置Go  288 


延伸推荐

11月新书人气王票选

一文读懂Go的net/http标准库

京东质量测试技术论坛:大咖云集,异步免费报名中!

你所不了解的深度神经网络

《Go Web编程》这一本不可错过!

2017优秀图书和作译者评选-进行中赢取kindle等技术图书礼!

AI经典书单| 入门人工智能该读哪些书?

聊聊Python

你所不了解的Kafka

Kotlin最佳项目实战——欧瑞天气App


点击关键词阅读更多新书:

Python|机器学习|Kotlin|Java|移动开发|机器人|有奖活动|Web前端|书单

点击图片参与活动

异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!


扫一扫上方二维码,回复“关注”参与活动!

点击阅读原文,购买《Go Web编程》

友情链接

Copyright © 2023 All Rights Reserved 版权所有 北京物流信息联盟