如何提高
如何从开始过渡到中等水平
当我刚开始入门的时候,我也有过这种现象,那就是现在该做什么了?这种情况当你读过一些书籍和教程解决过世纪问题后尤甚,但是最终很难从理解 if … else 和 for 循环之类的事情过渡到理解如何使用应用所学知识来制作更复杂而有趣程序,这也是大多数程序员的问题所在。
在入门教程和复杂代码之间进行这种过渡可能很困难,https://www.thinkful.com/blog/why-learning-to-code-is-so-damn-hard/ 这篇文章很好的描述了这种现象。许多教程包括我上面列出来的一些教程和资源都会倾向于让你掌握某种语言所具备的知识,但是你掌握了就掌握了,并没有更进一步的打算。。。。。。这使很多初学者程序员陷入困境。
下面是一些针对改善这种情况的建议。
- 从被动学习转变为主动学习
把学习的主观能动性从希望别人教会你哪些知识到自己积极/主动去学习/吸收哪些知识。举个例子,比如你不知道如何制作网站,你 google 如何使用 x 语言制作网站,然后 google 就会提示一大堆 HTML5 、CSS、JavaScript 等一系列教程,然后找到大而全的教程或者在线编程课程开始搞起。
你通常可以找到你想要执行操作的教程,或者至少找到为你提供有关如何组成更具体的搜索查询的概述和线索的文章。更广泛地说,面向搜索来学习并不应该让你感到羞愧
,事实上这是所有程序员的入门和高级工作。
我在刚开始工作的时候经常会因为自己不知道代码如何写而感到羞愧,我耻于网上搜索,经常自己闷声想解决办法,想不出来,无可奈何只能网上搜索,出现正确的结果后,我不是 ctrl c v ,而是一个一个代码的敲下来,然而还在厌恶自己为什么记不住这些代码如何写,事实上这种情况及其不可取,既浪费时间又浪费精力,还不断的怀疑自己,产生恶性循环。 - 不断练习
编程有点像锻炼,因为改进的主要方法是不断练习。从简单开始,然后尝试在命令行上编写诸如剪刀石头布之类的基本游戏。完成后,尝试选择一个更具雄心的项目,然后完成该工作。如果您想混合一些东西,也许可以尝试一些编程练习。
从根本上说,编程实际上是关于应用问题的解决,而学习如何解决问题的最佳方法是不断解决各类大大小小的问题。 - 了解如何分解问题
不管你在工作中尝试解决困难问题,还是在尝试找到一些大型开源项目时,你很可能会感到沮丧,因为任务看起来多么庞大或令人生畏。不要被吓倒,而是将问题分解(分解问题)为越来越小的子问题,直到每个子问题都看起来比较容易上手和解决。
例如,如果你正在学习 Java,想学习编写游戏,但不知道从哪里开始或如何解决问题,那么搜索java 游戏教程将带来几个不错的结果,通常会告诉你如何将编写游戏的过程分解成较小的部分。
从本质上讲,你正在尝试树立工程师的心态。如果问题很大,请不要放弃。不断将其分解成越来越小的碎片,并搜索看起来不可能完成的任务。然后重复,继续循环:分解,搜索,分解,搜索。。。。。。
顺便说一句,这是一种非常有效的自我教学策略!在练习时,你将会更好地了解如何解决问题,并将扩大你的知识/可能的问题解决方案库。 - 学习如何系统化
我们程序员在遇到问题并调试时经常会这样,改改 border 大小刷新一下页面行不行,改改 margin 大小刷新一面页面看看生没生效,就类似这种靠猜
去调试和解决问题,这种习惯切勿养成。你需要运用所学知识,尽可能分析问题,判断错误,学习,再分析判断,再学习。。。。。。尽可能系统,避免试错
。
调试时,切勿漫无目的。像科学家一样尝试思考-进行实验以尝试修复错误或缩小错误的可能范围,并记录结果。如果你的假设/尝试的更改被证明是错误的,或者如果你认为某些更改不起作用,请停止,暂停并找出原因。
当你的假设与现实不符时,就会发生错误。如果感觉不对劲
,请不要忽略它 - 一直追溯到你确定问题出在哪里/你所做的错误假设是什么。
这种学习是有意义的,它会让你不断思考,虽然过程很艰难,但是会促进你想解决问题的欲望,这种学习会一直持续下去。
切记不要因为瞎试出来正确的结果而沾沾自喜。
- 不要因必须调试或谷歌而灰心
并非所有初学者都意识到,即使在专业程序员中,花更多的时间进行调试或谷歌搜索是完全正常的。
调试(而且很费劲!)是编码的重要组成部分。如果可能的话,尽量避免过分紧张或者不耐烦。将其视为有趣的探索和知识的拼接!!!
即使由于某些错误而使你的实际代码没有取得任何进展,只要你是在系统的学习,就可以练习解决问题的技能,尽管采用了不同的方式。
结果,即使你花费大量时间来解决一个错误,你仍然要认为这部分的时间是值得花费的,调试是善于解决问题的最佳方法之一!
随着你变得越来越有经验,这更加正确。事实证明,遇到的错误的难度会随着你的经验水平的提高而增加。有经验的程序员有时也会不得不花几个月的时间来追踪错误的情况并不少见。如果发现是特别令人讨厌的错误。
- 不要害怕寻求帮助
最后,如果你完全陷入困境,又不知道下一步该怎么做了,请不要忘了你可以找其他人寻求帮助!
程序员通常非常有帮助。我们中的许多人也是自学成才的,因此了解作为初学者奋斗的感觉以及完全陷入困境的感觉。
但是寻求帮助前,你需要尽可能的把问题描述清楚,问问题的技巧也是非常多,这一篇关于如何提问问题的文章,对你应该非常有帮助 https://www.reddit.com/r/learnprogramming/wiki/index#wiki_asking_questions
在哪里可以找到编程练习和项目
如果你要创建一个项目,请参考以下一些想法以获取启发:
- 一些清单
- http://www.dreamincode.net/forums/topic/78802-martyr2s-mega-project-ideas-list/
- https://github.com/karan/Projects
- https://github.com/NirantK/awesome-project-ideas
- https://github.com/florinpop17/app-ideas-增长列表
- 项目创意以及教程或写作
- 面向高级初学者的编程项目 - 博客 https://robertheaton.com/2018/12/08/programming-projects-for-advanced-beginners/
- https://github.com/tuvtran/project-based-learning
- http://aosabook.org/en/index.html
- 建立自己的编程语言 https://github.com/danistefanovic/build-your-own-x
- 特定主题的项目 http://inventwithpython.com/blog/2012/02/20/i-need-practice-programming-49-ideas-for-game-clones-to-code/
如果你想要做一些有挑战性的工作,那么你可以尝试写
- 命令行实用程序(ls,wget,curl等)
- 文本编辑器
- 集成开发环境
- 图片浏览器
- Office 套件(类似于Microsoft Office或Libreoffice)
- 编程语言(编写解释器或编译器)
- 网页浏览器
- 数据库(关系或非关系)
- 网络服务器
- 版本控制系统
如何提高将任务/问题转换为程序编码的能力(算法思维)
这是很常见的问题之一。
普遍的答案就是:编写大量的程序。
但是,有一个技巧能够帮助你建立这项技能:
- 选择一项每天应该做的事情,例如做早餐或类似的事情。它应该不太容易,但也不要太困难。
- 写下你应该为该活动执行的步骤,但是要在与实际执行该活动的时间的不同时间内用完内存。
- 下次执行该活动时,记下笔记并尝试认真执行以下步骤。尽量不要偏离你所写下的步骤,如果有必要,请记下差异。
- 改进算法,直到满意为止。
- 尝试不同的活动。任务变得越来越容易。
尽管听起来很愚蠢,但它确实有效。上面的方法已经在许多学生身上尝试过,并证明可以显着改善。
对于一个项目,我很难有很酷的新想法,我只是缺乏创造力吗?其他程序员是如何受到启发呢
对于初学者来说,https://en.wikipedia.org/wiki/Chuck_Close Chuck_Close 一个很不错的想法
我想给年轻艺术家或任何愿意听我的人提供建议,就是不要等待灵感。灵感是针对业余爱好者的;我们其余的人只是出现并开始工作。如果你等着云散开,一束闪电击中你的大脑,那么你将不会做很多工作。所有最好的想法都来自过程。他们来自工作本身。事情发生在你身上。如果您想幻想一个伟大的艺术构想,那么你可以坐在那里很长时间,然后再进行任何事情。但是,如果你只是开始工作,你会想象一些事情,但是实际上会发生另外一些事情,而这些其他事情会将你推向另一个方向。灵感是绝对没有必要的,并且从某种方式上具有欺骗性。你觉得自己需要这个好主意才能开始工作。
只是坐在那里等待灵感的火花,很少会有新奇的想法。如果你只是继续尝试构建一些东西(任何东西!),即使你的想法看起来有些愚蠢或已经完成,你的时间花费也是值得的。
毕竟,这就是艺术家和音乐家的工作 - 他们不一定从尝试创作出高度创意的绘画或创作自己的音乐开始。取而代之的是,他们绘制风景或花瓶,或覆盖现有的歌曲。同样的,提出项目构想时不要感到有压力。重新实施现有程序是一个历史悠久的传统 - 看看你能获得多大的收获吧!
不过,这里有一些想法和技巧能让你参考
- 尝试重新实现现有项目:就像刚开始的音乐家是从报道别人写的歌开始一样,最好重新执行别人制作的程序。
- 尝试将编程连接到另一个爱好:编程是一项非常有用的技能,因为你可以将其应用于广泛的领域,甚至与计算机科学完全无关的领域。例如,如果你对政治感兴趣,则可以尝试分析投票池和趋势;如果你对音乐感兴趣,则可以尝试编写数字音板;如果你对体育感兴趣,则可以尝试编写幻想足球追踪器或预测变量,如果你经营一家企业,可以写些东西来帮助您跟踪库存。
- 试着跟踪让你烦恼的事情:如果你发现生活中不喜欢的事情或发现重复的事情,请问问自己是否可以自动化。我记得
耗子叔(左耳朵耗子)
也提到过这个 idea,比如使用 Python 来完成一些无聊的工作,这个 https://automatetheboringstuff.com/ 网站或许有帮助,你也可以搜索家庭自动化教程
或者更多的解决方案
如何完成一个大型项目
我们上面也谈到过对于大型项目的训练方式:细化、拆分
但是首先,你需要对项目有一个全面的了解,也许橡皮鸭
调试会非常有用。向知识或理解为零的人(或某物)解释问题或概念有助于更深入地了解问题。通过这样做,人们必须对问题进行更多的思考,这将导致更深刻的理解。
然后,不要直接去碰电脑。
你要花大量的时间去思考问题/任务。绘制一些草图,一些伪代码,一些通俗易懂的语言提示,要现在纸上或者绘图板上写下你的思路,会有一些帮助。
自己处理大型项目时,请记住一件事
世界上的所有事物都是由较小的部分组成的。
这意味着你所看到的基本上是任何大型机器,房屋,摩天大楼,汽车,火车,计算机等,都由许多较小的结构组成,这些结构共同构成了最终产品。较小的结构由较小的结构组成,依此类推。
大程序也是如此。它们由许多较小的单元组成,这些单元耦合在一起构成一个整体。理想情况下(但通常不可能),每个较小的单元应独立于其他单元工作(并进行测试)。
从小的单元开始,查看问题或者项目是否还能够继续拆分,直到拆成你认为无法拆开为止。
不要看最终完整的项目和大图,这会让你不知所措,一次只处理一个单独的部分就好。
经验不足的程序员面临的最大问题是,当他们处理大型任务时,大多数人会不知所措。但是这个问题并不是很难克服的:
不要试图查看所有程序的最终程序。专注于一个小的,易于管理的部分,完成它并继续前进。即使是最复杂的程序/系统,也包含小的简单的模块。
想象一下,你正在为客户工作,并且客户在开始编写代码之前需要先查看并批准你的设计,因为他们需要确保你是否正确理解了他们的想法。
- 准备项目的详细描述,即所谓的功能设计规范。
- 与你的假想客户讨论该功能设计规范(即,将其解释给一些无生命的对象,或者如果你可以承受,请向他们解释)。
- 完善功能设计规范 - 返回上一步 - 循环直到你满意为止。
- 在截止日期前准备项目进度表。
- 坚持上述规定。
一些其他建议
- 首先,完全忘记写代码这件事情,要从用户的角度想象该程序。
- 写下软件执行的功能列表。
- 写下该软件不具备的功能列表。(这将使您避免出现需求变更)
- 写出一些有关用户将看到哪些屏幕及其工作流程的图形。这些不是蓝图,也不是为了显示它们的外观,更多的是“首先用户在此页面上,然后他们可以转到此页面”。绘制草图可以帮助你不要遗漏细节问题。
- 解如何使用 git 并获得一个 github 帐户。这非常适合进行备份,也可以征求代码审查。(忽略任何有关代码样式的评论,在 99% 的时间里都是徒劳的辩论)
一些担忧和恐惧
很多读者朋友向我咨询自己是否可以学习 xxx 种语言,那么为什么不学呢?又有谁阻止你去学了?那还不是你的担忧和恐惧来阻止你的吗?还有一些诸如下面的问题