编程的第一原则

我最近编写了一本80页的指南,指导如何在没有学位的情况下获得编程工作,并根据我的经验帮助学生在Springboard上做到这一点。本节摘录的内容是我将重点放在编程的第一个原则上,这个框架将帮助您更有效地学习。这是Elon Musk青睐的学习方法 - 这可以帮助您有效地回到学习编程的基础上。

1-编程是关于对数据的操纵

其核心是编程是关于驱动数据并使用它。当您将登录凭证发送到Web服务器时,或者当您加载配置文件图片时,代码会来回发送数据。如果您可以认识到驱动数据是编程的基础,那么你就建立了一个未来大厦的地下室。

2-编程就像写作 - 你想尽可能清楚

当你编写代码时,你可能会认为它是一个单独的活动。尽管好莱坞每一个刻板印象都被编程原型所抛弃,但事实并非如此。当你编程时,你会想象你正在为观众写作。编程是一项协作活动,通常涉及与队友或其他合作者密切的合作。

3-了解不同类型的编程

你认为编程是一个通用的blob,还是可以将它区分为专门的部分?说你想成为程序员有点像说你想成为一名工程师 - 魔鬼可以在细节中。

稍后我们将详细介绍作为程序员可以采取的各种途径的广泛技术路径,但现在我们可以区分一些广泛的差异。

编程类型的最大区别可以被认为是“前端”和“后端”编程之间的区别。前端涉及操纵用户直接看到的内容:考虑您在登录到任何Web界面时看到的界面。后端是所有看不见的魔术 - 服务器处理密码的方式,并授予您访问所有数据的权限。

编程的不同范式

也有不同类型的编程范例:表达逻辑的不同方式,以及在总体层面上对于每种编程语言的不同功能可以归结为分类差异。

以下是编程主要范例的概述:

  • 声明。声明式编程非常简单明了。它表示特定计算的逻辑,而不指定其流程。考虑它的最简单方法是一种编程语言,它声明了正在完成的任务,而不是应该如何完成。这方面的例子包括像SQL这样的编程语言,其语法的重点在于明确指定你想要的内容,而不是指定它是如何完成的(例如:选择数据的SELECT命令)。SELECT查询背后的底层步骤不必为机器根据其基础逻辑进行显式定义。
  • 势在必行。与声明模型不同,命令式编程侧重于如何完成任务,而不是什么任务正在被完成。就像命令行给出的命令式语言一样,命令式编程范式向机器描述了他们应该如何执行任务。命令式语言包括诸如Java,JavaScript和Ruby等语言,尽管它们也都具有面向对象的逻辑 - 其中大多数是多范式语言,它们与各种编程范例兼容。
  • 功能性。函数式编程基于数学函数。在这里,命令也是用来指定如何执行例程而不是执行什么例程,与命令式范例不同,当前程序的状态不会偶然受到影响:这意味着在实践中您可以拥有无需返回调用的函数,因为程序状态将保持不变。函数式编程在学术界受到强调,诸如Lisp和Clojure等语言突出地支持函数式编程作为范例。
  • 面向对象。自20世纪80年代以来,主流编程范式,面向对象编程涉及构建具有数据属性的对象和编程子程序,这些子程序称为方法,然后可以调用或修改方法。诸如Java,Python,C,C ++,PHP和Ruby等语言主要面向对象。重要的是,与命令式或函数式编程不同,继承和代码可重用性的概念在编程对象中牢固地确立,编程对象可以作为类(定义一组对象的定义,它可以携带的数据)或对象本身这通常对应于真实世界的对象和与它们相关的一组属性)。

还有一些编程范例,主要是有些过时的或有点理论的,它们围绕着程序编程,逻辑编程和符号编程。如果你有时间你可以研究那些东西,并做比较和对比!

4-编程是关于强制简化

简单胜于复合。

复合优于复杂。

扁平强于嵌套。

松散胜于耦合。 - Zen of Python

有效编程的基本原则之一是一种强制的随着时间和迭代而变得自然的简单性。也许在Zen of Python 中完美地总结出来,简单比复合更好 - 复合比复杂更好。就像精彩的写作,有时需要专注于正确的想法并尽可能多地去掉不必要的单词,好的编程意味着保持底层逻辑的简单表达,以便其他人或者最重要的是你的未来自我可读!

5-小效率带来大收益

当你同一个可以在几秒或者几微秒的时间内执行复杂的数据运算机器打交道时,你将很难从人的角度去思考对这类系统的效率该如何管理。人类在指数思维方面的能力是弱的臭名昭著,然而编程却偏偏显著依赖于这一思想。在一个涉及超过数万亿次的操作链的运算过程中,一次运算中仅仅几微秒的差异累积起来就可能意味着数千小时的差异。

这里有三个概念可以帮助您管理编程的复杂性:

时间复杂度

熟悉编程中的时间复杂性概念,特别是渐进符号。简而言之,渐进符号映射出算法对给定输入集的的响应模式。

O(1)算法 反应相同,而不管输入对象大小都一视同仁的处理。您可以输入一个或万亿个数值: - 都无所谓,算法会同时处理。一个常见的例子是大多数编程语言中的return或print算法。(为方便理解可以认为这个算法是扁平的,多线程的)

O(N)算法 对给定的输入进行线性反应。一百万个数据点?预计它比单单运行慢一百万倍。(垂直算法,类似于单线程,数据越多处理时间越多)

O(N 2 )算法按指数规律对给定的输入做出反应。每个输入在处理时都会被平方。想象一下一个算法,每次迭代都要查看两次数据。如果一方数据集的大小是另一方数据集的两倍,那么当涉及到算法处理不同大小的数据集的速度的快慢时,您会很快看到指数爆炸级的处理时间的差异。

这种算法可以通过多种配置进行:本教程有更完整的列表和更全面的解释。结论是,您应该始终努力使用尽可能线性缩放的算法,否则大型数据集将变得难以管理。

模块化

编程最重要的事情之一就是能够扩展之前保存的逻辑。您不必每次都重新发明轮子:如果您已经构建了可用的组件,则可以随时调用它。

这种简单的保存代码片断的概念可以像混合组件一样被调用,称为模块化(modularity),对于单个项目来说这是一个重要的节省时间的“基础设施”。模块化还可以帮助您节省时间。您可以与不同的人一起处理复杂的问题,每个人负责在单个模块上开发,然后让您的模块与其他人构建的模块进行交互,形成更复杂的解决方案。

掌握如何使你的程序模块化的细微差别不仅会节省你的时间,还会使你的程序更加强大和更具可读性,并且更少依赖可能被错误淹没的大块代码。

快捷键

尽可能使用快捷键!有效编程涉及尽可能快地将您的想法和逻辑放入机器逻辑。键盘快捷键将帮助你加速自己的工作。诸如TypeRacer等游戏将帮助您在打字时每分钟提高单词数量,从而让您更快速地将您的想法转化为代码。

对捷径的掌握将使您能够更快地构建事物,并且更快地看到结果。

6-实践出真知

人们常说,对待增长,人类思维有两种方式:或者是固定的心态(存量思维),或者是成长的心态(增量思维)。在固定的心态中,人类的成长是命运的一个功能:不管你多努力,你永远不能超越先天因素给你的限制。成长心态与固定心态完全相反:在这里,你的成长只受时间和你把事情做好的意愿的限制。

没有人一生下来就会是比其他人更好的程序员。如果你想提高你的编程技能,你必须努力工作,并用时间弥补天赋的缺陷。

这延伸到面试,这是一个绕不开的主题。在这个话题下,现在的门槛比以前我们习惯的正常条件要高得多:因为你有足够的时间和大量资源(如StackOverflow)可以帮助您一路走下去(稍后会详细介绍)因此面试会难得多。编程面试旨在对你的测试。你必须习惯于在自然和人为的约束条件下练习一种编程形式:做定时解决问题的集合,并且仅仅依赖纸张来描绘一些算法。

7-创建针对不同需求的灵活程序。

编程中最大的困难之一是需要创建可以扩展的东西,甚至在所谓的“ 长尾案例 ” 下也不会被破坏:你设置的变量要能够满足业务需求的所有挑战。要想到的最简单的长尾案例是一款非常流行的应用程序,必须一次支持数千用户。

8-建立有用的东西。有同理心,并理解你的用户的问题。

大多数人会忘记技术不仅仅是一种用于娱乐的技巧。技术是满足需求的手段。不要忘记,你不是为了构建而建设:你正在为最终用户而构建,或者解决一个没有技术就无法解决的有意义的问题而写。知道何时用代码构建某些东西,并知道何时不需要。

如果有人已经建造了车轮,则不需要重新创建它。很多人已经建立了解决方案来解决如何存储销售联系人的需求 - 但是那里存在的问题仍然还有什么问题没有看到?每个这样的问题都可能成为一个成功项目的基础。

用您的编程技巧构建有用的东西。并向他人强调他们,这是来善用你的技能最好的方式。

现在,有用的是什么意思?这是问题的关键。在充满各种可能的奢侈品和消费者需求的应用程序的世界中,很难确切地看到什么有用的手段。在这种情况下,实践移情并且诊断可以通过技术解决方案获得帮助的实际问题非常重要。值得注意的是,这不必局限于可以为了获区利益而解决的问题。社会善举或技术人员解决社会问题的技术空间很大。这个数据科学案例研究为国际发展/基本收入慈善GiveDirectly提供了一个很好的例子。

为了成为最具影响力的技术专家,重要的是要了解人们面临的问题 - 了解何时以及如何提出正确的问题,如何倾听以及揭示人们常遇到的根本问题,这一点很重要。通过适当的移情和观察,你可以建立最有用的东西,帮助解决他人的问题。

9 - 充分利用尽可能多的资源,尽可能回馈

不要害怕失败。不管结果如何,你都会一路学习,练习你的技能并日新月异。

  • 发表于:
  • 原文链接:https://thenextweb.com/contributors/2018/05/07/first-principles-of-programming

扫码关注云+社区

领取腾讯云代金券