如何仅使用电话传输代码

2018-05-16  本文已影响46人  寒食君
image

我的朋友月半,在电话面试一个后端实习岗时被问到了这样一个技术/非技术问题:

假如两个人之间没有任何其他的联系方式(微信/QQ/共享文档等),只能通过电话,A如何将代码展示给B?

这个问题很有意思,当时我和他的第一反应都以为面试官在问关于Github相关。后来面试官解释了一下,将其也排除在外,条件是只能通过电话这个媒介。由于姿势水平有限和思维不够活跃,这个问题陷入了尴尬。


image

电面结束后,我和他也一直在想这个问题,似乎始终都没有一个令自己满意的答案。后来他将这个问题发到了V2EX上,昨天我在浏览这个站点时,发现这个问题竟然上了热门,里面的想法也是千奇百怪,各有千秋,其中有几个我觉得很有价值,所以特地写一篇文章来分享一下。

image

回复大致分为四类。

第一类是吐槽流,觉得这个问题没有答案,纯属面试官在刁难,需要提高面试水平云云。

第二类依然在寻求通过中间平台来传达,虽然也有道理,但是和题目的本意相去甚远。

第三类认为这是个非技术问题,主要在于考察语言表述能力和表达逻辑,以及面对未知问题时的思维。我觉得这还是颇有几分道理的。

第四类我认为是最核心的,回答者关注的是问题本身,其中几个解决思路很巧妙,以下也重点谈谈这一类。

1. 通过测试用例的方式来间接呈现代码

大家都知道,一些OJ(online judge)系统来判断代码的方式就是通过多组测试用例来进行计算结果和运算时间,以此判断代码的正确性。面试官想要“看见”你的代码,或许他关注的只是代码的正确性而不是你具体是如何实现,如果是出于这个目的的考察,那大可让面试官口头报几组测试数据,然后我再将运行结果和运行时间反馈过去,这整个过程,确实只用到电话来交流,符合题意。

但是这种方式只局限于算法,若是考察工程方面的代码,或者面试官的目的就是考察你的代码本身逻辑是否合理,命名是否规范,手法是否优雅等等,那么这种方法就失效了。

虽然这种方法只能解决一小部分问题,但我觉得这是一种很好的思路。

2. 将拨号音的模拟信号进行取样、量化、编码转换为数字信号,数字信号进入交换网络进行交换,最后又转回模拟信号送到电话那一头。

这种方式比较硬核,对一个初级软件开发者来说比较有难度,我也是查了一些资料,可能表达的还是有问题,欢迎指正。使用声波来传输数据已经是一种较常见的技术,2012年已经实现了手机之间通过话筒和喇叭传输文件,近年的支付宝“咻咻咻”支付也是这种技术的一种表现方式。

3. 将代码转化为ASCii码,通过电话拨号音传输,因为每个拨号音的频率不同,选取两个代表0和1,对方在另一端将整个过程录制下来,再根据频率不同区分出01,最后转换成代码。

这个方式我觉得本质和在电话中读代码,对方听着记下来是一样的。语言本身是一种复杂的编码方式,两个人充当了“编码器”和“解码器”的角色。

这个方式下,110已经不是110了(皮


image

当然,有人要说,这不是瞎胡闹吗,浪费时间。这里只是就题目本身而言,拓展一下思路,并不一定需要实际操作。

基本上以上三种是我觉得比较好的解决思路,假如你有好的想法,可以留言讨论交流。


image

下面是我读到的一篇文章《芬兰电台节目造就 Geek 人群》,一则使用收音机来传输代码的趣闻,文末一句话我非常感慨。

“我们的目标不是教人们如何编程,而是传播关于计算机的理解,以及让许多对计算机心怀恐惧的人放下戒心。我们努力展示计算机是有趣的。”

世界复杂且美,需要我们不断去探索体味。


《芬兰电台节目造就 Geek 人群》

有人说芬兰是 Geek 的国度。“Linux 之父” Linus Torvalds 是芬兰人,在赫尔辛基大学读书期间开发了最初的 Linux 内核;网络安全传输协议“SSH”的发明者 Tatu Ylönen 是芬兰人,毕业于赫尔辛基理工大学;“IRC 之父”Jarkko Oikarinen 也是芬兰人。

把时间刻度拉到最近几年,来自芬兰的游戏厂商 Rovio 是一家让人惊奇的公司,他们开发出的《愤怒的小鸟》风靡全世界,让模拟物理类型的游戏变得流行,形成了一种 cult 文化,有的人甚至会孜孜不倦,算出小鸟飞行轨迹背后的物理公式,连英国首相卡梅伦也是其忠实玩家。

芬兰,一个人口不如一个北京市的国家,Geek 文化却如此深厚。也许“好奇”与“探索”这两个因子已经深深根植于这个民族的基因里面。

根据 Ars Technica 的报道,上世纪 80 年代,芬兰广播公司(YLE)的教育家 Kai R. Lehtonen 为了让自己制作的关于电脑教学的广播节目更富有趣味性,开始了一场实验。

当时个人计算机仍属奢侈品,网络处于蒙昧期,Lehtonen 打算利用收音机和无线电,将一段又一段的代码传播到不同的电脑中。通过这种方式,听众可以将自己的代码贡献给节目组,然后广播给其他听众,获得反馈。这能激发听众参与的兴趣。

多亏当初荷兰人发现一种利用盒式磁带传递资料的方法,Lehtonen 增加用户粘性的手段才变得有效——荷兰人将电脑上的 BASIC 代码储存到普通的盒式磁带中,然后将这盒磁带放进录音机播放,其他人可以将声音录进另外一盒磁带中,然后将磁带放进另外一台录音机中与电脑连接起来,通过解码器,电脑就能够得到原来 BASIC 代码。

通过这个方法,电脑与电脑之间传输数据的问题就得以解决。当时电脑尚未普及,但收音机成为家庭里的标配。在经过几次尝试之后,Lehtonen 和他的团队决定正式在广播节目中播出 BASIC 代码。在芬兰广播公司的 Radio Rex 节目中,他们播放了时长 33 秒的“谜之声”,然后紧张的询问听众,到底是否得到了正确的代码。

代码是正确的。回想起当时的情景,至今 Lehtonen 还是感到激动不已。“布丁好坏,一吃便知。至于我们,代码部分没有做任何特别的改动。它只不过是一段类似于演讲或是音乐的声音……结果符合期望,我们从芬兰各地受到大量正面的反馈,最远的来自 Keminmaa,赫尔辛基往北差不多 600 千米的地方。”

后来 Lehtonen 决定提高难度,比如在接受观众的代码时,特意设置一个程序,将类似“2 月 30”之类的输入都挡在门外。但这不妨碍听众的热情,很快他们开始自己编写代码。当时大学刚毕业的 Eero Tunkelo 拥有 Commodore VIC-20,他曾经为节目贡献了一段为自己姐姐所写的代码。由于节目人气逐渐升高,Lehtonen 决定将节目变为每两周播放一次的节目“Silikoni”。回忆当年对这个节目的痴迷,Tunkelo 说,“我开始觉得自己从属于某种事物的一部分。”

Silikoni 每周一傍晚 6 点 30 分准时开播。它成为芬兰 Geek 文化的温床,上面不但分享来自听众所设计的代码,还对一些严肃的话题展开讨论,比如说“谁知道最棒的有关电脑的笑话?”,或者“如何管理一个计算机夏令营?”,或者“第一次购买电脑要考虑的问题”,或者“如何通过电脑来运营一所学校”等等。

Silikoni 非常受欢迎,一期可以吸引听众 12000 人,相比芬兰 500 万的人口,这个听众数量相当可观。一个 70 岁的老奶奶甚至写信给节目组,称她仅仅是喜欢听到不同电脑所制造出来的声音。可惜,在芬兰广播公司人员改组,变更公司战略目标之后,节目也就无疾而终了。

不过,对于 Lehtonen 而言,他的目的已经达到:

我们的目标不是教人们如何编程,而是传播关于计算机的理解,以及让许多对计算机心怀恐惧的人放下戒心。我们努力展示计算机是有趣的。

image
上一篇下一篇

猜你喜欢

热点阅读