如何学习编程 » 代码简洁性
管理同意
为了提供最佳体验,我们使用cookies等技术存储和/或访问设备信息。同意这些技术将允许我们处理诸如浏览行为或本网站上的唯一ID等数据。不同意或撤回同意可能会对某些特性和功能产生不利影响。
功能
功能
始终活跃 技术存储或访问对于明确请求的订阅者或用户启用特定服务的合法目的,或仅用于通过电子通信网络传输通信的目的是绝对必要的。
偏好
偏好
技术存储或访问对于存储订阅者或用户未请求的偏好的合法目的是必要的。
统计
统计
专门用于统计目的的技术存储或访问。专门用于匿名统计目的的技术存储或访问。在没有传票、互联网服务提供商自愿配合或来自第三方的额外记录的情况下,仅为此目的存储或检索的信息通常不能用于识别您的身份。
营销
营销
需要技术存储或访问来创建用户配置文件以发送广告,或在网站或跨多个网站上跟踪用户以实现类似的营销目的。
管理选项 管理服务 管理{vendor_count}供应商 阅读更多关于这些目的 接受 拒绝 查看偏好 保存偏好 查看偏好 Cookie政策 {title} 法律声明
代码简洁性
如何学习编程
2018年10月9日 by Max Kanat-Alexander
人们经常问我一个问题:“我如何成为一名程序员?“或者"我如何学习编程?“根据个人情况和你想要的方式,这个问题有很多可能的答案。我想既然人们这么经常问我这个问题,我最好还是写一篇文章来谈谈。
找到最佳方法
在学习编程时,无论使用什么方法,有一条规则对我很有帮助,那就是总是问:“完成这个任务的最佳方式是什么?“或者"完成这个任务的正确方式是什么?“也就是说,在编程中,你可以采取许多不同的途径来完成你的任务。但通常,只有其中一种是推荐的方式,要么是在你的编程语言中最现代的方式,要么是程序员社区基于经验达成共识的最佳实践。
通常,你可以通过阅读你正在学习的编程语言的文档,或通过Google或Stack Overflow在线搜索最佳实践来找到这些信息。如果你找不到答案,可以在论坛、邮件列表或Stack Overflow上提问。直到今天,当我接到需要学习一些我不知道的东西的任务时,我仍然会做所有这些事情。
这样做的优势是,你不仅学会了编程,还学会了成为一个优秀的程序员。同时,它迫使你真正深入理解你正在使用的工具和语言。如果你在这个过程中持续这样做,你最终会对正在使用的系统有良好而深入的理解,同时保持足够的实用性来保持自己的兴趣。(也就是说,你只对你实际在做的事情进行深入探索——而不是那些你永远不会用到的随机理论内容。那些内容也可能很有趣,但它不是一个你可以永远用来真正学习编程的教育体系。)
当然,你必须确保你真的理解你在阅读的所有内容。这可能意味着深入研究更多文档,然后甚至更多的文档,直到你理解所有使用的单词和符号。这没关系!这正是这个系统发挥作用的重要部分——你对你正在使用的符号和概念获得了真正深入的理解。
现在,要明确的是,当你刚开始学习编程并接到一个具有挑战性的任务时,用任何你能想到的旧方法完成它是可以的。你正在学习基础知识,而不是最佳实践。这条建议适用于你一旦克服了学习如何完成任何任务的基础知识阶段。对于一个纯粹为了学习而做的项目,最重要的部分是你学到了你打算学习的东西。但一旦你掌握了这一点,就要深入研究,看看你是否以最佳可能的方式完成了事情。
好的,现在让我们谈谈人们实际学习编程的不同方法。
大学
大学里与编程相关的最常教授的科目叫做"计算机科学”。我说它与编程相关,是因为在大多数计算机科学课程中学到的东西很少会在他们作为专业工作程序员的日常生活中真正有用。这并不总是正确的——有些领域计算机科学非常有用。但总的来说,我们称之为"软件工程"或"开发"的领域与大学所涵盖的"计算机科学"是不同的。
通常,大学涵盖的计算机科学基础知识非常有用。我上过大学并学习了计算机科学,我的前两年学习对我非常有用,尤其是前几门课。我在软件开发的一些基本概念上打下了很好的基础。
但我当时没有意识到的是,计算机科学只是部分关于编程的研究。另一部分是关于算法的研究。(对于那些阅读本文但不知道的人,算法是完成某个任务的一系列步骤。这就是它的真正含义。甚至购物清单也是一种算法。)算法的研究通常涉及学习最高效的做事方式。也就是说,找出如何使用最少的步骤或最少的内存来完成诸如排序整数列表之类的任务。有些问题除非你知道正确的算法,否则计算机根本无法解决,偶尔你会在编程中遇到需要这些知识的问题。所以它确实有一些用处。但解决这些算法问题并不是你将花费大部分时间做的事情。
即使是那些提供"软件工程"课程的大学,它们也很少能提供真实世界的完整体验。原因是大多数课程最多只持续几个月,最多让你与几个人合作,代码库只有几千行代码。在现实世界中,你将与大量人员合作,代码库将持续数年,至少有数万行代码。然而,这些软件工程课程仍然比什么都没有好得多。
所有这些都说,有一些大学确实培养出了优秀的程序员,无论是通过计算机科学课程还是软件工程课程。通过上大学课程学习编程总是有一些价值的。至少,上大学提供了一种结构和纪律,鼓励你完成课程。
自学
与大学培训相反,许多程序员是自学的。他们在网上阅读一些文档,摆弄东西,以某种方式让这些东西工作,最终通过许多痛苦、艰难的经验成为有能力的程序员。
我学习编程的很多方式就是这样。对我来说最重要的是有一些我想要完成的任务。你看,编程是一种工具,它本身不是目的。它是一个你用来完成其他事情的系统。所以你必须有一些你想要完成的事情。有时你必须自己编造那个任务。例如,我的一个朋友有一个非常简单的游戏的想法。所以有一个夏天,我花了几个星期学习Java,以便我可以编写那个游戏。我已经从我的大学课程中了解了另一种语言C的编程基础知识。所以我对编程并不完全陌生,这有很大帮助。
我所做的(也是我建议大多数人如果想学习某种语言的话应该做的)是,我只是浏览了该语言的创建者提供的官方教程。对我来说,这是一个较旧版本的Java教程。几乎每种语言都有这样的官方教程,或者至少推荐一些你可以学习的网站。通常你只需要在Google中搜索你想学习的语言的名称,后面加上"教程"这个词,你就能找到你想要的东西。或者去你想学习的语言的主网站,查看他们的"入门"链接。
现在,如果你完全不知道如何编程,根据你对计算机的经验水平,你可能需要先学习一些其他东西。你可能需要学习一些关于计算机如何工作、如何编辑文本文件以及如何通过命令行运行程序的知识(因为这通常是你运行第一个程序的方式)。不过,现在很多这些都被使用基于网络的代码编辑器简化了,你可以在网络浏览器中编写代码并直接运行。要找到其中一个,只需在Google中搜索你的语言名称,后面加上"web editor”(不带引号)这两个词。
一旦你学习了某种语言的教程,有很多方法可以自学编程。Google和Stack Overflow绝对是你的朋友,你正在使用的语言的官方文档也是。我在自学时经常做的是,我会在我正在使用的语言的官方文档中搜索与我试图做的事情相关的单词,然后阅读这些文档来理解我想要完成什么。但这里的关键,正如我上面指出的,是你必须真正理解。如果你对编程非常非常陌生,有时只是复制粘贴一些代码而不理解它的作用是可以的。但通常这很快就会让你陷入困境,即使是在你自己的理解方面。你会发现有些事情不起作用,而你完全不知道为什么。
事实上,不理解为什么某些东西坏了是自学编程最令人沮丧的部分之一。我猜这就是大多数人放弃的地方。有些事情不起作用,系统输出一些完全神秘的错误消息,他们不知道如何修复它。这总是,总是因为程序员没有理解关于编程语言、他们正在使用的工具或错误消息中的单词的含义。当你剪切和粘贴了某些东西而没有完全理解你复制的代码中的每个单词和符号时,这种情况最常发生。
现在是的,去学习每个单词和符号的真正含义可能看起来工作量很大,但这就是你学习编程的方式。程序员对社会有价值不仅仅是因为他们知道从哪里以及如何从Stack Overflow复制粘贴东西。他们之所以有价值,是因为他们学习并理解了某些概念,以及如何应用它们。你实际上通过这样做增加了你作为程序员的价值。
然而,在没有任何帮助的情况下尝试完成这个过程仍然常常非常令人沮丧。希望如果你正在这样做,当你完全卡住时,你可以联系到某人,他们可以帮助回答你的问题。我没有这样的人,有时这非常艰难,我会花30个小时盯着一段代码,抓狂地试图理解为什么这该死的东西不起作用。所以如果你有可以交谈的人,这通常比试图自己解决要好,尤其是当你刚刚开始时。有时当你对编程完全陌生时,阅读某个东西的所有文档可能会让人不知所措。有一个指导者,或者至少一个帮手,会有所帮助。
训练营
介于大学培训和自学之间的是"编码训练营”,这是过去几年出现的一种现象,一个组织声称它可以在X周或Y个月内教会人们编程。通常,这些项目实际上提供比大学更好、更实用的教育,尽管其中一些可能不会给你大学培训会给你的理论深度。也就是说,你不会学到那么多编程背后的理论(特别是如何良好编程的基础知识),这些你可能从一些更正式的培训中学到。
作为指导方针,我会这样说:如果一个项目承诺在不到一个月的时间内教你编程,那它可能是垃圾。在那段时间里,你也许可以学习一些Web开发的基础知识,但你永远不可能通过仅仅四周的经验学会成为一名专业程序员。根据我从各种训练营的结果中看到的,获得作为优秀程序员的基本技能是一个至少需要几个月的过程。你可能在几周的课程中获得足够的基础知识,然后可以继续自学剩下的部分,但一个月的编程不会让你变成专业开发人员。
现在,所有这些可能听起来像我对训练营相当失望,成为"真正程序员"的唯一方式是忍受自学的痛苦。然而,没有什么比这更偏离事实了。事实上,我见过从训练营出来的优秀产品。就个人而言,我见过的最好的编程学校如今可能被称为"训练营”,那就是The Tech Academy。他们做得很好,把不知道如何编程的人变成程序员,当人们问我如何编程如果他们不想只是自学时,我总是推荐它。可能还有很多其他不错的训练营。
如果今天我评估一个训练营,我会找出他们的毕业生中有多少人找到了作为专业程序员的好工作,并尝试找到其中一些毕业生,问他们他们的培训与他们实际日常工作的相关性如何。
经验
一旦你通过大学、自学或编码训练营自学了编程的基础知识,在职业方面你能做的最重要的事情之一就是选择一些好的第一经验,这些经验可以帮助你作为软件开发人员成长。
实习
如果你是一名大学生,我强烈建议你利用许多软件公司提供的暑期实习。这是获得在真实软件公司工作的低风险经验的最佳方式。大多数公司实际上会付钱给你,这也是毕业后在那家公司被雇佣的最简单方式。因为他们已经对你有经验,招聘过程要容易得多。
开源
如果有某个开源项目你真的很想参与,试着看看他们需要什么,然后就去工作。通常,开源项目有一个为新来者提供的可用任务列表,你可以挑选一些任务并开始工作。这里的优势是通常没有截止日期,而且通常有一个非常支持性的志愿者社区,他们可以在邮件列表、聊天室等地方回答你的问题。由于大多数开源项目都参与一个叫做"代码审查"的过程,你还会从更资深工程师那里得到关于你代码的反馈,这也会帮助你作为程序员成长。除此之外,在开源中工作提供了你可以向任何雇主展示的工作证据。(当你为公司编写代码时,你通常不能把它带出公司,并作为你是优秀程序员的证据展示给其他未来的潜在雇主。)此外,公司通常喜欢在你的简历上看到开源参与,因为它表明你对编程感兴趣并有热情。
导师制
当你接受第一份程序员工作时,考虑它将为你提供的成为更好程序员的机会。公司是否有更有经验的软件工程师可以帮助你成长,或者它完全由几乎没有专业经验的大学新毕业生组成?公司是否进行代码审查,即你的每个更改都由更资深的工程师审查以帮助你在编程方面变得更好?
也许最重要的是,当你接受一份工作时,确保它是一个关心软件最佳实践的公司。这在软件公司——即主要产品是软件的公司——比其他公司更常见(例如,金融机构雇佣很多程序员,但他们是否深度关心软件质量很大程度上取决于公司甚至你在公司的哪个部分工作)。你更有可能在一个稍微成熟一点的公司,或者至少在一个没有可怕截止日期压力且即将倒闭的公司(比如资金即将耗尽的初创公司)有这种经验。
我并不是说你应该仅仅因为他们可能不是完美的工作公司就拒绝你唯一的offer。但请记住,如果你正在寻找作为程序员的职业和技能成长,你不会通过为讨厌你的产品但无论如何被迫使用它的用户在紧张的截止日期内编写糟糕的代码来获得它。
阅读
网上有很多关于软件最佳实践的内容。也有很多好书。(我甚至写了一些这样的书,如果你正在学习编程,你可能会喜欢。)值得在线阅读各种软件最佳实践,特别是当它们直接与你实际试图解决的某个实际问题相关时。继续阅读书籍、博客、网站等是保持更新的好方法,有时即使它们不直接实用。例如,偶尔我会去阅读一些新的编程语言或某些CPU特性,不是因为它与我在做的事情有任何关系,而是因为它似乎是我作为程序员应该知道的好而有用的信息。
总结
这就是当人们问我如何编程时我通常给出的建议的基础。可能还有其他事情要知道,尤其是我在《为什么程序员很烂》中涵盖的内容。当然,以上所有内容只是一个需要数月或数年才能真正熟练掌握的过程的总结。但希望这能帮助你学习编程,或者为你提供一个资源,当别人问你同样的问题时,你可以发送给他们!
-Max
分享 点击在Facebook上分享(在新窗口中打开) Facebook 点击在LinkedIn上分享(在新窗口中打开) LinkedIn 点击在Hacker News上分享(在新窗口中打开) Hacker News 点击在Reddit上分享(在新窗口中打开) Reddit 点击在Threads上分享(在新窗口中打开) Threads 点击在X上分享(在新窗口中打开) X
3条评论 发表回复
liampulles 说:2018年10月11日上午11:43 有趣的是,你提到制作游戏作为你学习Java的原因,因为我和我的许多开发朋友都有类似的经历。业余游戏开发似乎是进入软件开发的入门毒品。
回复
aiswebdevelopmentcompany 说:2019年4月1日晚上9:33 很有趣的是,你注意到制作游戏作为你学习Java的原因,因为我和我的许多开发朋友都有类似的经历。业余游戏开发似乎是进入编程开发的门户毒品。你可以查看我的网站了解更多详情:https://www.aistechnolabs.com/bingo-software
回复
Tyrel Graham 说:2019年5月24日上午7:36 这是一篇有帮助和有用的阅读,因为我刚刚开始我的初级php开发人员职业生涯。
回复 发表回复取消回复
联系 关于 书:理解软件 书:代码简洁性
输入您的电子邮件… 订阅
Max Kanat-Alexander 6月27日 我目前认为,AI代理可以成功输出的数量和质量取决于:
- 模型的质量。
- 代理的质量。
- 输入的质量(如提示或其他上下文)。
- 代理可以独立运行的确定性、客观验证的质量。
我目前认为,除非你是模型开发者,否则最重要的部分是"确定性、客观验证”。
简单来说,如果你告诉AI做某事,它需要某种方式能够自己验证它做了正确的事情。在软件中,这通常意味着运行测试、linter等,如果系统做了错误的事情就会失败。
这意味着你的测试和验证工具越好,你从模型得到的输出就越好。这不仅仅是测试数量的问题。它们必须是好的测试,具有智能断言和良好的错误消息。
这也意味着代理的成功涉及思考如何将任务分解成可以分别通过自动化测试、linter等进行客观验证的单个部分。
作为说明,输入的质量也很重要并且在我们的控制之下。如果我们编写更好的文档和更清晰的代码,代理会做得更好。令人惊讶的是,几乎一切帮助人类编写代码的东西也帮助代理。
阅读更多2010分享
Max Kanat-Alexander 6月4日 技术债务有价值的想法大多是一个神话。当你做出一个糟糕的软件工程决策时,它会在几小时、几天或几周内减慢你的速度。那是上限。许多人认为需要数月或数年才能看到在软件设计上偷工减料的影响,但这根本不对。它几乎立即开始。做正确的事情的成本通常是几个小时,也许一天,你几乎总是立即收回那个时间。也就是说,做对通常最终花费的时间与做错所花费的时间相同。“等等,什么?这怎么可能?我们偷工减料是为了节省时间!“结果几乎总是它根本不会为你节省时间!它使处理变更更加混乱。它使代码审查时间更长。它在测试期间以更混乱的方式失败,需要更长时间来调试。它几乎从未为你节省实际时间。
偶尔,你的路径上会有一些如此巨大的"岩石”,你根本无法移动它。没有人应该花三个月设计一个新工具,只是为了你可以一次性地交付一个一天的功能。但那是技术债务决策中极小极小的一部分。
这变得更加疯狂,因为如果你在过程中做对一切(你总是重构系统,使其看起来像是被设计成现在所做的 exactly),那么一切在整个过程中都保持相对容易。但如果你偷工减料,一切都会变得复合性地更加困难,以至于你生成没有人能移动的"岩石”。复杂性不是某种线性的东西,你可以后来投入线性时间修复。你绝对可以让自己陷入一种如此糟糕的境地,以至于你公司中没有人有时间或专业知识来修复它。
这一切感觉如此无辜:“让我们偷工减料吧,它将帮助我们满足这个截止日期”(一个通常是想像的截止日期,你可以推迟几周而没有任何后果)。“很难弄清楚如何正确做这个,我们可以推迟它吗?“然后砰,很快你发现自己陷入了一个沼泽,一切都很难,而且"我们不知道为什么!”
我最后给你一件事:当我直接编码我生活的每一天时,我在这方面完全 uncompromising。我基本上无法看糟糕的代码——我必须重构它,否则我无法工作。不知何故,在我整个职业生涯的那部分中,我从未错过一个截止日期。
阅读更多9342分享
Max Kanat-Alexander 5月30日 我估计,在我看到或被告知的每一万条坏建议中,我收到过一条好建议。互联网充满了坏建议,因为文明充满了坏建议。文明充满了坏建议,因为全球的教育大多不教人们思考、研究或确定什么是真实的。相反,它教人们记忆和重复事实,其中大多数是不重要、不真实或无用的。
所以总的来说,我们不应该对互联网(尤其是社交媒体)充满了不重要、不真实或无用的信息感到惊讶。并非全部如此——我在网上学到了大量非常有用的东西。有大量有价值的内容。我会说,人们对事物的意见,无论是在报纸、博客文章、论坛还是其他什么地方,很少具有那种价值。
那么,要点是什么?嗯,最好有某种方式在开始依赖某事或向他人重复之前确定它是否重要或有用的。最简单的工具是说:“它有效吗?“这条数据是否可靠地帮助你完成某事