资深软件工程师:应该学哪种编程语言?怎么学?

资深软件工程师:应该学哪种编程语言?怎么学?

编者按:编程语言千千万,初学者总是纠结于该学哪一门语言。不用纠结,语言的流行只是一时,只能各领风骚三五年。要想不被淘汰,你必须掌握一切编程语言的基础。软件工程师Eric Girouard对如何学好编程提出了非常有用的建议。本文编译自Medium,原文标题是:The One Programming Language to Rule Them All

在撰写本文时,如果你去搜“我应该学习哪种编程语言”,可以产返回5.17亿个搜索结果。每个网页都会不断介绍一种语言相对于其他语言的优势,其中90%最终会推荐你学Python或JavaScript。

但是我想厚颜无耻一次,我要正式地发表跟这5.17亿个结果都不一样的意见,我的建议是,你应该学习的第一种编程语言是逻辑。

光知道如何编码已经不行了。这个市场已经被训练营毕业生挤满,以至于“初级软件开发者”这个职位都已经消失了。时至今日要想取得成功,你既需要知道如何去编写代码,还得知道如何去运用逻辑思维。

我第一次接触到计算机科学是十年级的时候上的一门选修课。上课的第一天,我很欣慰地看到面前摆满了各种冰淇淋和各式的圣代浇头。在大家都坐定之后,我的老师宣布:

“今天,我们将要制作圣代。条件是:你必须写一份关于如何准备圣代的具体说明清单——然后我会照单执行。”

这没问题啊,我想,轻而易举。在不到一分钟的时间里,我就写出了一分完美的圣代制作说明:

将三勺黑莓冰淇淋倒入碗中

将两汤匙热巧克力倒入碗中

把生奶油放入碗里

在圣代浇头洒上巧克力屑和樱桃

然后我的老师——这是对计算机的可爱比喻——开始用精准的方式挖苦我。因为无法穿透坚硬的外壳,它开始狠狠地戳冰淇淋纸盒,但盖子完好无损。

迫切想要享受一顿美食的我说:“好吧,先取下盖子。”

“你没有向我提供这些指令,所以,对不起,你的圣代我做不出来,下一位!”

快进到第二次尝试

取下盖子,打开黑莓冰淇淋

将三勺黑莓冰淇淋倒入碗里

打开热巧克力,勺两汤匙倒入碗里

打开鲜奶油,加入碗中

在圣代的浇头洒上的巧克力屑和樱桃

我敢肯定这次一定能行。我甚至还更进一步,确保了每样东西都先打开,然后再添加到我的杰作里面。

她(计算机)打开了盖子,舀了三勺,然后把它们放进碗里。我稚嫩的圣代终于成型了。然后她打开了热巧克力,把两汤匙放进了我的碗里面。请注意,不是两汤匙的热巧克力,而是两个真的汤匙,没有热巧克力。我的指令不够具体——再次地。所有这些都说完和做完之后,对方给我递上了一碗装有两把金属汤匙的冰淇淋,一个装有鲜奶油的固体罐,还有约300颗巧克力屑。

到此时我终于发现了:计算机就是个纯粹的逻辑实体。它不清楚背景,不做任何假设。它只是对一组非常具体的指令做出响应并且恰到好处地执行。

最后我制定的制作圣代指令集是一连串冗长但必要的灾难:

如果还没有准备好,请打开以下的每一样东西:黑色覆盆子冰淇淋,热巧克力,巧克力屑以及奶油

从一沓碗中取出一个,放在你面前

抓起冰淇淋勺,每次一勺,将三勺黑莓冰淇淋舀入碗中。完成后放下勺子

如果还没有拿到热巧克力勺子,那就取出两汤匙的热巧克力,每次一勺放入碗中,并在完成后放下热巧克力。

将搅好的奶油倒置,用手指按住碗口喷嘴3秒钟,然后将瓶子放回到静止位置

在碗上撒上约40颗巧克力屑,完成后将工具恢复回直立位置

从樱桃罐中取出一颗樱桃,优雅地将其放在圣代冰淇淋的顶部

用勺子把圣代递给学生

最后一点非常重要,没有这一点的话它就会开始吃我的圣代。

这就是计算机编程的现实。为计算机提供一系列密集的详细说明。从本质上说,这就是所有编程语言最终分解成的东西——指令。

软件开发的职业路径

软件开发现在发展已经到太过宽泛以至于无法当作单个行业进行讨论的地步,就像“软件开发人员”这个职位的描述过于宽泛一样。两名拥有脱节的技能集的开发人员均可具有相同的市场价值,这说明在做开发这一行需要的不仅仅是编码的能力。熟练的开发人员具备的是独立于编程的一种普遍的特质:逻辑。

最好的开发人员是批判性思维的专家。这一点至关重要,因为绝大多数软件项目都是缺乏文档的,碎片化的灾难。他们需要一位具备批判性思维的人将杂乱的信息拼凑在一起,并在需要的时候填补空白。这方面落后的开发者是无法将那些点连接起来的人。

所有这一切都将在另一个大胆的声明中达到顶点:计算机科学的基础是,并且永远都是,至高无上的编码能力。

语言的流行兴衰无常。框架会被废弃,公司会通过混搭自己的技术栈来应对不断变化的需求。有什么东西是从来都不会改变的吗?基础——从定义来说基础是永远都不会变的!

如何改进逻辑思维

对于那些无法深入思考的人来说,请考虑使用这些工具来改进自己的程序化批判性思维:

了解你的运行时复杂性

也被称为Big-O,程序的运行时复杂性可以表示为在任何实例上执行的与输入(n)的规模相关的步骤数。持续记录你的程序运行时是第一步。

了解你的数据结构

数据结构是每一个复杂程序的核心。知道在什么情况下使用哪一种结构本身就是艺术。数据结构与运行时复杂性直接相关,因为选择了错误的结构可能会让程序戛然而止。在数组中查找某值的复杂性为O(n),这意味着随着输入规模的增长,用数组会变得更加代价高昂。而散列查找的复杂性是O(1),因此无论所述散列的键数是多少,在散列中查找键值的时间都将保持不变。

曾经有面试的人认为数组的搜索时间要比哈希快。这是告诉我不要雇用他们的直接信号——所以要了解你的数据结构。

多读多听多看

类似Udemy、Pluralsight 和Codecademy这样的网站是学习新编程语言难以置信的资源。要想学习基础知识,就得去找有关一般的工程概念、最佳实践和编码风格方面的书籍。对于工程师来说,最值得推荐的书籍包括《设计模式》,《重构》,《代码大全》,《代码整洁之道》以及《程序员修炼之道》等,这里仅举几例。最后,每个工程师案头应该放一本《算法导论》,以备防身之用。

实践!

不拉够小提琴,你就不可能成为一名小提琴大师。像HackerRank、CodeWars、CoderByte、TopCoder和LeetCode这样的网站有成千上万个挑战问题,这些问题旨在测试你对数据结构和算法的了解。我发现这些网站的最佳使用办法是自己解决去问题,接着在Github上托管你的解决方案,然后再查看本问题的顶级解决方案,看看其他人是如何解它的。这让我想到了最后一点:

看看别人的代码

你在软件开发过程中可能会犯下的最大错误就是孤军奋战。软件开发基本上是靠众包的力量。我们一起制定标准,一起去犯错误,然后慢慢才知道什么东西管用(通过大量失败)。花时间去看熟练的开发人员的代码永远都会有回报。只需确保它是好的代码。

我能提供的最好建议就是永远不要为因为自己还不知道的事情而感到羞耻。就像我所提到的那样,这个行业规模庞大,语言数的数量极多,内容很密集。要想了解需要花费大量的时间和精力,而要想熟练还需要付出更多,而精通甚至需要付出更多。当我达到那种程度时,我会告诉你的。

译者:boxi。

上一篇:马尔代夫太阳能度假酒店以其光伏屋顶而闻名
下一篇:为什么开发者应该摒弃敏捷?