原文出自Medium
作者:Eric Girouard
京东云开发者社区编译
在撰写本文前,我搜索了“我应该学习哪种编程语言”这个词条,发现会产生5.17亿个结果。而每个页面都在滔滔不绝地介绍某种语言相对于其他语言的优势,其中90%会推荐Python或JavaScript。
恕我直言,我并不认同这5.17亿个搜索结果,并建议你最应该学习的第一种编程语言——逻辑。
知道如何编写代码已经不再是一种优势了。市场上充斥着各种培训机构、学习班培训出来的人员,“初级软件开发人员”的职位已经不复存在。要想在今天的市场上取得成功,你不但需要知道如何编码,并且还需要学会运用逻辑思维模式。
1.我的第一节计算机科学课
我第一次接触“计算机科学”是在我十年级的选修课。上课第一天,我欣喜地看到我面前有各种各样的冰淇淋和各种圣代配料。在我们都坐下之后,我的老师宣布:
“今天,我们要制作圣代。有一个条件:你必须写一份关于如何准备圣代的具体说明,然后我就会照着做。”
当然没问题,我想,这简直是一件轻而易举的事儿。然后在不到一分钟的时间里,我就草草记下了一套“完美”的圣代制作指南:
1、将三勺黑莓冰淇淋放入碗中
2、将两汤匙热巧克力浇入碗中
3、把鲜奶油放入碗里
4、在圣代顶部撒上糖屑和樱桃
然后,我的“老师”(嗯,我愿意用这个可爱的比喻称呼我电脑)做出了我所见过的最准确的讽刺表演——她开始恶狠狠地戳冰淇淋盒盖,但无法穿透它坚硬的外表。
“好吧,首先取下盖子,”我说,仿佛急切地想要享受一顿美食。
“你没有向我提供那些指示,所以,很不幸,没能给你做一个圣代,下一个!”
2.快进到#2号尝试
1、取下盖子来打开黑莓冰淇淋
2、将三勺黑莓冰淇淋倒入碗中
3、打开热巧克力,将两汤匙热巧克力倒入碗中
4、打开鲜奶油,将一些鲜奶油加入碗中
5、在圣代的顶部洒上的糖屑和樱桃
这次我确信我有打开盒盖这个条件了。我甚至在添加每个项目到我的杰作前,就已经确保它们都被打开了。
她打开盖子,舀了三勺黑莓冰淇淋,把它们放进碗里。从这一步看,起码我的新生圣代开始诞生了。
紧接着,她打开热巧克力,把两个汤匙放入我的碗里。不是两汤匙的热巧克力,请注意——是两个现实中的汤匙,没有热巧克力。
看起来我又一次没做到给予足够具体的指令!
当全部都完成之后,我得到了一碗冰淇淋,上面放着两个金属勺子、一坨鲜奶油和大约300片糖屑。
到这个时候,我终于明白了:计算机是一个纯粹的逻辑实体。它没有上下文,也没有假设。它对一组非常具体的指令做出响应,并最终在Terminal中运行。
我最终制定的冗长却必要的圣代制作指南:
1、如果还没有提前准备好,请打开以下各项原料:黑莓冰淇淋,热巧克力,糖屑和鲜奶油;
2、从架子中取出一个碗,放在你面前;
3、拿起冰淇淋勺,一次一勺将三勺黑莓冰淇淋舀入碗中,完成后放下勺子;
4、如果还没有拿到热巧克力勺子,那就拿起它,然后舀两汤匙热巧克力,将它们放入碗中,一次一勺,放完后放下勺子;
5、将搅好的鲜奶油倒置,把喷嘴靠在碗边然后用手指按压3秒钟,然后将瓶子放回原处;
6、在碗里撒上约40片糖屑,并在完成后将摇壶恢复到直立位置;
7、从樱桃罐中取出一颗樱桃,将其精巧地放在圣代冰淇淋的顶部;
8、把圣代和勺子一起递给学生。
最后一个步骤非常重要,因为如果没有这个步骤她将会开始吃掉我的圣代。
这就是计算机编程的现实情景。请为计算机提供密集的详细指令集。本质上来说,这就是所有编程语言分解成的指令。
3.软件开发职业道路
软件开发现在已经到了不能作为一个单独的行业来讨论的地步,就像“软件开发人员”这个职位名称太宽泛一样。两名开发人员在拥有不连贯的技能集的情况下可以看作是具有相同市场竞争力,这意味着在开发中,职业生涯不仅仅是取决于编码的能力。熟练的开发人员拥有一种与编程无关的通用属性——逻辑。
最好的开发者是批判性思维的专家。这是至关重要的,因为大多数软件项目都是没有文档记录的、支离破碎的灾难。它们需要一个批判性的思考者来拼凑信息,并在需要的时候填补空白。落后的开发者是那些不能将这些点连接起来的开发人员。
所有这一切都归结于另一个大胆的声明: 计算机科学的基本原理对于编码能力是至关重要的,而且将永远是至关重要的。
流行语言随潮流而变化。框架变得过时,企业通过混合技术来应对不断变化的需求。唯一不变的是什么?基本原理——这就是他们的定义!
4.如何提高逻辑思维
对于那些无法深入思考的人来说,请考虑使用这些工具来提高您的编程批判性思维:
了解您的运行时间复杂度
程序的运行时间复杂度也称为Big-O
,可以表示为在任何实例上执行的与输入大小(n)相关的步骤的数量。首先,请始终监视您的程序的运行时间。
了解您的数据结构
数据结构是每个复杂程序的核心。知道在什么场景中使用哪种结构本身就是一门艺术。数据结构与运行时间复杂度直接相关,因为选择错误的结构会使程序陷入停顿。数组查找是 O(n) ,这意味着随着输入的大小增加,使用数组的开销也会增加。散列查找O(1)
,因此无论所述散列中的键数是多少,散列键的查找时间都将是恒定的。
我曾经有一些候选人认为数组的搜索时间比散列更快。这就是一个警告我不要雇佣他们的直接信号——因此,请了解你的数据结构。
读/看/听
像Udemy,Pluralsight和CodeAcademy等网站是学习一门新的编程语言的绝佳资源。要了解基础知识,请参阅有关通用工程概念、最佳实践和编码风格的书籍。工程师们最强烈推荐的书籍是《Design Patterns》,《Refactoring, Code Complete, Clean Code》, 和 《The Pragmatic Programmer》等。最后,每个工程师都应该在他们的办公桌上保留一份《Introduction to Algorithms》,并妥善保存。
实践!
不曾疯狂练习拉小提琴,就不可能成为一名小提琴大师。像HackerRank,CodeWars,CoderByte,TopCoder和LeetCode这样的网站上有成千上万个挑战问题,旨在测试您对数据结构和算法的了解。我发现使用这些网站的最佳方法是自己尝试解决问题,并将解决方案放在Github上,然后查看该问题的顶级解决方案,看看其他人是如何解决的。这就引出了我的最后一点建议:
查看其他人的代码
在软件开发过程中,您可能犯的最大错误就是单独行动。软件开发在很大程度上是一项众包工作。我们一起建立标准,一起犯错误,并随着时间的推移(通过多次失败)来学习什么是有效的。花时间阅读熟练的开发人员的代码总是有回报的。只要确保它是好的代码。
我能给你留下的最好建议就是永远不要为你所知道的事情感到羞耻。正如我所提到的,这个行业规模庞大,有着庞大到可怕的语言,内容密集。需要花费大量的时间和精力来进行理解和学习。获得熟练则需要更多的努力,并且需要花费更多的精力来达到精通。
当我到达那里时,我会告诉你的。