36

[译] 如何像程序员一样思考:解决问题的经验

 5 years ago
source link: https://mp.weixin.qq.com/s/_GaSsFzThujQB_Ay8C5I7g?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

uQZJFnA.jpg!web

from unsplash

如何你对编程感兴趣,你可能见过这句话:

“Everyone in this country should learn to program a computer, because it teaches you to think.” — Steve Jobs

你可能还想知道,像程序员一样思考到底意味着什么?怎样才能做到?

从本质上讲,这是一种更有效的解决问题的方法。

在这篇文章中,我的目标是用这种方式教你。

最后,你就会知道怎样才能更好的解决问题。

为什么这很重要?

我们每天都有遇到很多问题,无论大的小的。我们处理这些问题的方式有时候都是随机的。

除非你有个系统,否则用“随机的方式”可能就是你“解决”问题的方法(下面我开始学习编程写代码时候做做的事情):

  • 1、试着解决方案

  • 2、如果不行,再试一次

  • 3、如果没有效果,重复第二步知道你运气好

这样的方法,在你运气不好的时候,就傻了。总之这种方法时候解决问题的最糟糕的方法!也是非常浪费时间的。

最好的方法是:

  • a、有一个框架

  • b、练习它

几乎所有的雇主都把解决问题的能力放在首位!

解决问题的能力已经是雇主们寻找程序员、测试工程师、系统设计师等最看重的一个方面。

计算思维或分解大型复杂问题的能力,与工作所需要的基本技术能力一样有价值 — by Hacker Rank (2018 Developer Skills Report)

一个框架

为了找到正确的框架,我遵循了Tim Ferriss 关于学习的书《the 4-Hour Chef》中的建议, 《The 4-Hour Chef》

这让我采访了两个让我印象深刻的人:

C. Jordan Ball (ranked 1st or 2nd out of 65,000+ users on Coderbyte, and V. Anton Spraul (author of the book “Think Like a Programmer: An Introduction to Creative Problem Solving”.

我问了他们同样的问题,你猜怎么着?他们的回答竟然非常的相似!

接下来,你很快就能认识他们了~~

当然,其实这也并不意味着它们每件事情都是以同样的方式进行,每个人都是不同的,你也会是不同的,但如果你从我们都认同的好的原则开始,你也会走的更远更快。

我看到新程序员犯的最大错误是专注于学习语法,而不是学习如何解决问题。by - V. Anton Spraul (http://vantonspraul.com/)

那么,当你遇到新的问题时,你应该怎么做呢?

步骤如下:

1、理解

非常确切的知道自己被问的是什么问题。大多数难题之所以难,是因为你不理解它们,所以这个是第一步。

如何知道什么时候你理解了一个问题呢?——当你能用简单的、自己的语言解释它的时候。

你可能会记得,当你被困在一个问题上,一旦开始解释它,你就立刻看到逻辑上的漏洞,而且漏洞很可能也是你以前没有看到的。

大多数程序员都知道这种感觉吧!

这就是为什么你应该把你的问题写下来,画个图,或者告诉别人。

“If you can’t explain something in simple terms, you don’t understand it.” 如果你不能用简单的语言来解释某件事,你就无法理解它 — Richard Feynman

2、计划

不要在没有计划的情况下,一头扎进解决问题的过程中(并且希望你能混过去),计划你的解决方案吧!

如果你不能写下计划确切的步骤,什么也都不帮不了你。

在编程中,这意味着不要立即开始进行黑客攻击。给你的大脑一定的时间来分析问题和处理信息。

为了得到一个好计划,回答这个问题: 给定输入 X,返回输入Y所需要的步骤什么? 程序员的世界里面,有一个伟大的工具 来帮助他们实现这个,那就是注释!

3、拆分

这是最重要的一步

不要试图一次就解决一个大问题,不然你可能会哭的。

相反,当你把这个问题进行拆分成一个一个子问题,这些子问题就更加容易解决了。

然后,逐个解决每个子问题,从最简单的开始。最简单意味着,你知道答案(或者更加接近那个答案)。

另外最简单的方法意味着子问题的解决并不依赖与其他问题的解决。

一旦你解决了每个子问题,再把这些点连接起来

连接所有“子解决方案” ,将为你提供的原始问题的解决方法!那么恭喜你,你做到了!

这种技巧呢,是解决所有问题的基石,请记住它(建议你重新再读一遍这个步骤)

如果我能交给每一个初学者一种解决问题的技能,那就是“减少问题这个技能” ,例如:假设你是一个新程序员,你被要求编写一个程序,读取10个数字,然后算出哪个数字是第三高的,对于一个全新的程序员来说,这可能是一项艰巨的任务,尽管它只需要基本的编程语法

如果你陷入困境,你就应该把问题简化。而不是专注在第三个高的数字上。如何在一个整体中先找到最高的那个数呢?还是太难了?那从三个数字中找到最大的那个呢? 还是太难? 那如果是寻找两个较大的那个呢?

将问题简化到你知道如何解决问题,并编写解决方案的程度。然后稍微展开问题,重新解决方案使其匹配,并继续进行,知道你回到你最开始的地方。— V. Anton Spraul

4、卡住了呢?

现在,你可能正坐在那里想,这几个步骤看起来还不错嘛,但如果我卡住了,设置不能解决子问题该怎么办?

首先,深呼吸。因为这个很正常!

别担心,朋友,每个人都会这样子!

不同之处在于,最好的程序员/问题解决者,对bug/错误更加好奇,而不是恼怒!

事实上,当你遭遇不幸时,有三件事情可以尝试:

调试:逐步检查你的解决方案,试图找出哪里出错了。即调试程序。

(调试的艺术在于,找出你真正告诉你的程序去做了什么,而不是你以为你告诉它去做什么)

重新评估:后退一步,从另个一角度来看这个问题,有什么可以抽象成更加一般的方法吗?

(有时候,我们会对问题的细节太过沉迷,以至于忽略了再更一般的层面上解决问题的一般原则!)

经典的例子,求一长串连续整数的总和,1+2+3+4+...+ n , 利用一个简单的消元方法就可以很快的识别出这么一个公式:n(n+1)/2 ,从而避免了不得不做的加分。

(另一种重新评估的方式是重新开始。删除所有的内容,用全新的眼光重新开始。你会惊讶到这是多么有效。)

搜索/研究 :你没看错,就是使用Google,不管你有什么问题,可能有人已经解决了。找到那个人/解决方案。事实上,即使你解决了问题,也要这样做!(你可以从别人的解决方案中学到很多)

(注意:不要寻找解决大问题的方法。只寻找子问题的解决方案,为什么呢? 因为除非你努力,(哪怕是一点点),否则你什么都学不到,如果你什么都没学到,那你就是在浪费时间)

5、实践

不要期望仅仅一个星期就能变的很厉害,如果你想成为一个好的问题的解决者,就应该去解决很多问题!

练习、练习、练习!迟早你会认识到这个问题可以通过很轻松的方式来解决。

那么如何练习呢?其实也有很多选择的!

比如:国家象棋游戏、数学问题、数独、视频游戏、cryptokittiles ,bla bla bla .........

事实上,成功认识的一个普遍模式是他们练习“围观解决问题”的习惯。例如: 彼得.泰尔(Peter Thiel )下棋,埃隆.马斯克 (Elon Musk) 玩电子游戏....

拜伦.里夫斯(Byron Beeves)说,如果你想知道三到五年后商业领导力会是什么样子,那么久看看网络游戏正在发生什么吧

快进到今天 , 埃隆马斯克、雷德.霍夫曼、马克.扎克伯格和其他许多人都表示,游戏是他们称建立公司的基石。——Mary Meeker (2017年互联网趋势报告)

这意味着你应该只玩电子游戏? 也不全是。

但是这个到底跟电子游戏有什么关系呢? 没错,就是问题解决!

所以,你应该做的是,找到一个练习的出口,可以让你解决很多小问题的东西。(理想情况下,还是你喜欢的东西,那就更好了)

例如,我喜欢编程挑战,每天,我都试图解决至少一个挑战(通常在Coderbyte)https://coderbyte.com/

正如我所说,所有的问题都有相似的模式!

6、结论

现在,你知道“像程序员一样思考” 是什么意思了。

你也知道解决问题是一种难以置信的元技能。

如果这还不够,你肯定也知道了如何练习解决问题的技巧。

你看,这是不是看起很酷!

最后,祝你遇到很多问题哈哈。

你没看错,至少现在你知道怎么解决了,同时,你将了解到,每一种解决方案都会使你得到改进!

“Just when you think you’ve successfully navigated one obstacle, another emerges. But that’s what keeps life interesting. 就在你认为已经成功跨域了一个障碍时候,另一个障碍有出现了,但这正是让生活变得有趣的地方。
Life is a process of breaking through these impediments — a series of fortified lines that we must break through. 生活是一个突破这些障碍的过程——一系列我们必须突破的防线。
Each time, you’ll learn something. 每次,你都会学会到一些东西。
Each time, you’ll develop strength, wisdom, and perspective. 每一次,你都将发展你的张力、智慧、和洞察力
Each time, a little more of the competition falls away. Until all that is left is you: the best version of you.” — Ryan Holiday 每次,更多的竞争就会消失。直到你成为最好的自己。——瑞安.霍利迪(障碍就是路)

现在,去解决一些问题吧!

作者:谢导(水瓶座男生)

原文:How to think like a programmer — lessons in problem solving

yYjQbei.png!web

扩展阅读:

7NNjUrr.jpg!web

长按2秒,识别二维码,关注我。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK