作者: iflab
如何创建您的第一个Hugo博客:实用指南
https://www.freecodecamp.org/news/your-first-hugo-blog-a-practical-guide/
如果您想创建博客,Hugo是一个很好的工具。
我本人在博客flaviocopes.com上使用Hugo ,并且已经使用了两年多。我有几个爱雨果的理由。
首先,它简单,无聊,灵活且快速。
主要原因是它很简单。您不需要学习太多的入门知识。
您以Markdown编写内容,这种格式可以让我使用喜欢的编辑器(Bear)编写帖子。
雨果很无聊。不要误会我的意思,这是非常积极的事情。作为开发人员,我很想一直在这里和那里进行调整。雨果没有花哨的技术。它是使用Go(我最喜欢的一种语言)构建的,但这并不意味着我想深入Hugo的内部并改变其工作方式。
而且它不会像许多JavaScript框架那样出现任何酷的或下一代的东西。
因此,这很无聊,这给了我很多时间去做博客上真正有用的事情:编写内容。我专注于内容,而不是内容容器。
就是说,雨果相当灵活。我以开源主题开始了自己的博客,然后随着时间的推移完全对其进行了更改。有时我想在网站上做超出简单博客范围之内的事情,而Hugo允许我创建这些事情。
最后,我爱雨果的另一个原因是它速度很快。为什么?首先,它以Go为核心,这是一种非常快速的语言。在Go生态系统中,没有100 MB依赖性的概念。事情要尽可能快。另外,Hugo不需要执行使用高级技术时所需的一些高级工作。这是无聊的副产品。
无论如何,用言语就足够了。
Hugo很棒,特别是如果您是开发人员并且愿意用Markdown编写。非技术人员可能只是拒绝使用Markdown,这是完全可以理解的。
另外,您还必须为以Git为中心的工作流程做好准备,以使事情真正发生点击。
这是写博客的过程:
- 使用Markdown撰写文章,
- 然后将您的更改提交到Git存储库(通常在GitHub上),
- 然后一些粘合技术将所做的更改部署在托管站点的服务器上。
托管雨果网站
一个雨果博客是完全静态的。这意味着您不需要托管自己的服务器,也无需为其使用特殊服务。
Netlify,Now和GitHub Pages是您可以免费托管Hugo博客的三个好地方。
唯一的成本就是您必须维持的域名成本。我不能太过强调拥有自己的域名的重要性。没有.github.io
或.netlify.com
或.now.sh
网站,请。
我自己的Hugo网站托管在Netlify上。
选择一个域
将您的博客放在您自己的域下。选一个。使用您自己的名字。并使用.com
或.blog
。不要通过使用本地化域来变得聪明-例如,不要使用.io
。.com
只会给人留下更好的印象,并且可用于您以后的所有项目,而不仅仅是托管您的博客。我选了那个。
哦,如果您周围有旧域名,请使用它。为什么?您的域越旧越好。
关于子域的注意事项:对于Google而言,每个子域都是一个不同的网站。因此,如果您的域名是flaviocopes.com
,并且您在中创建了博客blog.flaviocopes.com
,那么对于Google来说,这是一个全新的网站,它将拥有与主要域名不同的排名。
我的建议是完全避免子域。
安装雨果
要在macOS上安装Hugo,请从终端运行
brew install hugo
brew
您的Mac上不存在该命令?查看Homebrew指南。
对于Windows和Linux,请查看官方安装指南。
创建一个雨果网站
安装Hugo后,您可以通过运行以下命令创建一个Hugo网站
hugo new site myblog
我建议您将其运行到www
主目录中的文件夹中,因为该命令将myblog
在运行它的位置创建一个新文件夹。

选择一个主题
现在,在您可以开始之前,您需要选择一个主题。我希望Hugo包含一个默认主题以使事情变得简单,但事实并非如此。
https://themes.gohugo.io上有很多选择。我个人的建议是从https://themes.gohugo.io/ghostwriter/开始,然后进行调整。
我还建议您避免git clone
他们在该页面上建议的工作流程。您肯定会在将来调整主题,而我发现最好为内容和主题有一个单一的存储库。它简化了部署。
因此,请转到https://github.com/jbub/ghostwriter/archive/master.zip下载主题的当前版本。
然后将其解压缩到themes/ghostwriter
新创建的Hugo网站的文件夹中:

请注意,中有一个exampleSite
文件夹themes/ghostwriter
。打开它,然后打开其content
子文件夹。在那里,你可以看到page
,post
和project
子文件夹。

复制page
并post
在content
网站的文件夹中:

配置
样本数据还在中提供了一个样本config.toml
文件themes/ghostwriter/exampleSite/config.toml
。这是Hugo的配置文件,它告诉Hugo某些配置细节,而无需在主题中硬编码信息。
我建议您不要复制它,因为它有太多东西,而应使用以下命令:
baseurl = "/"
title = "My blog"
theme = "ghostwriter"
[Params]
mainSections = ["post"]
intro = true
headline = "My headline"
description = "My description"
github = "https://github.com/XXX"
twitter = "https://twitter.com/XXX"
email = "[email protected]"
opengraph = true
shareTwitter = true
dateFormat = "Mon, Jan 2, 2006"
[Permalinks]
post = "/:filename/"
您以后可以自由自定义此文件中的信息。
现在从命令行运行:
hugo serve

http://localhost:1313
在浏览器中打开,您应该可以实时看到该网站!

这是网站主页。
以下是从content/post
您的网站文件夹中获取的帖子列表:

单击第一个,即“创建新主题”:

您可以打开文件content/post/creating-a-new-theme.md
以更改帖子中的任何内容。

如果保存,网站将自动更新为新内容。

太棒了吧?
您可以通过创建一个新.md
文件来创建新帖子,并在文件中添加所需的前缀。如果愿意,可以使用增量数字。或使用日期。
如果某些内容看起来不理想,可以打开该themes/ghostwriter/layouts
文件夹并进行调整。
“发布”模板的定义themes/ghostwriter/layouts/post/single.html
如下:

Hugo使用Go模板。语法可能不熟悉,但是Hugo网站在此Go模板介绍中对它们的解释非常出色。
但是,请尝试不要立即考虑自定义模板。
如果要调整颜色,请在中添加<style>
带有CSS 的标签themes/ghostwriter/layouts/partials/header.html
。
例如,将链接设为黑色:
<style>
.site-title a, .button-square {
background: black;
}
a {
color: black;
}
</style>
专注于内容。
删除现有文件,并开始撰写2-3个帖子。
被困于以您想要的方式完美地制作事物太容易了,但重要的是内容。
而且您的网站越干净,对您的读者越好。
现在让我写一些有关部署的知识。
将Hugo网站部署到Netlify
我想展示如何在我最喜欢的两项服务中部署Hugo网站:Netlify和Now。
首先,我将创建一个GitHub存储库来托管该站点。
我打开GitHub Desktop,这是我每天使用的应用程序,它是我工作流程的一部分。这是使用Git的最简单方法。
从“文件”菜单中,按下“新存储库”选项:

只需将myblog
文件夹拖动到应用程序中即可生成同一屏幕。
我给myblog
存储库起了名字,并为仓库选择了正确的路径。
该过程将自动进行第一次提交:

现在,我们可以单击“发布存储库”按钮将存储库推送到GitHub:

当然,您可以将存储库设为私有。
一旦仓库位于GitHub中:

我们可以转到Netlify。
在Netlify仪表板中,我按下了“来自Git的新站点”按钮:

我按下GitHub,授权Netlify访问我的私有存储库,然后选择了刚创建的存储库:

Netlify自动将其标识为Hugo存储库,并自动输入build命令:

单击“部署站点”开始部署过程:

在实际站点上,我将设置一个自定义域。Netlify可以选择通过它们购买域名,这是一个非常非常简单的过程。我强烈推荐它。购买域名后,该网站仅需几分钟即可上线。
.netlify.com
在此情况下pedantic-engelbart-500c9a.netlify.com
,站点将附加一个随机子域,并自动启用HTTPS。
因此,我们可以立即看到该站点:

现在,如果您尝试编辑本地版本中的内容,只需将更改推送到GitHub,Netlify就会自动更新站点。您可以在网站的“概述”面板中看到它正在构建网站:

要了解有关Netlify的更多信息,建议您阅读我的Netlify教程。
将Hugo网站部署到Zeit Now
您可以在Hugo博客上使用的另一个出色平台是Zeit Now。

注册后,从仪表板中按“ 新建项目”按钮。

首次从GitHub部署时,必须先通过单击“立即为GitHub安装”来安装GitHub应用程序:

这会将您带到该应用程序的GitHub页面,您可以在其中为所有存储库或仅对某些存储库进行授权:

返回后,单击“来自GitHub的新项目”按钮:

选择项目,然后单击“导入”:

同时,进入的主文件夹mysite
并添加package.json
具有以下内容的文件:
{
"scripts": {
"build": "hugo"
}
}
现在,这将告诉您如何部署站点。
回到仪表板后,新的部署应很快开始,您将看到该站点正在运行:


请注意,在“现在”中,您可以使用三个URL来访问站点:
myblog.flaviocopes.now.sh
myblog-alpha-swart.now.sh
myblog-git-master.flaviocopes.now.sh
您可以选择自己喜欢的一种。
另外,每个部署也都有自己的URL。在这种情况下,我有,myblog-h8xks5jhn.now.sh
但是每次部署都会改变。
当然,您也可以添加域。Zeit提供了一项很棒的服务,可以直接从他们那里购买您的域名,网址为https://zeit.co/domains。
而且,如果您更喜欢使用命令行,该now
命令也可以让您从那里购买域名。
我强烈建议您查看我的Zeit Now教程,以了解有关此平台的更多信息。
包起来
我希望本教程可以给您一些指导,如果您打算开始一个新博客。Hugo是我最喜欢的平台,但是它并不是唯一的平台。Ghost(支持freeCodeCamp的平台)也很棒,当然还有WordPress和Gatsby。
选择你喜欢的。我认为平台与您的内容无关紧要。因此,选择一个并开始写作!
持续集成与持续部署之间的真正区别
https://www.freecodecamp.org/news/the-real-difference-between-ci-and-cd/
有很多内容描述什么是持续集成,持续交付和持续部署。但是这些过程首先要达到什么目的?
了解正确使用CI和CD所解决的问题至关重要。这将使您的团队可以改善您的流程,避免花费精力去追求那些不会给您的流程带来任何价值的幻想指标。
持续集成是团队问题
如果您在团队中工作,则可能有多个开发人员在同一个存储库中工作。存储库中有一个主分支,其中载有最新版本的代码。开发人员在不同分支上从事不同的工作。变更完成后,他们会将其推送或合并到主分支。最终,整个团队将拉动这一变化。
我们要避免的情况是错误的提交使其进入主分支。错误意味着代码无法编译或应用程序无法启动或无法使用。为什么?不是因为应用程序损坏了,还是因为所有测试必须始终为绿色。这不是问题,您可以决定不部署该版本,然后等待修复。
问题是您的整个团队都陷入了困境。所有提出错误提交的开发人员都将花费5分钟来思考为什么它不起作用。有些人可能会尝试查找错误的提交。有些人会尝试与有问题的代码作者并行解决问题。
这对您的团队来说是浪费时间。最糟糕的是,重复发生的事件加剧了对主分支机构的不信任,并鼓励开发人员分开工作。
持续集成就是为了防止主分支中断,从而使您的团队不会陷入困境。而已。这并不是要让所有测试始终保持绿色并且主分支在每次提交时都可以部署到生产中。
持续集成的过程独立于任何工具。您可以手动验证分支和主分支的合并在本地是否有效,然后仅将合并实际推送到存储库。但这将是非常低效的。这就是为什么使用自动检查实现持续集成的原因。
检查确保至少:
- 该应用程序应构建并启动
- 最关键的功能应始终保持工作状态(用户注册/登录过程以及关键的业务功能)
- 所有开发人员都依赖的应用程序通用层应该是稳定的。这意味着对这些零件进行单元测试。
实际上,这意味着您需要提取适用于您的任何单元测试框架并保护应用程序的公共层。有时,代码不是很多,可以很快完成。另外,您还需要添加“烟雾测试”以验证代码是否已编译以及应用程序是否启动。这对于具有疯狂依赖注入的技术(例如Java Spring或.NET core)尤其重要。在大型项目中,很容易误连接依赖项,因此必须验证该应用程序始终启动。
如果您有成百上千的测试,则不需要为每个合并运行所有测试。这将花费大量时间,并且大多数测试可能会验证“非团队阻止者”功能。
我们将在接下来的部分中看到连续交付的过程将如何充分利用这许多测试。
与工具无关
工具和自动检查都可以。但是,如果您的开发人员仅合并他们工作了数周的巨型分支机构,那么他们将无济于事。团队将花费大量时间合并分支,并修复最终会出现的代码不兼容问题。与错误的提交阻塞在一起一样浪费时间。
持续集成与工具无关。这是关于小块工作并将新代码集成到主分支并频繁提取的问题。
通常至少每天一次。将您正在处理的任务拆分为较小的任务。经常合并您的代码,并经常提取。这样一来,没有人能分开工作超过一两天,问题就没有时间滚雪球了。
一项大型任务不需要全部都在一个分支中。应该永远不会。将进行中的工作合并到主分支的技术称为“抽象分支”和“功能切换”。有关 更多详细信息,请参见博客文章“ 如何开始进行持续集成 ”。
优质CI的关键点
非常简单。保持简短。最多3-7分钟。这与CPU和资源无关。这与开发人员的生产力有关。生产力的首要规则是专注。做一件事,完成它,然后移到下一件事。
上下文切换成本很高。研究表明,当您被打扰时,大约需要23分钟才能重新专注于某件事。
想象一下,您推动分支进行合并。您开始另一个任务。您花了15到20分钟才能进入。在您进入区域后的一分钟,您会从20分钟长的CI构建中收到针对先前任务的“构建失败”通知。您回来修复它。您再次推动它。您来回走动很容易超过20分钟。
每天一次或两次将20分钟乘以团队中开发人员的数量……这是浪费了很多宝贵的时间。
现在,假设反馈是否在3分钟内到来。您可能根本不会启动新任务。您将有证据再次阅读您的代码,或者在等待时检查PR。失败的通知将到来,您将对其进行修复。然后,您可以继续执行下一个任务。这就是您的流程应启用的重点。
保持CI的构建时间短,这是一个折衷方案。在CI范围内运行时间更长或几乎没有价值的测试应移至CD步骤。是的,那里的故障也需要修复。但是,由于它们不会阻止任何人做他们的事情,因此您可以在完成工作后将这些修补程序作为“下一项任务”来处理。只需在工作时关闭通知,然后不时检查一下即可。保持上下文切换到最小。
持续交付和部署是工程问题
让我们解决一下定义,以消除这些障碍。
持续交付是指能够随时部署任何版本的代码。实际上,它是指代码的最新版本。您不会自动部署,通常是因为您不必或不受项目生命周期的限制。但是只要有人愿意,就可以在最短的时间内完成部署。有人可以成为想要在暂存或预生产环境中进行测试的测试/ QA团队。或者实际上可能是时候将代码推广到生产中了。
连续交付的想法是准备与您要在环境中运行的项目尽可能接近的工件。如果使用Java,则可以是.jar或.war文件;如果使用.NET,则可以是可执行文件。它们也可以是已转译的JS代码的文件夹,甚至是Docker容器的文件夹,无论使部署变得更短(即,您已经预先构建了尽可能多的内容)。
通过准备工件,我并不是要把代码变成工件。这通常是一些脚本和执行时间。准备方式:
运行您可以执行的所有测试,以确保代码一旦部署便可以正常工作。如果可以自动执行单元测试,集成测试,端到端测试,甚至性能测试。
这样,您可以过滤主分支的哪些版本实际上已准备好生产,哪些尚未准备就绪。理想的测试套件:
- 确保应用程序的关键功能正常运行。理想情况下,所有功能
- 确保没有引入任何性能破坏因素,因此当您的新版本受到众多用户的欢迎时,它就有机会持久
- 空运行您的代码所需的任何数据库更新,以免出现意外
它不需要非常快。30分钟或1小时是可以接受的。
持续部署是下一步。您将最新和生产就绪版本的代码部署到某些环境。如果您对CD测试套件足够信任,则是理想的生产方式。
请注意,根据上下文,这并非总是可能或值得付出。连续交付通常足以提高工作效率,尤其是当您在封闭的网络中工作并且可以部署的环境有限时。也可能是软件的发布周期阻止了计划外的部署。
持续交付和持续部署(从现在起将它们称为CD)不是团队问题。他们的目的是在执行时间,维护工作和测试套件的相关性之间找到适当的平衡,以便能够说“此版本可以正常工作”。
这是一个平衡。如果您的测试持续30个小时,那就有问题了。有关Oracle数据库测试套件的外观,请参见这篇史诗般的帖子。但是,如果您花费大量时间使测试与最新代码保持同步,那会阻碍团队的进步,那也不是一件好事。另外,如果您的测试套件几乎没有任何保证,那基本上是没有用的。
在理想的世界中,我们每次提交到主分支都需要一组可部署的工件。您可以看到我们有一个垂直的可伸缩性问题:我们从代码移到工件的速度越快,我们就越准备好部署最新版本的代码。
有什么大不同?
持续集成是一个水平可伸缩性问题。您希望开发人员经常合并其代码,因此检查必须快速。理想情况下,几分钟之内就可以避免开发人员始终通过CI版本的高度异步反馈来切换上下文。
您拥有的开发人员越多,则在所有活动分支上运行简单检查(构建和测试)所需的计算能力就越高。
良好的CI构建:
确保没有将破坏基本内容并阻止其他团队成员工作的代码引入主分支,并且
足够快,可以在几分钟内向开发人员提供反馈,以防止任务之间进行上下文切换。
持续交付和部署是垂直可伸缩性问题。您需要执行一个相当复杂的操作。
好的CD版本:
确保尽可能多的功能正常运行。
速度越快越好,但这不是速度问题。30至60分钟的构建就可以了。
一个常见的误解是将CD视为诸如CI之类的水平可伸缩性问题:从代码到工件的迁移速度越快,实际处理的提交越多,就越接近理想的情况。
但是我们不需要。为每次提交尽可能快地生成工件通常是过大的。您可以尽最大的努力很好地使用CD:只有一个CD构建,它将在给定构建完成后立即选择最新提交进行验证。
毫无疑问CD。真的很难。获得足够的测试信心才能说您的软件已准备好自动部署,通常可以在诸如API或简单UI之类的底层应用程序上使用。在复杂的UI或大型整体系统上很难实现。
结论
用于执行CI和CD的工具和原理通常非常相似。但是目标是非常不同的。
持续集成是在开发人员反馈回路的速度与您执行的检查(构建和测试)的相关性之间做出的折衷。没有任何妨碍团队进步的代码可以进入主分支。
持续交付部署是要进行全面检查,以发现代码问题。检查的完整性是最重要的因素。通常以测试的代码覆盖率或功能覆盖率来衡量。尽早发现错误可以防止将损坏的代码部署到任何环境,并节省测试团队的宝贵时间。
精心设计CI和CD版本以实现这些目标并保持团队的生产力。没有工作流程是完美的。问题会时不时地出现。每次使用它们时,都可以将其作为学习的经验教训来加强您的工作流程。
发表于2019年11月27日在Fire CI博客上。
最好的Python教程
https://www.freecodecamp.org/news/best-python-tutorial/
Python是一种通用的编程语言,可以动态键入,解释并以其易于阅读的设计原理而闻名。
freeCodeCamp拥有最流行的Python课程之一。它是完全免费的(甚至没有任何广告)。您可以在YouTube上观看它。
想了解更多?
网络是一个很大的地方,还有很多值得探索的地方:
- Python实践手册:http://anandology.com/python-practice-book/index.html
- Think Python:http://greenteapress.com/thinkpython/html/index.html
- 实用的业务Python:http://pbpython.com/
- 另一门课程:https ://realpython.com/?utm source = fsp&utm medium = promo&utm_campaign = bestresources
- 常规:https://www.fullstackpython.com/
- 学习基础知识:https://www.codecademy.com/learn/learn-python
- 使用Python的计算机科学:https : //www.edx.org/course/introduction-computer-science-mitx-6-00-1x-11? ref =hackernoon#!
- 用于学习python的更多资源列表:https : //github.com/vinta/awesome-python
- 互动Python:http://interactivepython.org/runestone/static/thinkcspy/index.html
- Python开发人员指南:https://devguide.python.org/
Python的用途是什么?
Python可以轻松地用于小型,大型,在线和离线项目。利用Python的最佳选择是Web开发,简单的脚本编写和数据分析。以下是Python可以帮助您完成的一些示例:
Web开发:
您可以使用Python创建许多复杂级别的Web应用程序。有许多出色的Python Web框架,包括Pyramid,Django和Flask等。
数据分析:
Python是许多数据科学家的首选首选语言。由于许多专注于数据科学的优秀库(其中NumPy和Pandas是最著名的两个)和数据可视化(如Matplotlib和Seaborn),Python在该领域变得越来越流行。Pyton的所有可用库确实使数据处理变得有趣。具有JupyterLab的Ipython是另一种Python形式,可改善Python在数据科学领域的使用。
自动化:
Python是一种非常灵活的语言,可用于自动执行无聊或重复的任务。系统管理员通常通过编写可从终端轻松执行的脚本来使用它。Python也可以用来创建自动执行我们日常任务的机器人。
人工智能:
Python在不断增长的人工智能(AI)领域中也得到广泛使用。Google选择Python作为使用Tensorflow训练模型并与模型进行交互的首批受支持的编程语言之一。
移动应用开发
可以使用Kivy,Pygame和PyQt使用python创建移动应用和游戏。
安全和网络:
Python用于构建广泛使用的网络工具和安全工具。Python的远程自动化是最安全,快速和高效的框架云测试。这就是为什么专业开发人员使用python来制作最安全的框架和进行套接字编程的原因。
机器学习,深度学习
Python是适用于机器学习,深度学习和数据分析的最佳语言之一,在所有语言中都有据点。
有最适合各种角色(例如R和MATLAB)的专用语言,但是当涉及到应用程序的重叠领域时,python因其灵活性,快速原型设计和库的可用性而脱颖而出。
电报机器人开发
您可以使用Python和一些Python库来开发自己的Telegram Bots。
通过抓取和抓取来收集数据
Python还可以用于解析页面的源代码并检索其数据。使用一些python模块,例如Scrapy和Selenium(对于某些使用javascript的页面)也可以解决问题!
Python通常用于
- 网络与互联网发展
- 教育进步
- 科学研究/计算
- 桌面开发
- 数值计算
- 软件开发
- 业务应用开发
- 机器学习
- 物联网
- 游戏开发
- 快速成型
- 浏览器自动化
- 数据分析
- 从网站抓取数据
- 图像处理
一些有关python可用性的文章
python的官方软件包索引在这里。
您应该使用Python 2还是Python 3?
这两个版本相似。如果您知道一个,就很容易切换到用另一种编写代码。
- 2020年后将不再维护Python2.x。
- 3.x正在积极开发中。例如,这意味着所有最新的标准库改进仅在Python 3.x中默认可用。
- 多年来,Python生态系统已经积累了大量的优质软件。在3.x中破坏向后兼容性的不利之处在于某些软件(尤其是公司内部的软件)仍无法在3.x上运行。
安装
大多数基于* nix的操作系统都安装了Python(通常是Python 2,最新版本是Python 3)。不建议更换系统Python,这可能会导致问题。但是,可以将不同版本的Python与系统Python一起安全地安装。请参阅Python设置和用法。
Windows并未随附Python,但可以在此处找到安装程序和说明。
Python解释器
Python解释器是用于运行Python脚本的工具。
如果可用并且在Unix shell的搜索路径中,可以通过键入命令python
后跟脚本名称来启动它。这将调用解释器并运行脚本。
hello_campers.py
print('Hello campers!')
从终端:
$ python hello_campers.py
Hello campers!
当安装了多个版本的Python时,取决于安装配置,可以按版本调用它们。在Cloud9 IDE定制环境中,可以像这样调用它们:
$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ python3.5 --version
Python 3.5.1
$ python3.6 --version
Python 3.6.2
$ python3.7 --version
Python 3.7.1
Python解释器互动模式
可以通过带-i
标志或不带任何参数的Python解释器来启动交互模式。
交互模式提示您可以输入和运行Python命令:
$ python3.5
Python 3.5.1 (default, Dec 18 2015, 00:00:00)
GCC 4.8.4 on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello campers!")
Hello campers!
>>> 1 + 2
3
>>> exit()
$
Python的禅宗
一些影响Python设计的原理作为复活节彩蛋包含在内,可以通过使用Python解释器交互模式内的命令来读取:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Python的优缺点
优点
- 带有模块的交互式语言几乎支持所有功能。
- 开源:因此,您可以为社区,为将来使用而开发的功能以及对他人的帮助做出贡献
- 很多优秀的口译员和笔记本都可以提供更好的体验,例如jupyter notebook。
缺点
- 作为开源,多年来为相同功能开发了许多不同的方法。有时,这会使其他人无法阅读别人的代码。
- 这是一种慢语言。因此,用于开发通用算法是一种非常糟糕的语言。
文献资料
Python有据可查。这些文档包括语言的教程,指南,参考和元信息。
另一个重要参考是Python增强建议(PEP)。PEP中包含用于编写Python代码的样式指南PEP 8
。
调试
内联print
语句可用于简单调试:
…通常,调试程序的最快方法是在源代码中添加一些打印语句:快速的edit-test-debug周期使这种简单的方法非常有效。
Python还包括更强大的调试工具,例如:
请注意,这些暂时存在。
你好,世界!
回到文档,我们可以阅读有关该print
功能的信息,该功能是Python标准库的内置功能。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
内置功能按字母顺序列出。名称后面是带括号的形式参数列表,带有可选的默认值。在此之下是对该函数及其参数的简短描述,并且偶尔会有一个示例。
print
Python 3中的函数取代了print
Python 2中的语句。
>>> print("Hello world!")
Hello world!
当函数名称后跟时,将调用该函数()
。对于世界你好!例如,使用字符串作为第一个参数的参数调用打印函数。对于其余参数,将使用默认值。
我们使用该print
函数调用的参数是str
对象或字符串,这是Python的内置类型之一。另外,关于python的最重要的事情是,您不必在声明变量时指定数据类型。python的编译器将根据分配的值的类型自行执行此操作。
该objects
参数以a开头*
,表示该函数将对该参数采用任意数量的参数。
最好的Linux教程
https://www.freecodecamp.org/news/the-best-linux-tutorials/
Linux的名称广泛地表示围绕Linux内核构建的一系列免费和开源软件操作系统发行版。
Linux发行版的定义组件是Linux内核,它是Linus Torvalds于1991年9月17日首次发布的操作系统内核。
许多Linux发行版的名称中都使用“ Linux”一词。自由软件基金会使用名称GNU / Linux来指代操作系统家族以及特定的发行版,以强调大多数Linux发行版不仅是Linux内核,而且不仅具有内核,而且还具有共同点。许多实用程序和库,其中很大一部分来自GNU项目。
Linux的开发是自由和开源软件协作的最杰出的例子之一。任何人都可以根据其各自的许可(例如GNU通用公共许可)的条款,以商业或非商业方式使用,修改和分发基础源代码。
Linux最初是作为MINIX操作系统的克隆而启动的。开源贡献者添加到内核并扩展了其硬件兼容性。Linux的硬件支持和免费许可使Linux在90年代中期成为台式机和服务器计算的流行选择。今天,Linux是世界上最受欢迎的操作系统。它为全球90%的服务器提供动力,并且是Google流行的Android操作系统的基础。
还有许多设计用于在个人计算机上运行的Linux版本,例如Debian或Ubuntu。更重要的是,这些不同版本的Linux(称为发行版)允许用户对操作系统进行不同程度的个性化和控制。这意味着用户可以根据自己的需求选择他们的Linux发行版。
还有Kali Linux,用于高级渗透测试和审计。它有700多种工具,要想有效地使用它,您将需要知道如何使用命令行。不建议初学者使用。
Linux的流行发行版包括:
- 的Ubuntu
- Linux Mint
- CentOS的
- RHEL
- Arch Linux
软件包类型在更高级别的发行版之间划分,其中Debian(.deb)和Red Hat(.rpm)是最常用的两种。但是,还有其他一些,包括Pacman(用于Arch Linux)和PetGet(Puppy Linux)。
Linux发行版也有各种形状和大小,并且大多数(如果不是全部)都提供了在所谓的“ Live CD”环境中直接通过CD / DVD运行的功能,如果主板支持从USB引导,甚至可以直接通过USB运行。
有关Linux的更多信息,请阅读freeCodeCamp创始人Quincy Larson的文章 Linux is 25。让我们用有关Linux的25个令人震惊的事实来庆祝。
一些最好的Linux教程
您可以观看此命令行崩溃课程,其中涵盖了许多最常见的命令。
或Briana的Bash教程,其中涵盖了各种命令行工具和命令。

Linux的一些优点
持续有效的改进。
Linux更新是通过开发人员的全球协作进行的。通过这种类型的支持,可以更快地记录和解决错误。此外,由于开发人员也是最终用户,因此他们有适当的动力来确保它可以满足用户的需求,并确保其运行良好。
风险较小。
软件仅与所提供的支持一样好。想象一下:一个软件是由XYZ公司创建的,后来又破产了,或者被决定削减支持的另一家公司收购。该软件永远不会看到改进或修正,因此其实用性将不可避免地被侵蚀和消亡。
Linux并非由单个实体或公司所有和运营,因此这种情况不会发生。除此之外,任何人都可以自由选择它并做出贡献。由于其压倒性的普及和使用,失去对Linux的支持的风险极小。
轻巧。
Linux在系统上运行的要求远低于Windows或Mac。使用正确的Linux发行版,用户可以进行适当的设置,而Linux将为您提供系统价值。磁盘空间和内存占用空间也可以更低。有些发行版适用于可追溯到Pentium系列的CPU,另一些发行版仅需要128MB的RAM,而磁盘空间却差不多!
大量文档供初学者和高级用户使用。
Linux的社区活跃,愿意分享他们的知识和帮助(就像FreeCodeCamp!一样)。Linux内置有命令行实用程序,可提供有关命令,库,标准等的文档(手册页和信息页),Internet上有多种格式的文档,包括Linux文档计划,LinuxQuestions,ServerFault和The Arch Wiki。
除了文档之外,还有许多有用且欢迎的社区,供新手提出诸如Ask Ubuntu和Reddit的r / linuxquestions之类的问题。
可以采取在IT行业中认可的自定进度的证书(CompTIA的Linux +和LPI的LPIC测试)。尽管不是必需的,但学习C可以使用户查看Linux代码以查看其运行情况。
贸易支持。
世界依赖于Linux支持关键系统,因此需求不会消失。这不仅对那些有助于Linux的人很重要,而且对支持Linux的人也很重要(工作!)。Linux支持在IT中变得越来越重要,但作为开发人员,也要具备这些知识,这将使他们更加全面和有用(即Full stack开发人员)。
与其他操作系统的互操作性。
Linux对NTFS和HFS +文件系统(由Windows和Mac使用)提供驱动程序支持,还对Windows计算机上的文件/打印服务支持提供Samba。
更好的硬件支持。
对于其他操作系统,通常用户必须访问制造商的网站以获取针对不同类型硬件的驱动程序支持。Linux内核通过即插即用功能自动支持大多数硬件(很大程度上是由于开源社区)。一些制造商还开发了其专有驱动程序的Linux版本,可以通过发行版的软件存储库或手动安装提供的二进制文件轻松地安装它们。
软件可用性/兼容性。
Linux具有丰富的可用应用程序集。它具有办公应用程序,Web浏览器(Google Chrome和Mozilla Firefox),媒体播放器,图像 / 视频处理等。对于视频游戏,Steam在具有许多受支持游戏的Linux上运行。Windows应用程序也可以在Linux中运行(有关详细信息,请参见Wine)。
为发展而建。
由于Linux最初是由开发人员为开发人员开发的,因此他们花费了大量的时间和精力来完善将要使用的工具。
它具有功能强大的外壳程序,可用于各种编程和管理任务(Bash是Linux上最受欢迎和默认的选择)。
尽管Linux在gedit中具有等效的“记事本” ,但它还提供了更强大和可自定义的基于文本的编辑器,例如Vim和Emacs(建议Linux用户至少知道这些编辑器之一)。
还有一些可用于Web开发的IDE,例如Atom,Aptana / Eclipse,Sublime,KomodoIDE等。Linux还可以利用Apache之类的软件来设置用于测试的本地Web服务器,用于版本控制的Git,以及诸如Node.js / Ruby / SaSS / Heroku之类的其他工具/语言都对Linux有所支持,并且具有可以用于代替GUI。
可定制
Linux允许用户更改桌面设计和主题,添加小部件等。这些更改可以在桌面环境中完成。不同的环境具有不同的选项集。一些流行的是:KDE,GNOME,XFCE,万神殿。
免费。
很难击败!
Linux入门
选择发行版
如今,有多种类型的Linux发行版可供选择,而选择发行版是Linux世界中的主要关注点。考虑到易于使用的操作系统,该类别中排名第一的是:
- Ubuntu-稳定的Debian系统的衍生产品,Ubuntu在易于使用和最新的环境中蓬勃发展。
- Mint-基于Ubuntu和Debian,此操作系统具有强大的功能,例如Ubuntu的PPA兼容性,apt软件包管理器。基本的薄荷发行版使您想起Windows,对于来自Windows的用户而言,这可能是一个不错的特性。
- Trisquel-从Ubuntu衍生的发行版,专注于仅使用完全免费的软件,避免使用专有软件。Trisquel得到了自由软件基金会(FSF)的认可。
正在安装
大多数Linux发行版都非常易于安装,因为所有信息都在安装的每个步骤之间显示。
要确定的重要一步是确定新Linux发行版的安装位置。对于初次使用的用户,最好选择“引导”选项,因为它将为您完成所有工作。
记住要仔细阅读所有步骤,并在硬盘中为新发行版留一些空间-我说最小30Gb是一个不错的选择。
可怕的码头
不用担心Linux的终端,实际上,通过一些实践它很容易使用,它可以使您的日常任务大大自动化。
在Debian / Ubuntu及其衍生版本中,打开CLI(命令行界面)的快捷方式是“ Ctrl + Alt + T”。让我们打开终端并尝试一些命令。
cd(更改目录)-cd命令是您在Linux命令行上最常使用的命令之一。它允许您更改工作目录。您可以使用它在文件系统的层次结构中四处移动。
cd
单独使用cd命令会将当前目录更改为用户主目录,该目录位于“ / home / username”中,如“ / home / mark”中所示。
ls(列表)-此命令列出当前目录中的内容。它也可以用来列出文件信息。
ls
现在我们可以在家里看到目录了。
此处列出的命令是基本命令,可帮助您快速入门。但是它们也很强大,随着您的Linux专业知识的扩展,它们将继续发挥作用。
echo
这会将您输入的文本发送到某个地方-返回屏幕,文件或另一个命令。例:echo "hello!"
cat
要显示文本文件的内容,只需键入cat myfile
。find
它按照它说的做,而且很擅长。使用它可以按路径,大小,日期,所有者和其他许多有用的过滤器查找文件。范例:find . -type f -mtime -1h # List files in this directory modified in the past hour
。date
如果您想知道现在是几点,只需输入日期即可。范例:date "+It's %l:%m%p on %A"
。在脚本中使用它可以根据当前日期命名文件。ls
这个目录里有什么?ls
与一些有用的标志结合使用,可以按日期和大小显示和排序目录内容。它还为您提供了许多格式化输出的选项。pwd
我在哪里?Linux可能会令人宽容,尤其是在删除某些内容时。发出命令之前,请确保您知道自己的位置。mail
Linux的邮件程序外观不佳,但确实很有帮助。您可以创建一条消息,并在一个命令中添加文本,收件人和附件。例:echo "We're having a great time." | mail -s "Wish you were here!" -A postcard.png -t [email protected]
cut
当您有一个带有分隔符的字符串时,用于cut
过滤某些字段。例:echo "this, that, and the other" | cut -d, -f2 # "that"
grep
要查找包含特定字符串的文本行,请使用grep。例:grep 'root' /etc/passwd # root:x:0:0:root:/root:/bin/bash
sed
使用sed查找和更改文本中的子字符串。例:echo "this, that, and the other" | sed 's/that/those/' # "this, those, and the other"
shutdown
使用关闭系统并关闭电源。示例:shutdown -h now
立即关闭系统。shutdown -h +5
五分钟后关闭系统。
在脚本和命令行中使用这些命令。它们都是非常强大的命令,Linux主页上有很多有关每个命令的信息。
另外,用于系统管理员的重要命令如下:
uptime
:显示系统已经运行了多长时间以及当前登录的用户数量。它还显示了1.5分钟和15分钟间隔的平均负载。w
:显示当前登录的用户及其过程以及平均负载。还显示登录名,tty名称,远程主机,登录时间,空闲时间,JCPU,PCPU,命令和进程。users
:显示当前登录的用户。除了help和version,此命令没有其他参数。who
:仅返回用户名,日期,时间和主机信息。who命令类似于w命令。与w不同,谁不打印用户在做什么。whoami
:打印当前用户的名称。您也可以使用“我是谁”来显示当前用户。如果您以root用户身份登录,则使用sudo命令“ whoami”以当前用户身份返回root。如果您想知道确切的用户登录名,请使用“我是谁”。ls
:以易于阅读的格式显示文件列表。crontab
:使用crontab命令和-l选项列出当前用户的计划作业。less
:允许您快速查看文件。您可以上下翻页。按“ q”从较少窗口中退出。more
:允许您快速查看文件并以百分比显示详细信息。您可以上下翻页。按“ q”退出更多窗口。cp
:将文件从源复制到目标并保持相同模式。
这些是adiminstrator经常使用的命令列表。这不是完整的列表,但是是需要时要引用的紧凑命令列表。
- 发行版:它是“发行版”的缩写;发行版是GNU / Linux操作系统的一个特殊品牌–如Redhat,Fedora,Ubuntu和Debian。
- Shell:这是一个读取命令输入并运行指定命令的程序。光标前面的美元符号($)称为shell提示符;它告诉您系统已准备就绪,正在等待命令形式的输入。
- CLI:代表命令行界面。它是简单的用户界面,可提供用户使用文本命令与Linux OS交互所需的服务。它使用户不必知道复杂的硬件细节。
- GUI:代表图形用户界面。它是Linux系统的一部分,包括使指向和单击成为可能的窗口,图标,图片(通常是图形)。
- 终端:是用于访问Linux Shell的应用程序。
- 内核:这是Linux系统的核心-您可以称之为“大脑”。内核控制计算机的资源,并通过与计算机的硬件直接交互来确定如何使用它们。
- Tux: Linux的官方吉祥物。那是通常与Linux相关的企鹅–如果您在线上看到黄色和黑色的企鹅,那么您就看到了晚礼服。
- 根:也称为超级用户,是Linux计算机管理员的“默认”用户名。通常在Linux终端上用 “#”符号表示。
- 命令:是给Linux计算机的文本输入或指令(通过在终端中键入),以告诉计算机该做什么(即,为了获得所需的结果)。
- 资料库:资料库(简称“资料库”)是通常在线上托管的发行版软件包的集合。将软件程序添加到程序包管理器时,可以从发行版提供的默认存储库中安装软件程序,也可以从第三方存储库中安装软件程序。
- 软件包管理器:是一个软件程序,使您可以搜索,安装,更新和删除应用程序以及其他应用程序管理功能。每个发行版都有来自最终程序包管理器(如Ubuntu软件中心)的图形和命令行程序包管理工具(如“ apt-get”)。
- 依赖关系:依赖关系是您要安装的程序需要运行的软件程序。在安装程序时,它会向默认程序包管理器提供其依赖项列表,以检查它们是否已安装,如果尚未安装,则从存储库中下载它们。
2020年10大最受欢迎的编码挑战网站
https://www.freecodecamp.org/news/the-10-most-popular-coding-challenge-websites-of-2016/
解决编码难题是提高学习编码技能的一种好方法。解决不同类型的挑战和难题可以帮助您成为更好的问题解决者,学习编程语言的复杂性,为工作面试做准备,学习新算法等等。
以下是一些受欢迎的编码挑战网站的列表,并简要说明了每个网站所提供的功能。
1. TopCoder
TopCoder是在线竞争性编程的原始平台之一。它提供了过去的算法挑战列表,您可以使用他们的代码编辑器直接在线上自行完成。他们颇受欢迎的单轮比赛每月在特定时间提供几次,您可以与其他人竞争以最快的速度以最高的分数解决挑战。
在排名靠前的用户在TopCoder公司是非常好的竞争力的程序员,并定期在编程竞赛竞争。排名最高的用户维护着自己的博客,该博客由Petr Mitrichev每周撰写,标题为Algorithms,他在其中撰写有关编码竞赛,算法,数学等的文章。
2. Coderbyte
Coderbyte提供了200多种编码挑战,您可以使用10种编程语言之一直接在线解决(请参见本示例)。挑战从简单(在字符串中找到最大的单词)到困难(打印图形的最大基数匹配)不等。
他们还提供了算法教程,入门视频和面试准备课程的集合。与HackerRank和其他类似网站不同,除了Coderbyte发布的官方解决方案外,您还可以查看其他用户提供的解决方案。
3.欧拉计划
欧拉项目在计算机科学和数学领域提供了大量挑战。挑战通常涉及编写一个小程序来找出聪明的数学公式或方程式的解决方案,例如找到序列中每个数字之前的所有数字的数字总和。
您无法在编辑器中直接在网站上编码,因此您需要在自己的计算机上编写解决方案,然后在其网站上提供解决方案。
4. HackerRank
HackerRank为几个不同领域提供了挑战,例如算法,数学,SQL,函数式编程,AI等。您可以直接在线解决所有挑战(查看此示例)。他们为每个挑战提供了讨论和排行榜,大多数挑战都带有社论,该社论详细说明了挑战以及如何提出解决方案。除社论外,您目前无法在HackerRank上查看其他用户的解决方案。
HackerRank还通过解决公司赞助的编码挑战为用户提供了提交应用程序和申请职位的能力。
5. CodeChef
CodeChef是一个基于印度的竞争性编程网站,它提供了数百个挑战。您可以在他们的在线编辑器中编写代码,并查看根据您的技能水平分为不同类别的挑战的集合(请查看本示例)。他们拥有庞大的编码社区,他们为论坛做出贡献,编写教程并参加CodeChef的编码竞赛。
6. 锻炼

Exercism是一个编码挑战网站,提供跨越52种不同编程语言的3100多种挑战。选择了您想要掌握的语言后,您就可以在计算机上解决编码难题(Exercism有其自己的命令行界面,可以从GitHub下载)。
但是,它与其他挑战网站略有不同,因为您在完成每个挑战后都会与导师合作。指导者会在线查看您的答案,并在需要时帮助您改善答案。答案获得批准并提交后,您将面临更多挑战。
7.密码战
Codewars提供了大量由自己的社区提交和编辑的编码挑战。您可以在其编辑器中以多种语言之一直接在线解决挑战。您可以查看有关每个挑战的讨论以及用户解决方案。
8. LeetCode
LeetCode是一个受欢迎的在线法官,它提供190多个挑战的列表,可以帮助您准备技术面试。您可以使用9种编程语言之一直接在线解决挑战。您无法查看其他用户的解决方案,但是会为您提供自己解决方案的统计信息,例如与其他用户的代码相比,您的代码运行速度。
他们还有一个专门用于准备工作面试的模拟面试部分,他们举办自己的编码竞赛,并且有一些文章部分可帮助您更好地理解某些问题。
9. SPOJ
Sphere Online Judge(SPOJ)是一个在线法官,可提供超过2万种编码挑战。您可以在在线编辑器中提交代码。SPOJ还举办自己的竞赛,并为用户提供了一个讨论编码挑战的区域。但是,它们目前没有像其他网站那样提供任何官方解决方案或社论。
10. CodinGame
CodinGame与其他网站略有不同,因为您实际上不只是在编辑器中解决编码难题,而且还参与编写直接在线玩游戏的代码。你可以看到目前提供的游戏列表,在这里,一个的例子在这里。该游戏带有问题描述,测试用例和编辑器,您可以在其中使用20多种编程语言之一编写代码。
尽管此网站不同于上述典型的竞争性编程网站,但它仍然在喜欢解决挑战和参加比赛的程序员中仍然很流行。
这份名单是基于几件事情:使用网站我自己的经验,一些谷歌搜索,Quora的职位,以及诸如文章这一个和这一个。我还经常参加一些论坛和次要会议,例如r / learnprogramming,以查看那里的用户通常推荐哪些网站。免责声明:我在上面提到的网站之一Coderbyte工作。
如何使编程成为日常习惯
https://www.freecodecamp.org/news/how-to-make-programming-a-daily-habit/
在过去的几年中,编码一直是一个热门话题。很多人都想开始编程并成为开发人员。那么如何养成编码习惯呢?
几天前,我开始阅读Charles Duhigg的《习惯的力量》。这本书让我思考了为什么有些人每天都在为编程而苦恼。我认为是因为习惯过程。大多数人不知道习惯如何工作,需要具体的例子。
在本文中,我将解释什么是习惯,并为您提供一些建议,以帮助您养成每天编程的习惯。
有什么习惯?
在开始之前,必须定义一种习惯以及如何养成一种习惯。
如果我们在Google上检查“ habit”一词的定义,就会发现:
“习惯是经常重复的行为习惯,容易下意识地发生。” ― 维基百科
“通过频繁重复或生理暴露而获得的行为模式,表现出规律性或增加的表现能力” ― Meriam-Webster词典
“通过频繁的重复获得的经常性的,经常无意识的行为模式” ― 免费词典
“您经常或有规律地经常做的事而没有考虑它” ― MacMillan词典
如您所见,习惯是生活中的自动过程。以刷牙为例。
定义习惯的组成部分以了解其工作原理很有趣。
每个习惯包括三个部分:提示,例行程序和奖励。

提示是什么?
提示是您生活中触发习惯的事件。每次您自动执行某项操作时,都会由提示开始。
在大多数情况下,提示是由时间,情感状态,位置或动作定义的。
例如,如果我在工作时突然从同事的方向闻到咖啡味,则会触发我的“喝咖啡休息时间”习惯。
例行什么?
该例程是您在习惯进程运行时正在执行的操作。您可以定义此部分中的任何内容。正如我之前所说,可能是“我要去喝咖啡休息时间”。
奖励是什么?
奖励是流程的最后一个要素。换句话说,此例程为您做了什么。对于喝咖啡休息时间的例子,奖励是“感谢咖啡因,我不那么累了,我更有活力。”
奖励给自己越积极和愉悦,您的大脑就越会节省习惯。
“我们大脑中的这个过程分为三个步骤。首先,有一个提示,一个触发信号,告诉您的大脑进入自动模式,并养成使用习惯,然后是例行程序,可能是身体上的,精神上的或最后,有一个奖励,它可以帮助您的大脑弄清楚这个循环是否值得将来记住,随着时间的推移,这个循环(提示,例行,奖励;提示,例行,奖励)将变得越来越自动化。提示和报酬交织在一起,直到强烈的期待和渴望感出现为止。最终,无论是在寒冷的MIT实验室还是在您的车道上,都养成了习惯。” ―查尔斯·杜希格(Charles Duhigg),习惯的力量:我们为什么要在生活和商业中做我们要做的事情
一点运动
您可以执行以下操作:采取一种日常习惯,尝试定义提示,例行程序和奖励。完成后,您就可以阅读下一部分有关如何养成日常编程习惯的内容。
如何使编程成为日常习惯
使编程成为日常活动所需要做的就是创建一个例程。
您可以自由定义该练习各部分的要求,但我会为您提供一些帮助。
对于提示,您可以尝试根据时间定义一些内容:
- 每天早上醒来之后
- 当我下班回来时
- 我午休时
- [插入基于时间的提示]
例程将是我们定义的最直接的元素。您可以说:“我想编码30分钟”,“我要学习30分钟的[插入技能]”或更多。
最后,最关键的部分之一就是奖赏。正如我在第一本生产力文章的第一部分中所建议的那样,您需要为自己建立目标。它可以帮助您定义奖励。每次练习习惯时,您就更接近目标。
尝试确定长期目标,并在其中确定许多小目标。
例如,您可以说:
- 我正在接近本周的目标。
- 我离我的最终目标越来越近了。
- 如果我醒来后立即编写代码,我将以早餐作为奖励。
- [插入奖励]
可以帮助您的挑战
养成习惯的最佳方法之一就是跟随100DaysOfX挑战。这项挑战旨在通过分享您在Twitter,Instagram或博客上所做的事情来帮助您创建模式并每天致力于实施。
我告诉您这个挑战的原因是它在Twitter上以100DaysOfCode闻名。
我强烈建议您阅读网站上的规则并开始使用。首先,您会看到它似乎很大且不可能,但是您会发现它很有趣。
此外,您肯定会在Twitter上获得支持,这会激励您。
“您对自我完善充满热情吗?渴望改变自己的习惯,曾尝试过很多次,但是在改变习惯方面遇到了困难?生活似乎总是很碍手碍脚,没有足够的支持,您会觉得自己在独自生活在其中吗?发现自己在想:“如果我似乎总是回到自己的起点,那么这些自我完善有什么用?” ― 100DaysOfX
如果我向您推荐此挑战,那是因为我正在这样做。我对结果感到兴奋,而且我只是开始。
就我而言,我正在做100DaysOfReading挑战。我一直想开始阅读,但是我从来没有花时间去做。多亏了这一挑战,我才进入第17天,已经完成了一本半书。
我的习惯循环:
- 每天午餐前或睡觉前(提示)。
- 我读了20页或以上(常规)。
- 我正在实现我每天阅读的长期目标。我已接近完成本书的短期目标。这让我感到高兴,因为我一直想每天阅读(奖励)。
- 我在Twitter上发布了我正在阅读的书的引文,其中包含一些解释和激励性文字(承诺)。
这里有一些技巧可以帮助您养成编程习惯。
计划您的任务
为了每天工作并实现我的每月目标,我计划前一天晚上的所有任务。我把我想做的事写在纸上,每次做时,我都会把它从清单上划掉。我建议您按照日常的编程习惯进行操作,因为这会激励您并在您完成所有目标时让您感到很多满意。
如果您在工作中需要更多的结构,请定义要做什么,如何,何时以及为什么。
例如,我将为我的网站创建一个登录页面(我将要做的事情)。我将使用Vue.JS来构建它(如何)。我将在上午8点至10点之间(时间)进行此操作。这将有助于我更好地了解Vue.JS,并帮助我开始获取访问者的电子邮件地址。
编写您的梦想项目
有什么比在梦想的项目中每天进行编码更好的了?如果您需要动力,这是每天编程的好方法。不要害怕采取主动。每天做一点点会激励您更多,并在短时间内给您带来效果。
找到您要工作的领域
编程的世界非常广阔-Web,软件,AI,嵌入式等等。
重大困难之一是定义您想成为一名程序员的工作。
这对每个人来说都不容易,但是选择一个主题并坚持下去可能是每天练习的一个很好的动力因素。
例如,如果您选择Web编程,则只需专注于此即可。即使这仍然是一个大话题,您还是删除了软件,AI,嵌入式和其他所有内容。这是一个好的开始。
要走得更远,您可以在前端和后端之间进行选择。
我之所以这么告诉您,是因为当您开始时,由于事情太多,您会很快失去动力,并且您无法专注于特定主题。
良好的环境
令人愉悦的工作环境可以激发您每天的编程习惯。我不建议您在床上工作。你会很容易累。
尝试在办公桌或桌子上工作,并尽一切所需使该空间舒适。这将使您想更有效地工作。
进一步阅读
如果您有兴趣进一步了解习惯过程,我请您阅读Charles Duhigg 的《习惯的力量》。这本书在撰写本文时对我有很大帮助,而我给您的许多示例都受到了启发。
我还听说过原子习惯:詹姆斯· 克莱尔(James Clear)提出的建立良好习惯和打破不良习惯的简便方法。本书提供了改善您的日常习惯的框架。作者试图提供有关如何进行更改的实用指导。
结论
您是否打算使编程成为一种日常习惯?您要提交100DaysOfCode吗?
如果喜欢,请随时分享此文章。
在Twitter和Instagram上关注我,不要错过我的内容。
您可以在我的网站上找到其他类似的文章:herewecode.io。
我从阅读《实用程序员》中学到了什么
https://www.freecodecamp.org/news/thought-on-the-pragmatic-programmer/
简而言之:古老而又黄金。
《实用程序员》于1999年出版,是一本有关如何成为一名实用程序员的书。真正的意思是“优秀程序员”。
是的,它大约在20年前出版。但是,这本书仍然提供了许多与程序员或软件工程师非常相关的见解,就像有些人如今所说的那样。
您可能以前曾经听说过这本书,并质疑它的真正含义。好吧,今天我将与您分享我在阅读本书时学到的一些有趣的东西。
成为一名程序员不仅仅是技术技能
阅读本书的标题时,您可能希望它会提供很多技术课程。但实际上并非如此。使本书在20年后仍然有意义的是,它告诉我们,成为程序员并不仅仅涉及技术实力。而且我们经常忽略这一事实。
这本书告诉我们,编程不仅仅是技术能力。
猫吃了我的源代码
这是本书的第一章,是一个非常有趣的概念。
还记得有一天我们没有完成作业,我们说那只狗吃了吗?(实际上我不记得了,因为我总是完成作业?)
那以及本章所教我们的实际上是责任。当您对某事负有责任时,您应该准备对此负责。
如果您犯了错误而不能履行这些责任,则必须弥补并找到解决方案。不要编造借口,不要玩指责游戏。您不能仅仅上班告诉所有人猫都吃了您的源代码。
提供选择,不要做la脚的借口。
都是关于窗户破了
在这本书中,有一个关于城市地区的故事,这个城市变得非常混乱和破败,这都是由于一个破窗户造成的。
这很像我们的代码:当我们看到一些脏代码(我们可以看到它是一个坏的窗口)时,我们可能开始认为让代码变脏是可以的。以后再回去是可以的,大多数时候我们从不这样做。
尽量不要让“破损的窗户”得到修复。找到此类代码后,请尽快对其进行修复。当您继续认为没有人有时间修复该损坏的代码时,您不妨去买一个垃圾箱来保护您的代码。
本章讨论的内容实际上很简单:它涉及主动性和照顾您的东西。
主动,成为催化剂
有时候,您可能知道有些事情是一件好事,或者实际上需要完成某件事。它浮现在您的脑海,您只是想自己就认为这是对的。
如果您一直在思考,什么都不会发生。或者,如果您只是要求将其显示在项目时间表上,则可能会遇到巨大的功能开发要求和技术债务。因此,讨论结束了一年。
现在该加强您的游戏了。尽力而为,不要过度,但要使其合理。一旦您有了完整的想法,就向人们展示。他们可能会认为“是的,如果我们这样做的话可能会更好。”
向他们展示未来,人们将在您周围集会。成为变革的催化剂。
更重要的是,这本书还教会了我们一些程序员常会忘记的基本基础知识。
有时,我们对工作的研究越深入,就越容易忘记很久以前学到的基本知识。
忙于追逐功能和新技术改进,我们常常会忘记,在深入研究之前,实际上还有很多事情需要我们事先注意。
干净的代码
我们经常忘记的最基本的原则之一是干净的代码。随着功能的堆积越来越多,代码库变得越来越胖,技术债务也随之增加。
但是我们必须始终记住,每次编写代码时都要保持代码的一致性和整洁性。
本书中提到的一件事是DRY原则(不要重复自己)。它与代码可重用性有关。复制是邪恶的,那是事实。重复的代码会使维护代码变得非常困难,并且在您需要更改功能或修复错误时会引起混乱。
还记得那个时候需要修复一些代码的时候吗?您是否意识到有些代码与您刚刚更改的代码非常相似?这样一来,您就必须同时更改该部分和另一部分,然后也许也要更改一下……您就可以了。
找到正确的工具
就像a夫一样,找到正确和适当的工具非常重要。a夫开始砍树之前。他们必须决定-他们需要电锯吗?还是斧头足够好?也许他们可以使用一种全新的光剑。但是使用菜刀可能需要一些时间才能砍伐树木。
对于程序员来说这是相似的:这本书告诉我们,对于我们来说,在开始工作之前找到合适的工具非常重要(就像一个好的代码编辑器一样)。我们不应该直接进行编码。
例如,实际上可以使用Windows记事本进行编码,然后使用控制台进行编译。但这是适合您的工具吗?尝试找到最舒适的最佳编辑器。学习和掌握它,它将使您的生产率提高数倍。
书中提到了几种编辑器,例如Emacs或Vim。但是如今,您可以找到更多现代代码编辑器,例如Visual Studio Code。寻找适合您的一个。就像您在咖啡中的口味一样-有些人喜欢拿铁咖啡,有些人喜欢卡布奇诺咖啡。
不要巧合编程
这是书中提到的非常重要的一点。在我们所有的编程旅程中,可能有时我们只是盲目地和意外地进行编码……并且某种程度上它才起作用。
您可能不确定自己的实际工作,因此您不断添加越来越多的代码,但它仍然有效。也就是说,直到有问题的一天,您尝试删除一些代码,它完全破坏了所有内容。而且您不确定是哪块引起的。
依靠未知是非常危险的。当您不确定代码应该做什么时,请尝试简化它,并确保代码本身是可靠的,而不仅仅是偶然的可靠。
仅依靠您确定的事情。不要巧合编程。
单元测试
最近,测试是一个热门话题。是的,这也是20年前的一个重要话题(而且将永远如此)。
但是有时候,人们如今忘记了单元测试。他们可能刚刚完成了代码,并且认为一切都还好……直到由于边缘情况导致代码在生产中被破坏为止。
为了保持稳定性和安全地进行重构,我们始终需要通过编写单元测试来保护代码。如果您的测试仅涵盖幸福的道路,那将是远远不够的。对您的代码执行无情的测试,并记住您的代码只有在涵盖所有可用测试后才能完成。
单元测试将帮助您确信自己的代码部分已经完成。
取得所有权
我想谈的最后一件事。众所周知,程序员喜欢以代码形式留下“遗留”。是的,大多数情况下都是不好的。
作为程序员,我们应该为自己的工作感到自豪。我们应该为我们所承担的责任和我们一直在努力的代码感到自豪。
当我们最终能够以自己的代码为荣并拥有它时,我们将可以留下良好的遗产。人们会把我们的代码视为签名。当他们看到我们的代码时,就会知道该代码将是可靠且由专业人员编写的。
整理起来
本书中涵盖了我这里没有讨论的更多主题,例如需求和团队合作。如果您有兴趣探索这些主题,则应尝试查找并阅读本书!
不过,请注意:尽管我喜欢这本书,但看看这本书有多老(20岁),似乎有些东西并不相关。它谈论诸如Prolog之类的旧语言,并像一个真正的新概念一样谈论OOP-因此这些奇怪之处似乎并不正确。
但是不能怪它,因为它已经有几十年了。
除此之外,本书涵盖的大多数内容仍与当前的编程时代密切相关,例如我上面提到的那些主题。
如果我想总结本书中的所有内容,我会说它基本上涵盖了我在网络上阅读的有关成为一名更好的工程师的所有内容。
感谢您阅读我有关实用程序员的文章!希望它使您对作为程序员或软件工程师的旅程有所了解。如果您有兴趣了解更多信息,请抓住本书的副本。
使您成为英雄的前五名开发者技能
https://www.freecodecamp.org/news/the-hero-developer-who-knew-how-to-build-lego-bricks/
编程就像用乐高积木一样。任何开发人员都可以选择全新的LEGO集并按照说明进行构建。这很容易。可以将其视为编写学校作业或入门级教程的代码。
真正的软件项目是不同的。这就像建造一个非常大的城堡。除了过去已经建造过。然后有人用野蛮的脚把它撕成碎片。较大的部分仍然保持在一起。但是较小的部分被完全压碎了。一些元素消失在窗外。
您会得到一个盒子,里面装有剩下的东西,还有数千套其他物品。当然,指示也消失了。您只能依靠一张照片来了解城堡的外观。
现在很有趣!让我们看看在这种环境下如何有效工作。
1.接受未知
任何开发任务的第一步都是了解您需要做什么。听起来很明显。但是,任务越大,您获得的未知变量就越多。这是树立明确期望的时刻。
如果您不知道如何入门,那么思考和概念化的时间就太长了。开始并掌握所需的关键要素。然后再想一想。如果有人要求您提前估算或最后期限,请保持坦诚。您不了解或可能不了解的系统某些部分。没关系。
考虑一下Facebook,Netflix或Oracle等平台。或任何更大的企业软件。很少有人能够掌握全部范围。确实已经构建或花费了数年时间的人们。因此,首先,让自己休息一下,不要一无所知。更重要的是,接受您不会一无所知。
经验丰富,生产能力强的开发人员不是更好的程序员。他们更擅长评估他们需要做什么。并选择正确的策略来应对未知数。
乐高类比:想想我们要重建的城堡。假设有人给您一张城堡和盒子的图片,然后问您“建造城堡需要多少时间?” 除了“我还不知道。让我开始并看看一两天后我在哪儿”,对此没有好的答案。
最终完成这项工作的“我害怕未知数”方法是将所有元素从地板上的盒子中放出来。尝试根据颜色和形状将它们分成所属的组。然后看图片,并就如何组装积木制作一张心理图。
这种方法不是很有效,原因有两个。首先,如果城堡太大,您可能永远都无法到达那里。第二点也是最重要的一点:您无法评估进度。您可能走在正确的轨道上,或者根本不走。您没有反馈回路。
另一种方法是开始建造城堡。随着您的前进,您将了解找到所需零件的便捷性。您将知道图片是否显示了所有细节,或者结构是否比看起来复杂。
根据这些信息,您可以对完成这项工作所需的时间和精力做出更有根据的猜测。如果值得一做。
如果您需要明天早上建造它,也许去商店再买同一座城堡是更好的解决方案?这可能不是您的决定,但是解决问题并不总是通过更多代码来完成。
2. 接受妥协
开发人员经常称赞和重视“对细节的高度关注”。那里的每一份工作都以一种或另一种形式提供。很好 但是不要将对细节的关注与固执和完美主义相混淆。
启动大任务时,必须定义它的两个版本。第一个版本是您需要验证事物是否按照您认为的方式工作的最低要求。
这就是我所说的“水平工作”。您较大的任务中的每一项都是垂直的。您无需深入研究即可获得第一个结果。首先关注主要用例或方案。并从那里拿走。
您可以在第一个版本中留下的东西:
- 错误处理
- 边缘情况
- 干净的代码
- 组态
不用考虑所有这些,只需编写所需的代码即可。您应该快速获得较高的功能覆盖率。当然,从第一个简单的版本过渡到最后一个版本将花费很多时间。那有什么意义呢?
这是一种更安全的进步方式。您想验证您的假设。设计和概念化虽然像您一样聪明又有能力,只能带您走远。弄脏你的手。它比任何“深入研究”都给您更多的知识和见识。
这与应用于业务中新产品或功能的MVP的原理相同。该方法还具有可以显示您的第一个版本并获得反馈的优点。或问问题。在现有代码上集思广益比在图形或概念上集思广益。
乐高类比:您正在建造城堡塔。在图片上,高塔墙由交错的灰色和白色砖块制成。塔中有一个公主,屋顶上有一条巨龙。
您会找到公主和巨龙,但要找到所需的灰色和白色砖块可能要花很多时间。正确的方法是使用任何砖块建造墙,然后放置公主和龙。您可以留下“改善墙砖”之类的待办事项。
想法是您已经确定了一个问题:建造完美的墙将很困难。让我们接受这一点,继续发现我们尚不了解的所有其他障碍。接受妥协可以防止您陷入困境。
即使您从未到过TODO,也可以告诉您的客户:“这里是完整的城堡。我们知道我们必须改善塔墙,但它已经建成”。这比“由于我们花了很多年才能为塔找到合适的砖块而拖延的时间要好得多。但是,看一下,塔是完美的,并且与您发送给我们的图片完全一样。现在,我们将继续其余的内容。城堡”。
重要提示:不要混淆妥协和草率。
塔的主要元素是公主和龙。不要在塔上放一个农夫,在屋顶上放一只猫,不要以为这是个妥协。它不会工作:)
3.从外部世界开始
您可以控制很多事情。还有你做不到的事情。十年前,我了解到这是我作为开发人员的第一个任务时遇到的困难。任务是集成外部API并处理数据。我有一个星期。即使对于像我这样没有经验的人,这也是一个非常合理的时间表。
这是我所做的(以及您不应该做的):
今天是星期一早上。我已经阅读了10分钟的API文档。看起来很容易。我创建一个测试数据集,然后继续编写代码以对其进行处理。完成后,我将使用真实的API进行测试。
星期三早上,我快完成了。我认为我的代码干净,设计良好,而且一切正常(事实并非如此)。现在,我只需要集成API,就可以提前完成。我不禁以为“我很棒”。
我很快进入了API部分。我正在尝试通过我的代码来达到目的。除了我不能。出了点问题。我浪费了一整天,仔细检查了一切。使用不同的API客户端。没有进展。那天闪烁着,现在是星期三晚上。
我被困住了,感觉与真棒相反。
我星期四上班,请同事帮忙。他告诉我,对API的访问可能受IP限制,因此我必须与该公司联系以将我们的IP列入白名单。好,我有前进的方向。
我向拥有API的公司发送电子邮件。就像早上8点。我愚蠢地期望在几分钟之内得到快速答复和解决。我整个上午都出汗,中午终于拿起电话,打了支持电话。我会解释我的问题,并尽最大努力突出它的“紧急”程度(不是)。
另一端的人向我解释,白名单的时间通常为1或2天。现在我很沮丧。1或2天?这怎么可能?我的任务是世界上最重要的任务(当然,仅对我来说),它们告诉我“ 1或2天”吗?
突然我不再领先了。我迟到了。我失败了。我去找老板,告诉他我搞砸了。我应该在星期一早上检查一下API。然后,我将在同一天请求访问权限,与此同时,我将编写代码。他只是笑着说“是的”。
我终于在星期五获得访问权,并且必须待得很晚才能完成工作。我使代码适应API数据带来的许多惊喜。再见,精心设计和简洁的代码。我稍后将说“没有时间”(有)来说明这一点。
在我幼稚的时候,我觉得访问和错误的文档是很不幸的。现在我可以说这是照常营业。
本课将从您无法控制的内容开始。确认您对环境的所有假设。使用手动和低成本方法尽早尝试。
乐高类比:想象您正在建造城堡,并且一切运行顺利。您现在已经将盒子混合了大约100次以寻找零件。您不禁会想:“我从未遇到过坐在照片塔上的那条巨大的橙色龙”。
您忽略了这些信息,而只关注于自己取得的良好进展。那是人类。前进比处理问题更令人兴奋。最后,您必须确认龙不见了。并非常晚地告诉您的客户,该套装中的较大部分将不存在。这不好。
相反,要做的是遵循该提示:“龙在哪里?”。花费时间来确保100%不存在。立即提出问题。告诉您的客户:“嘿,盒子里没有龙。我不能用其他砖头来补龙。我们该怎么办?”
当人们足够早地知道问题时,他们会惊讶地接受问题。尽早发现问题可以提供更多可能的解决方案。“我们继续知道没有龙吗?” “我们可以单独买龙吗?” “我可以在盒子里看到恐龙。我们可以代替它吗?”
4. 划清界限
当您开始为现有系统开发新功能时,请先定义其与现有代码的接口。当然,您应该尝试并遵循SOLID原则等。但是关键部分要比这简单。只需尝试使接触表面尽可能低。
清晰定义切割的简单过程将改善您的解决方案。这将迫使您解决以下关键问题:用户或系统将如何使用我的代码? 我将得到什么输入?我应该产生什么输出?它可以帮助您将视线保持在球上。
如果您对正在使用的系统不了解,那就更是如此。这是一个很好的机会,可以探索未知的事物,然后再深入了解您已经知道的事物。
它还使打开或关闭该功能变得容易。您可以使用布尔标志或更高级的功能切换机制。
乐高类比:假设您需要建造城堡的延伸部分。要求很高,所以有很大的创造空间。但是您无法触摸现有的城堡。
您可以去建造一个不错的扩展,只是发现没有空间将它连接到城堡的任何地方。那真不幸。您必须快速更改扩展名以使其适合。
正确的方法是首先考虑触摸表面。扩展名将在城堡的哪儿?我可以将哪些砖块贴在上面?他们有什么形式?将延伸部分的几块砖放在一起,将其连接到城堡。验证它们是否插入牢固。您可以从那里自由样式化任何所需的扩展。
5.不要太干
DRY代表“不要重复自己”。这可能是最容易遵循的规则。一旦看到重复的代码行,就进行抽象。可以是基类,也可以是辅助方法。
那会发生什么呢?下一个人来了,需要更改通用代码以涵盖更多情况。它们添加参数和if语句以应对新出现的复杂性。很快,最初的5条简单行变成了30条行,很难弄清楚正在发生什么。
可读性差并不是代码重复的好方法。
最好保留重复的行。然后,您可以随意更改每个实例。
下次您到达“抽象的重复”时,问问自己:您看到某人从抽象中返回了多少次?就像删除基类,然后将通用代码放回继承类。我敢打赌答案永远不会。
原因是抽象和设计模式通常很酷而且很复杂。如果存在,那么“一定有一个很好的理由”。因此,一旦您引入了抽象,就很有可能将其永久保留在那里。
这是否意味着您不应该使用抽象?否。满足需求的用户抽象。像:
- “我们希望使用输入输出记录对此方法的每次调用”
- “我们想用数据a,b,c记录每个HTTP请求”
- “每次创建用户时,我们都需要这样做
这些是抽象的良好候选者,还有更多示例。但是请注意,与业务相关(日志记录,安全性,分析等)相比,这些要求的技术性更高。很少有抽象友好的需求成为您的业务领域的一部分。
为什么?因为业务领域接近于现实世界。而且我们无法控制。在项目开始时所做的假设往往很快就会落空。不要为了避免重复而过度使用工程师代码。
乐高类比:无。乐高积木没有干的概念。
外卖
聪明地工作与更好的代码无关。它是要弄清楚需要做什么,并安全地朝着目标前进。
艰巨而艰巨的开发任务将带来未知数。接受它。学习使用它。
如果您使事情变得简单,并使您的团队,老板,客户以及理想的所有人对结果的期望保持一致,那么您将更有生产力。
谢谢阅读!
最初发布在Fire CI博客上。
您解决编程问题还是完成练习?
https://www.freecodecamp.org/news/do-you-solve-programming-problems-or-complete-exercises-the-difference-matters/
人们倾向于交替使用术语“问题”和“锻炼”。但是有区别,这很重要。
Paul Zeitz教授对此加以区分。
取5×5。这很容易,而且是一种练习。5,490,900×496也是如此。这有点困难,需要更多时间来解决,但是您知道该怎么做。这就是关键。
蔡茨在有关解决问题的系列讲座中解释说:“练习是一个数学问题,您会立即知道如何回答。” “您可能无法正确回答,实际上您可能永远无法正确回答…但是毫无疑问如何进行。”
问题不是这样。根据Zeitz所说,问题“至少在最初是一个数学问题,您不知道如何回答。”
他通过数学问题解决的角度来定义问题和练习,但它们也适用于编程。
每天,我们都将解决问题的能力用作程序员:调试代码,学习新主题甚至解决问题。练习有其应有的地位,但是作为程序员,解决问题是无可替代的。
练习运动
您可以通过两种方式从练习中受益。首先,它们在学习新主题时会很有帮助。
我现在正在学习JavaScript,并结合使用各种练习和问题来进行学习。这些练习可以帮助我了解模式并熟悉概念和语法。
这是一个要求我编写一个函数的项目的示例,该函数需要一系列汽车。
const cars = [
{ id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 },
{ id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 },
{ id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 },
...
]
我必须car_model
按键以升序对对象数组进行排序。
这并不是说此练习轻而易举-并非如此。我花了一些时间,并且得到了很多错误消息。
但是,它有资格作为练习,因为我从一开始就知道我需要做的事情。
我最近了解了JavaScript中的数组。尽管我不得不研究如何使用JavaScript进行数据处理,但我还是很熟悉根据Python经验对数据进行排序的方法。明确的指示也有所帮助。
但是这些概念仍然是新的。我需要练习将它们放在一起,这就是为什么此练习很有价值的原因。重复会滋生熟悉感,这些概念在我的脑海中开始固化。
维持您获得的收益
练习还有助于使学习到的信息保持最新。
在学习JavaScript的过程中,我不想忘记我所学到的关于第一门语言Python的所有知识。因此,我每天多次使用抽认卡程序Anki。
在这种情况下,练习可以帮助您保持连贯的资料,提醒您重要的概念,以及使用特定的数据结构或方法使自己感到更自在。到目前为止,这是对您所掌握的知识的维护工作。
我有超过1,000张卡片,里面装满了我以前看过很多次的材料。有些卡对语法有疑问。其他人要求我编写SQL查询或命令行或Git命令。许多其他活动充满了练习,例如“将数字列表向右旋转一个位值”。
重要的是要注意,此练习对我来说曾经是一个问题。如果您做的足够多,那么它就可以成为练习。同时,您可以通过添加约束来使练习成为一个问题。
练习是湿滑的斜坡。一方面,它们对于学习目的很有用。另一方面,仅坚持练习很容易感到舒适。
缺点是:待在舒适区。
处理歧义
编程是解决问题的方法。解决问题将带您走出舒适区。这是一件好事。
对我而言,问题具有两种独特的品质。首先是模棱两可。解决问题在很大程度上与如何有效处理歧义有关。
- 每次您的程序运行时,都会出现一条错误消息。为什么?这是怎么回事?错误在哪里?您如何解决?
- 您提出了新的问题陈述。您阅读并重新阅读。乍一看,您不知道发生了什么,更不用说您需要做什么来解决它了。您甚至可能会感觉到“鹿头灯”的感觉,并伴有胃底凹陷。(您选择了一个好问题!)
- 您需要了解关系数据库。那很广泛。你打算怎么做?首先要关注什么?最重要的是什么?您现在真正需要了解什么?
这些例子都含糊不清。所有这些都需要解决问题,无论是查找错误并解决错误,解决实际问题还是学习新主题。
为了取得进步,您需要进行研究,试验,找出事实,制定计划并应用各种解决问题的策略。简而言之,您将学会弄清楚。您花在解决问题上的时间越多,获得的观点越多,它揭示的层次就越多,您就越接近“ aha”时刻。
拥抱斗争
问题的另一个区别是斗争。它是真实的。
解决问题的能力将测试您的精神耐力和耐心。进展可能很慢,而且过程很繁琐。我辛苦工作了好几个小时,几天甚至几周。
这并不是说练习不会挑战您。他们能。当您知道需要使用特定方法时,这是一回事。您只需要使其正常工作即可。这是一个挑战,有时可能会令人沮丧。
但这完全是另一回事,当您一开始就不知道要做什么时,解决问题时可能会发生多次。对我来说,问题是一场斗争。
最好的解决办法是忍受它并使自己陷入困境。根据我的经验,奋斗意味着我学到了很多东西,而突破通常就在眼前。
克服精神不适时,您会发现自己创造性地思考并设计出从未想过的解决方案。(您会感到惊讶并给自己留下深刻的印象-您知道的比您想象的要多!)您正在成为一个更强大的程序员。
您甚至会发现自己很开心。当然,解决问题具有挑战性,有时甚至令人沮丧。但这也令人难以置信。
就像越过半程马拉松的终点线一样。毫无疑问,过去的13.1英里非常艰苦,但是越过终点线是值得的,我会再做一次。解决问题的感觉是一样的。
是什么:问题或练习?
当您打开笔记本电脑时,是要解决问题还是完成练习?
练习有好处,可以将它们合并到编程会议中。在编程会议之前,我将练习用作热身。我将翻看Anki抽认卡甲板十到十五分钟,并进行一些练习。如果我正在学习诸如JavaScript之类的新知识,那么我可能会进行整个编程课程来练习。
但是,我每天都花时间解决问题,无论我正在学习或正在学习什么。即使在我花费大量时间进行锻炼的日子里,我也花费大量时间来解决问题。
因此,当您要开始编程会话时,请注意要执行的操作:练习或问题。无论如何,都要花时间解决问题。
解决问题是一项需要大量实践和时间才能发展的技能。变得更好的唯一方法就是每天工作。这很重要,并且有充分的理由。
我们每天都以程序员的方式并以各种方式解决问题。花时间解决问题是不费吹灰之力的。我们作为程序员的工作依赖于此。
我写了有关学习编程的文章,以及进行编程的最佳方法(amymhaddad.com)。