一个疑问

深涩

通过上一篇 《写一个 DNS 服务器》内的源码,拼凑出一个 simple_dns_server.py,或者直接通过 LearnPython.app 内获得原始代码,总而言之,此时的你,应该完成了一个 DNS 服务器
一个我们在互联网时代无法离开的,关注度却又是很低的产品,我们作为一个初学者,完成了雏形。而且,从代码上看,并不深涩。

『看起来并不深涩』,不算容易的事。
虽然我们会说 Python 是 English-like 的编程语言,它接近自然语法。但是一个工具在不同人的手中,呈现出来的姿态也是不一样的。特别在一些涉及底层的协议时,如果有没有现成的 module 把中间环节隐藏了,代码很容易会变得晦涩。
对初学者而言,总有东拼西凑的时候,这很正常,只是这种拼凑的能力未经锤炼,实际代码往往看起来也会比较乱。
开始的时候,『乱』没有关系,能运行就好。
简而言之,『并不深涩』,不容易的,特别对于初学者来说。

一个疑问

《写一个 DNS 服务器》中,一些写法、函数的调用方式是特定的,完全意义上的特定,跟 Python 甚至都没有什么直接关系。因为面向的是 DNS 协议,这个我们甚少会接触到,里面一些具体的参数,到底有什么作用,这跟 Python 确实没有关系,只跟 DNS 协议本身有关系。
所以,这个过程中,肯定会产生一个疑问: 为什么代码要这么写?!

重新梳理下,我自己当年为什么要去写一个 DNS 服务器?
为了技术入门?不是,那时已经入门太久了。
为了好奇?也不是,好奇的东西很多,更没有这么多时间浪费在 DNS 上面。
因为闲?这个倒是一个好的因由,可惜,现在也还没有达到这个状态。
真正的原因很简单: 为了用户体验
如果我们自己控制了 DNS 服务器,那么用户只需要将 DNS 服务器设定成我们的就可以,就不需要配置其它记录了。而且还可以有其它特性的对应,比如多节点的自动切换、负载均衡等。

产生了目标,就一定会出现结果。
如果, 入门 有考核标准的话,上面这句话就是一个很好的标准。
我会使用 Python 去完成某个灵感,Python 就像是一种胶水。这个过程中,先寻找的是原材料,可能是别人已有的方案、第三方 package、甚至某个代码片段。灵感 对应的,很可能是全新的领域,或者是一个并不常见的领域,那么这些原材料可以让我们更快地理解实现最终产品的粗略路线。如果路线勾勒的结果是倾向于否定的,那么,也可以考虑放弃这个灵感。
遇到了难以解决的问题,绕过去,绕过去。不要制定自己真的无法完成的目标,勇而不智,不好。
然后是 实施 的过程,也同样,你想做的事情,只是需要时间,就能产出结果。犹如 Python 中我们讲过的 自省机制,你也一定会建立这种自省机制,知道什么能完成,什么不能完成,并且在这个基础上,最终完成。

所以,这个疑问还存在吗?

方才,有些务虚,我们接下来务实地谈一谈:

  1. 先在 Google、Github 上找别人写 DNS 服务器的项目、经验,最好是 Python 的,而且不能是过于复杂的。
  2. 找 Python 生态中有没有现成的 DNS 相关的 package
  3. 这些 package 本身会有帮助文档,会告诉你怎么使用
  4. 在写的过程中,从 package 的帮助文档开始,先完成最简单的原型
  5. 在写得过程中,如果有些问题,可以跳到 package 的源码看看
  6. 保持思考,有不明白的地方,去找找原始的 DNS 协议的内容,但只看自己想了解的某个局部

大抵是如此的过程,到最后,完成了就可以了。
可能过很长时间后,待你再从头去看这些代码,里面涉及到的基本协议,也会忘记得精光,没有关系,it works 更重要。另外一方面,让代码看起来容易理解些,也很重要,不至于回头看时感叹 『写的什么东西呀』。

DNS 相关的,确实比较少见。
我们之前介绍 Awesome Python 时,还『嫌』它太繁多了,但即使如此繁多,也找不到 DNS 相关的。
寻找 并不是一个问题,找到一个小小的线索,不要气馁,再挖下去,就能找到自己想要的了。
在这个过程中,你的疑问也会消失,不会想着 『为什么代码要这么写』,不过是知道了基础的用法,然后不断尝试、出错、修正、学习、it works,以及 遗忘 ……
好在代码语言,可以帮我们把思考的过程沉淀下来,并不断实现复用。