资讯专栏INFORMATION COLUMN

为什么离不开 Stackoverflow

peixn / 2142人阅读

摘要:接下来手工实现了一个简单的装饰器原型,紧接着引入中的装饰器语法。最后还列出了一些装饰器的高级用法,包括给装饰器传递参数等。读完整个答案,一定能对装饰器有较深的理解,并且知道理解装饰器的思考过程。

作为一名程序员,如果没有听过 Stackoverflow,那么你最好去面壁思过一下。程序员最需要阅读的一本编程书籍(其实编程书留下这本就够了!):

那些还没有读过这本书的程序员,是时候买一本了。如果还在犹豫,那么先看下这篇文章,看看为什么离不开 stackoverflow。

提问的智慧

当你拋出一个技术问题时,最终是否能得到有用的回答,往往取决于你所提问和追问的方式。 --Eric S. Raymond

有时候,清晰描述一个问题,特别是技术问题没有想象的那么简单。提问从来就是一门学问,可惜很多人没有意识到这一点,或者没有给予足够的重视。或者,有的提问者根本不是抱着提问的态度来请求大家的帮助。所以我们会发现各种让人无法解答或者无心解答的问题:

java正则表达式问题?

sla响应时间是指什么?

ATL类与一般的类继承有什么区别

为了避免上面的问题被关闭或者修改,放一张图片在这里,来体会下这种狗屎问题:

去 segmentfault 的未回答题目中随便就能找到一堆这样的问题,所以很多人显然并没有提问的智慧或者没有很好的态度。Raymond 和 Rick Moen 写了一份经典的文章 How To Ask Questions The Smart Way专门来描述如何提问,这篇文章被翻译成各国文字,留传很广,可以在这里找到中文版。Stackoverflow 和 Segmentfalut 也给出了关于提问的建议:

Help Center > Asking

How to Ask

How do I ask a good question?

什么样的问题才是受欢迎的

在 Stackoverflow 可以看到太多经典的问题,我们可以从这些问题中学习如何去提问,如何和答题者沟通。当你看习惯了stackoverflow 上面的问题,提问时就会不自觉去模仿,从而避免问出无脑问题。下面是提问时最需要注意的几个问题:

问搜索引擎没有满意答案(google 起码过四页)的问题

问那些自己无法独立解决,已经做过很多尝试的问题

尽量清楚地描述问题:良好的排版,代码,错误提示,图片等

让你的问题对别人有帮助

问题要有确定的答案,不要有太多的主观性

不同的方案

很多时候我们希望能够找到一个解决办法,但是在 stackoverflow 上,经常会有意外的收获。你可能会看到对一个问题不同的解决方案,甚至包括对这些解决方案的比较。

假设现在你想知道 python 中如何调用外部命令,比如 ls -l 来打印某个目录下面的文章。Google一下 python call system command,第一条就是stackoverflow 上面的一个相关问题:Calling an external command in Python. (google技术问题,基本都会显示 stackoverflow 相关问题)。

然后在这个问题下面,有人总结了调用外部命令的几种方法:

os.system()

os.popen()

subprocess.popen()

subprocess.call()

subprocess.run()

并且还对每个方法做了介绍,你可以选择适合自己应用场景的方法。再比如这个问题 How to check whether a file exists using Python?,介绍了 python 中检查文件是否存在的不同方法。

工具的使用

有许多强有力的工具可以帮我们更好地研究问题,你可能知道gdb调试工具,可能知道python的timeit时间监控模块,但是你不知道那些自己不知道的工具。很多时候,当第一次知道某个工具时,我们心中会产生相见恨晚的感觉。然而,心仪的趁手工具总是那么可遇不可求。

在 stackoverflow,每一个问题答案或者评论中都可能会有一些好的工具,你总有机会发现那些遗落在字里行间的优秀工具。

下面列出我发现的一些不错的工具:

truss/strace:跟踪进程执行时的系统调用和所接收的信号,strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。(来自问题:Why is reading lines from stdin much slower in C++ than Python?)

vprof:一个可视化工具,可以分析 Python 程序的特点,比如运行时间,内存使用等。(来自问题:How can you profile a Python script?)

Regex 101:一款在线的正则表达式辅助工具,可以帮助理解正则表达式的含义,方便调试正则表达式以及做一些简单的尝试。(来自问题:Learning Regular Expressions)

下面为 Regex 101 的一个简单示例:

思考的过程

很多时候,遇到一个问题,我们根本无从下手,不知道朝哪个方向思考。但是通过 stackoverflow,我们可以轻易知道具体的解决方案,有时候甚至还能知道别人面对这个问题时候是怎么思考的。

假设你想利用装饰器来完成一个任务,即在下面say函数返回的字符串前后加上,你想想这样定义 say。

@makebold
@makeitalic
def say():
   return "Hello"

每次调用 say 返回 Hello。但是要如何实现 makebold 和 makeitalic 呢,这是一个问题。在 stackoverflow 上,有大牛会直接告诉你答案,并扔给你一个装饰器的文档链接。但是还有大牛会把自己的思考过程,把自己对装饰器的理解详细地告诉你,让你深入去理解装饰器机制。

针对上面的这个问题,有一个答案获得了 3000 多赞,一步步告诉大家如何解决问题。首先告诉我们python中函数有什么特点:

函数是对象

函数可以被赋给一个变量

函数可以被定义在另一个函数中

一个函数可以返回另一个函数

可以把函数作为参数传递

然后开始解释什么是装饰器:其实就是封装器,可以让我们在不修改原函数的基础上,在执行原函数的前后执行别的代码。接下来手工实现了一个简单的装饰器原型,紧接着引入 python 中的装饰器语法。最后还列出了一些装饰器的高级用法,包括给装饰器传递参数等。读完整个答案,一定能对装饰器有较深的理解,并且知道理解装饰器的思考过程。这样,沿着这条思考的路径,你自己就可以推导出装饰器的使用方法。

可能的盲区

没有问题要提问时也可以时常逛一逛 stackoverflow,浏览一些投票比较多的问题,看看别人的回答。在这个庞大的知识库中,你很可能会发现自己的一些认知盲区,发现一些自己从未关注过的内容。

我就发现了一些比较有意思的问题,比如:

Print in terminal with colors using Python?

What is a metaclass in Python?

What is your most productive shortcut with Vim?

我整理了一份 Python 的高质量问题清单,放在这里以供时常翻阅。

相见恨晚

那么怎么才能找到 stackoverflow 呢,两个建议:

英语精确描述问题

用 Google 去搜索

只要你不是第一个遇见某个技术问题的人,你基本就会在 stackoverflow 找到相同或者类似的问题。早日遇见,早日喜欢上 stackoverflow,你会发现生活是如此惬意。

博客地址

更多阅读

玩转 Stack Overflow 之提问篇
7 Strace Examples to Debug the Execution of a Program in Linux
How can I make a chain of function decorators in Python?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38030.html

相关文章

  • 一个“诡异”的console.log()结果

    摘要:一个诡异的结果在前端开发中,我们都少不了用来输出变量和调试。再看下面一个例子图中的结果,我是在执行了这句话之后才点击的小三角,然而结果却没有变成诡异结果的样子。 一个诡异的结果 在前端开发中,我们都少不了用console.log来输出变量和调试。可是在使用它的过程中,偶尔也会出现一些让我们很费解的行为,如下图: showImg(https://segmentfault.com/img/...

    pkwenda 评论0 收藏0
  • 听说看了这份Java学习路线的同学,毕业都拿到了大厂offer

    摘要:服务层这一层有点东西了,算是整个框架的核心,如果你跟敖丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,操作,算法数据结构,架构框架,研发工具等等。 前言 自学/学习路线这样的一期我想写很久了,因为一直想写的...

    Dean 评论0 收藏0
  • 2017前端技术大盘点

    摘要:同时,前端技术也慢慢的趋于稳固,自成一套体系。从月份开始,微信正式将公测了小程序。基于小程序的开发,也将成为国内的前端的一大重点。 前言 临近2017的尾声,总是希望来盘点一下这一年中前端的发展。到目前为止,前端的井喷期也快临近尾声了。并不像几年前一样,总是会有层出不穷的新东西迸发出来。同时,前端技术也慢慢的趋于稳固,自成一套体系。如果你喜欢我的文章,欢迎评论,欢迎Star~。欢迎关注...

    y1chuan 评论0 收藏0
  • 2017前端技术大盘点

    摘要:同时,前端技术也慢慢的趋于稳固,自成一套体系。从月份开始,微信正式将公测了小程序。基于小程序的开发,也将成为国内的前端的一大重点。 前言 临近2017的尾声,总是希望来盘点一下这一年中前端的发展。到目前为止,前端的井喷期也快临近尾声了。并不像几年前一样,总是会有层出不穷的新东西迸发出来。同时,前端技术也慢慢的趋于稳固,自成一套体系。如果你喜欢我的文章,欢迎评论,欢迎Star~。欢迎关注...

    RobinQu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<