聊一聊我的计算机学习经历吧
点击蓝色“程序员cxuan ”关注我哟
加个“星标”,及时接收最新文章
hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干货也非常多,准备好了吗?那么我们开始吧。
编程入门
我们首先需要解决的就是如何入门的问题了,这也是很多新手/小白的困惑,到底如何入手呢?我该从哪里开始呢?
如果你有兴趣学习编程,那么树立一个正确的编程观念是很有帮助的。这个短片是很好的一个入门 https://www.youtube.com/watch?v=mvK0UzFNw1Q ,这个短片解释了你应该以一种合适的观点来开始编程。
在你树立了正确的编程观念后,你需要意识到一个问题,那就是没有通用的学习编程的方法,所以市面上大多数培训机构所提倡的方法并不适用于所有人,这只是他们大多数人所认可的学习方法,但是并不适用于你,你必须找到适合自己的编程方式。
这里需要说两个现象:
很多小伙伴们咨询我关于编程方式的问题,这个没有定数,有的人喜欢早上编程,因为早上比较清醒,思路比较清晰;有的人适合网上编程,晚上没人打扰,而且晚上有一种魔力:空杯心态,你能更清晰的认识自己,到达一种心流的状态。但是晚上有一点特别忌讳
,那就是熬夜
。所以你更需要平衡编程和生活,生活不全部是编程,编程不能完全替代生活。
所以你需要找到适合自己的编程方式,我这里强烈建议一下你按照下面这几种方式来进行:
首先找到一些你所感兴趣的问题或者项目,你可以尝试构建工具来解决生活中的小问题,也可以尝试实施从头开始发现有趣的程序。这个项目将有助于激发你继续学习编码的经验,并为你提供练习应用所学内容的机会。
做一些研究以确定哪种编程语言最适合你的项目。(下面我会进行介绍)
找到一些高质量的面对初学者的学习编程的资源。(同样,下面我会进行介绍)
通过 google 搜索来提问或者补充学习资源,如果没有 tz 的话,可以使用必应和搜狗(面向微信公众号平台),微信公众号很多文章比较专业的。
最终使用该语言完成了几个有意义的项目
其实,上面这几点归根结底就是这样
刚开始强烈建议规避
这些不良的编程习惯!!!!!!
不要只是简单的、被动的使用你正在使用的资源,要及时进行练习和家庭作业,实践是学习编码绝对必要的部分。
避免在编程语言之间来回切换;选择一门语言并坚持下去。这是因为编程最终与解决问题有关,而不是与编程语言有关。学会解决问题是具有挑战性的,并且是只有通过练习才能磨练的技能。每次切换语言时,你都在浪费时间,可以花时间练习运用所学的知识来提高解决问题的能力。
完成教程后,不要停止学习。编程是一项永远需要新知识的领域
最后,请你记住,学习编码注定是一项长期而又困难的过程,如果你觉得编码很困难,那完全不要气馁,这是很正常的,因为许多人会花很多年的时间学习和练习,才认为自己有能力找到寻找工作或者为重大开源项目做贡献。但是幸运的是,编程入门并不难。
如何选择编程语言
所以现在需要为上面的编程入门提到的几点做一个解释了。
首先,找到合适的、你所感兴趣的编程项目,这个因人而异的,所以就是编程语言的选择问题了。
我经常会被问到这个问题,我该选择哪种语言作为入门?
提出这种问题的人有两个误区
:第一个是你潜意识中认为一定有一门最完美的编程语言来进行学习;第二个是第一门学习的编程语言好像会伴随你的一生。。。。。。
事实上,没有最好的编程语言(PHP 是最好的编程语言纯碎是调侃,这篇文章要解惑下,大家不要相信,有的时候玩笑开着开着就成真的了)。而且你的第一门编程语言对你的职业生涯没有决定性的作用,说起到决定性作用的人,你扪心自问,自己是不是思想懒惰不愿意接触新的编程语言了?
我要告诉你一件事情,刚开始学习一门语言是最难的,因为有很多复杂的概念你搞不懂,但是其实上大多数基本概念是各个语言通用的。随着时间流逝和你对编程工作的深入,要学习一门新的语言会变得越来越容易。可能你刚开始可能要几个月才学会一门编程语言,而一个有经验的程序员可以在几天内熟悉一门新的编程语言。
理想情况下,所有程序员都应具有多种语言的经验。一旦你对一种语言感到满意,就可以继续使用另一种在某些基本方式上有所不同的语言。随着学习更多语言,你将变得更有能力为手头的任务选择合适的工具,这是优秀程序员的标志。由于编程概念至关重要,因此我建议初学者从下表中选择一种主流语言。所有这些语言使初学者可以开始编写简单的应用程序并练习编程,而不必使用任何更复杂的语言功能。
如果你已经有了项目和目标,并且将自己的技能应用到要解决的问题上,你将会学的更快。下面是一些常用编程语言的说明,能够让你有更多的选择。
如果看了这些你仍然觉得迷茫的话,那就不妨使用一门简单易上手的编程语言 Python,Python 是一种良好的,适合初学者的语言,拥有一个庞大的社区和许多库,可以执行几乎任何你想做的事情,从制作游戏到在家中或工作场所中使事情自动化,从进行数据分析到制作网站等等等等。在进入更复杂的应用之前,你需要找到一些好的学习资源
那么我在哪里能找到这些资源呢
下面我为你列出了一些资源获取途径
图书,学习任何一项技能前,看书都是一种最有效的途径,也是我最推荐给你的途径,因为我本身就喜欢看书,囤书也是我的一种乐趣。
免费的编程书籍,这个 github 上列出来的几乎包括所有编程书籍了,我看完之后大呼过瘾!!!https://github.com/EbookFoundation/free-programming-books/blob/master/books/free-programming-books-zh.md#java ,英文版的如下 https://github.com/EbookFoundation/free-programming-books/blob/master/books/free-programming-books.md
一些适合于初学者的书籍
C#:Rob Miles 撰写的
小黄书
http://www.csharpcourse.com/ - 面向初学者的 C# 编程。Python: Al Sweigart's 编写的 《Python 自动化》系列 http://automatetheboringstuff.com/,也有中文译本,即 《Python 编程从入门到实践》
同样是 Al Sweigart's 编写的 《Python 发明》系列 http://inventwithpython.com/,该书通过使用Python和Pygame创建计算机游戏来教授编程。
Abelson and Sussman 编写的《计算机程序的构造和解释》,下面是编程网站 https://mitpress.mit.edu/sites/default/files/sicp/index.html
Python 编程游戏 http://programarcadegames.com/
C 语言:c primer plus ,这是一本入门 C 语言非常经典的好书
C 语言程序设计,同样是一本经典好书,虽然书籍不厚,但是浓缩的就是精华啊!!!
Java :Head First Java,这是入门 Java 最最最简单的一本书了,没有比这个再简单的了。事实上 Head First 系列都可以作为入门书籍
Java 核心技术卷一(卷二作为提高),可以看完 Head First 在看这个系列。入门 Java 就这几本书就够了。
C++:那必须还是 C++ Primer Plus 了,学习 C++ 一些常见的问题可以参考这里 https://www.reddit.com/r/learnprogramming/wiki/faq_cpp
除此之外,一些权威 C++ 书籍和指南都在下面这个链接中了 。https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list
一些权威 C 语言书籍和指南都在下面这个链接中了。https://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list
这是一些推荐给开发者们的读物 https://blog.codinghorror.com/recommended-reading-for-developers/
每个程序员都应该读的最有影响力的书籍是什么 https://web.archive.org/web/20150518004457/http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read
算法书籍推荐:市面上有很多关于算法的书籍,最近非常火的《labuladong 的算法小抄》,通俗易懂的《小灰的算法之旅》等等,不过我这里只说两本最经典的算法书:《算法导论》和《算法第四版》
在线资源:我下面会推荐一些优质的编程资源,这些编程资源都是非常好的教程,走起!
编程社区:在线编程练习社区 https://hackr.io/
C#
C# 在线编程练习社区 ,还有什么会比微软更权威的呢?https://dotnet.microsoft.com/learn/dotnet/in-browser-tutorial/1
C# 体系化的优质教程,当然离不开 Tutoriaispoint 了。https://www.tutorialspoint.com/csharp/index.htm
C# 优质编程练习网站 https://www.learncs.org/
Ruby:学习 Ruby 这里给你推荐三个网站:https://rubymonk.com/ 、https://www.pluralsight.com/search?q=ruby、http://hackety.com/
JavaScript:学习 JavaScript 这里给你推荐两个网站资源:https://www.codecademy.com/、https://eloquentjavascript.net/
Java
还有什么能够比官网更权威的呢?https://docs.oracle.com/javase/tutorial/
Java 最大的特点就是面向对象的设计思想,这里你可以参考赫尔辛基大学(没听过?就 Linux 他爹的那个学校)https://www.mooc.fi/en
John Purcell 的 Java 初学者免费版 https://courses.caveofprogramming.com/p/java-for-complete-beginners、https://www.udemy.com/course/java-tutorial/、https://www.youtube.com/playlist?list=PL9DF6E4B45C36D411
这个作者有一些多语言的教程 https://www.youtube.com/channel/UCwRXb5dUK4cvsHbx-rGzSgw/playlists
Java 设计模式和体系结构,参考 John Purcell https://www.udemy.com/course/java-design-patterns-tutorial/、https://courses.caveofprogramming.com/p/java-design-patterns-and-architecture
Python:你可以翻阅 https://www.reddit.com/r/learnpython/wiki/index 找到更详细,更全面的资源列表,尤其是 https://www.reddit.com/r/learnpython/wiki/index#wiki_new_to_programming.3F 对新手更友好的部分。
Web 学习
Web 学习包括一些前端内容,这个网站很不错 https://www.snoopcode.com/
CSS 3 https://css3please.com/
我爱 PHP ,哈哈哈哈 https://ilovephp.jondh.me.uk/en/tutorial/make-your-own-blog
Web 发展的介绍 https://www.thesoftwareguild.com/coding-bootcamps/introduction-web-development/
精选编程资源,这个 github https://github.com/Michael0x2a/curated-programming-resources/blob/master/resources.md 非常不错,精选了很多非常优质的编程语言资源
没有上过好大学,是不是就意味着自己没有
竞争力
了?当然不是!这个网站 http://www.infocobuild.com/education/audio-video-courses/ 汇总了很多优质的大学课程CS 是一门艺术,而这门艺术你完全可以达到
无师自通
,据我所知 99.9% 的大学对于 CS 的讲授都是一塌糊涂,其中不乏清华北大等高等学府,我 B 站也听过一些视频,讲的真实一言难尽,所以,最靠谱的还是自学,这里有个 github https://github.com/ossu/computer-science,这其实也是一门课程,只不过这个课程就叫做计算机自学课程。
如何提高
如何从开始过渡到中等水平
当我刚开始入门的时候,我也有过这种现象,那就是现在该做什么了?这种情况当你读过一些书籍和教程解决过世纪问题后尤甚,但是最终很难从理解 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 种语言,那么为什么不学呢?又有谁阻止你去学了?那还不是你的担忧和恐惧来阻止你的吗?还有一些诸如下面的问题
我太老了,还能编码吗
不,你可以在任何年龄学习编程,并且可能会从事该职业。
我们现在经常会出现 35 岁危机问题,事实上这个问题在各行各业都会出现。上周我家搬家了,和搬家工人聊起来,他已经 40 岁了,还在做搬家工作,要知道这种工作就是体力活,他也很担心没几天就被老板以身体原因开除了。过了 35 岁,身体机能下降是企业衡量用人的最大考虑因素,那么有没有 35 岁不被辞退的现象呢?有,所以就有类似于拿到拼多多和国家电网的 offer,该选哪个的问题。
还有就是,为什么会担心 35 岁危机呢?那是因为你的工作具有可替代性,如果你是一个公司的架构师,公司的核心架构是你搞的,你觉得公司会开除你吗?可能会,因为公司快倒闭了。。。。。。这当然都是意外情况,不可控制。
so,我们担心的 35 岁危机,都是因为我们不想再学了,想摸鱼赚点钱了,但是企业可不这么认为,他们如果不发展就会被替代,那么企业为什么会花大价钱养你呢?这里我并不是说要和企业同流合污,但是你总要知道我们为什么会有 35 岁危机。
一个普遍的神话是,擅长编程的唯一方法是从小就开始学习编码。这是错误的 - 虽然有些人开始早点学习编码(因此可能会有一些先发优势),但大多数人在上大学或以后会开始学习编码。所以什么类似于让孩子赢在起跑线上,只是抓住了一些家长的弱势心理,潜台词就是你的孩子不早点报班,从小就不如其他孩子优秀,而家长们都是心疼孩子的,既然家长们抓住了这个心理,那么培训班能不赚钱?
然而学习是任何年龄的人都可以做的事情 - 不要专注于他人,只专注于自己和个人的进步速度。这篇文章会很有用 https://www.edglossary.org/growth-mindset/
还有一些朋友喜欢问下面这些问题
有什么我首先应该学习的吗
编程的前置条件很少,唯一的先决条件是
你知道如何打字
你拥有一台电脑,并且你的电脑能上网
你知道如何独立搜索答案
OK 就这些,有了上面这几点你就可以直接编程,如果你知道一些数学知识,最多不用超过基础代数;并且你有基本的英语功底,那当然是锦上添花的事情。
如果你想获得大学的正式学位,以上所有这些都是差不多的。大多数大学和学院都希望入学的学生对计算机科学和编程一无所知,并且会从头开始教你(尽管在某些情况下,如果你通过测试或证明有足够的先验技能,则可以跳过一两个入门课程)。如果你是高中或更早的学生,并且想在大学学习计算机科学,那么最好提前开始学习以取得良好的开端。
我必须精通数学吗
不一定,编程和计算机科学是一个广阔的领域,你是否需要精通数学取决于你选择专门研究的学科。
例如,某些编程学科确实需要很强的数学技能。2D 和 3D 戏将频繁使用向量,矩阵和线性代数;数据分析和机器学习利用了统计和微积分中的许多概念;如果你对代数和基本演算有很好的了解,则计算算法的复杂性将变得更加容易。
通常,主题越高级和复杂,就越有可能需要扎实的数学基础。如果你的目标是能够解决这些类型的复杂问题,那么拥有良好的基础将是无价的。
但是,正如计算机科学和编程的许多方面都不需要对数学有深入的了解。你真正*需要知道的唯一事情是如何加,减,乘和除,也许还有一些基本的代数。许多程序员在整个职业生涯中几乎不需要做任何数学运算。
特别是,许多面向产品的角色(例如,Web 开发,移动开发)只需要很少的数学知识。在这些子学科中,最重要的是你编写健壮和可维护的代码的能力,以及找出如何构建对用户有价值的东西的能力。
无论如何,如果你不太擅长数学,那么你绝对可以学习和提高!毕竟,你可能也不是很擅长编程,但是你正在学习编码。
确切地说,CS 学位在数学上的差异会因学校而异。一些学校过分强调涵盖理论,而另一些学校则不再强调两者,而只注重应用。(有些学校同时强调两者)。如果你想了解更多信息,则应直接调查你有兴趣参加的任何学院或大学的学位要求和结构。
总而言之,如果你想成为一名成功的开发人员,则不一定需要精通数学。如果你想成为计算机科学家,你最终将学习大量的数学。如果你想解决更棘手的问题/在某些领域内,那么数学可以是一个很有用的工具。
编程难吗
编程也像大多数技能一样,学习基础知识并应用它们相对容易。但是如果你想成为一名竞争性的保龄球手,你将需要花费数年时间来掌握这项技能,编码也是如此:你将需要花费很多时间来弄清楚为什么即使你已经检查了三遍,这个愚蠢的程序仍然无法运行。。你将需要阅读书籍,坐下来上课,并与人们讨论解决办法。
这就是上手非常容易,但是钻研一个领域,学的越来越深之后会非常难。
初学者在问题和练习上遇到麻烦是正常的吗
我不想给你显而易见的答案。
初学者几次从自行车上摔下来是正常的吗?学习游泳时,初学者沉没几次是正常的吗?对于初学者来说,在学习乐器时遗漏音符或演奏错误的音符是正常的吗?在健身房锻炼时,初学者想要练胸却练的是三头是正常的吗?
绝对没错!
失败和煎熬是学习过程中非常重要和自然的部分。每个初学者都会经历失败和煎熬。因此,您不要灰心,而应该拥抱让你煎熬的事情:奋斗是你正在挑战自己的标志。使用它作为指南,可以帮助你弄清楚下一步需要阅读和学习的材料,或者应该问什么问题。
甚至专家在需要学习新东西时也会失败和挣扎(尽管他们往往更善于恢复/利用失败作为帮助他们加快学习速度的一种方式)。
事实上,如果你没有经历煎熬,那么可以表明你肯定在做错事。如果一切都很简单,那就意味着
你不是在挑战自己
你不是在强迫自己学习真正的新东西
你并不会强迫自己通过尝试应用它来真正确保你了解它
这类似于锻炼。如果你在锻炼后不感到身体疲劳,那么你真的得到锻炼了吗?同样,如果你在完成一些编码挑战后没有精神疲倦或精神上的挑战,那么你真的学到了什么吗?
有关学习的问题
我刚刚开始学习语言 X,是否应该开始学习语言 Y
尤其是当你开始学习编程时,最好学习一种语言并坚持使用一段时间,即使特定的问题使用了你尚不知道的特定语言。一旦了解了基础知识(流控制,错误处理,I / O,算法的实现,数据结构等),你就可以开始考虑使用不同的语言了。
我是否应该一次学习一种以上的编程语言
除非你有充分的理由,否则大多数初学者应该只使用一种语言至少几个月。由于以下几个原因,这是一种更有效的学习方法:
大多数语言的基础知识都非常相似。例如,大多数语言以几乎相同的方式处理 if 语句。花时间学习两种基本的语法不一定是一种好的习惯,并且可能会使初学者感到困惑。
学习如何编程的最困难部分不是学习编程语言的工作方式:而是学习如何解决代码问题。因此,你要想最大化地利用时间来练习代码解决问题,而不是花费更多的时间来学习特定于语言的细节/必须浪费脑力来跟踪语言之间的差异。
一旦你精通第一门语言并具有很强的解决问题的能力,选择第二种语言就容易得多。
有一些例外情况,你可以直接学习第一语言和第二语言
第二种语言不是编程语言。例如,最好与编程语言(例如 C,C ++,C#,Java,JavaScript,Python,Ruby)一起学习标记语言(例如 HTML 或 CSS )。
对于你感兴趣的各种项目都是必要的。保持自己继续学习的动力很重要,如果那意味着一次学习两种编程语言,那就这样吧。
如果你有专门的老师或指导者来指导你。称职的老师和导师可以极大地简化你的学习过程,这将足以弥补效率低下的问题。
如果你不认为自己是初学者,并且对使用编程语言来完成中等复杂的项目感到满意,那么尝试一次学习多种语言当然是不错的选择。在这一点上,你应该对编程有足够的了解,以便以更快的速度开始学习新语言,并且应该对自己一次学习多少有一个很好的认识。
如何获得/保持学习编程的动力
这个问题最好看看其他人是怎样做的
http://redd.it/uzt31
http://redd.it/1c1bnj
http://redd.it/2j6b7i
http://redd.it/1s347g
http://redd.it/javfv
http://redd.it/gy0xa
http://redd.it/1xvdte
http://redd.it/1hh76b
如何使用 X
我如何开始制作视频游戏
现代的视频游戏是使用游戏引擎制作的 https://en.wikipedia.org/wiki/Game_engine:比如处理诸如图形,声音,物理和网络等复杂任务的软件库 https://www.reddit.com/r/gamedev/wiki/engine_faq,但是强烈建议初学者使用以下引擎,因为它们可以自由开发,并且具有学习的最佳文档:
Unity(C#):适用于 2D 和 3D 移动,桌面,浏览器/在线和控制台游戏
Construct2(JavaScript):适用于 2D 移动版,台式机,浏览器/在线
Pygame(Python):2D 桌面游戏的引擎
LÖVE(LUA):适用于 2D 桌面游戏
永远记住你的目标是开发游戏,而不是开发游戏引擎。
引擎可以帮助你开始使用游戏的图形和用户控件,但是你仍然需要彻底学习编程语言来编写游戏逻辑 ,因此,请选择我上面给你推荐的图书或者在线资源。
最重要的是:从简单开始。您可能会想直接潜入水中并立即创建自己的梦想游戏,但请记住,爬山的唯一方法是采取许多小步骤 https://www.reddit.com/r/gamedev/comments/stg2o/how_i_went_from_knowing_nothing_about_programming/ ,以下是按难度升序列出的简单练习游戏的列表:
猜数字游戏 https://www.funbrain.com/games/guess-the-number
二十一点 https://en.wikipedia.org/wiki/Blackjack 或者井字游戏https://en.wikipedia.org/wiki/Tic-tac-toe
猎杀乌贼 http://www.ifiction.org/games/playz.php?cat=&game=249&mode=html 规则 https://en.wikipedia.org/wiki/Hunt_the_Wumpus
选择自己选择的冒险或 Zork https://en.wikipedia.org/wiki/Zork 克隆
Pong,Tetris或 Minsweeper 克隆
水平/垂直滚动空间射击游戏
简单的《毁灭战士》,《马里奥》或《塞尔达传说》
如何开始制作网站/制作 Web 应用程序/进行网站开发
了解 Web 开发的方法有很多,但是通常你需要掌握的核心技能通常分为前端技能(在用户的 Web 浏览器上运行的代码)和后端技能(在服务器上运行的代码)。
通常,大多数人会建议你先学习 HTML,CSS 和 Javascript(按此顺序),这是在每个 Web 浏览器上运行并组成每个网站的三种核心语言。
你可以在 https://www.reddit.com/r/webdev/wiki/faq 上找到更多信息。这是面向初学者的另一套在线课程、教程和资源列表 https://github.com/Michael0x2a/curated-programming-resources/blob/master/resources.md#html-css-and-javascript。
如何开始制作移动应用程序/ Android 应用程序/ iOS 应用程序/ Windows Phone应用程序
你将需要为每种类型的智能手机学习不同的编程语言。
Android 应用主要使用 Kotlin 或 Java 进行编码-有关更多信息,可以查阅 https://www.reddit.com/r/androiddev/wiki/index
iOS 应用程序使用 Objective-C 或 Swift 进行编码-有关更多信息,可以查阅 https://www.reddit.com/r/iOSProgramming/ 或者 https://github.com/thomasdenney/FAQ
Windows Phone 应用程序使用C#,Visual Basic 或Javascript 进行编码-有关更多信息,可以查阅 https://www.reddit.com/r/WPDev/
你还可以使用Phonegap和Titanium等技术制作可以在所有三款主要智能手机上运行的应用程序-它们使你可以使用 HTML,CSS 和 Javascript 编写应用程序一次,并可以在任何平台上运行该应用程序。
有关更多信息,可以查阅移动应用程序开发资源列表 https://www.reddit.com/r/learnprogramming/wiki/online#wiki_mobile_app_development
但是,请记住,上述资源中的许多都是针对已经具有一些编程经验的人。如果你以前从未编程过,则可能要开始学习一种语言,该语言拥有更多的资源供初学者使用。一旦获得了一定的经验,并了解了编程背后的基本概念,你通常会发现学习一种新语言并开始学习移动开发要容易得多。
如何使事情自动化
对于 Windows,有两种专用的编程语言,例如 Autohotkey 和 AutoIt。
另一个可行的跨平台替代方法是 Python https://www.python.org/,使用 Python 更容易构建自动化并完成一些无聊的 working http://automatetheboringstuff.com/
如果要自动化 MS-Office,请使用内置的编程语言Visual Basic for Applications(VBA)https://www.reddit.com/r/vba 专门用于 VBA 编程。
什么是最最最最最最好的
这篇文章 https://www.reddit.com/r/learnprogramming/comments/3r7lhp/a_collection_of_150_what_are_the_best_dev/ 汇总了 150 涉及什么是"最好的"问题和答案,包括语言工具和主题。
术语和词汇
计算机科学,计算机工程,软件工程,编程和编码之间有什么区别
计算机科学(CS),计算机工程(CE),软件工程(SE),编程和编码都是相互关联的术语,但彼此之间有微妙的区别,这通常使初学者很难区分它们。
你应该做的第一个区分是区分CS / CE / SE和编程/编码。CS,CE 和 SE 都是研究领域,说“我正在学习计算机科学”将类似于说“我正在学习化学”或“我正在学习文学”。相反,编程和编码是活动-它们是您要做的事情。要使用隐喻,学习 CS / CE / SE 就像学习音乐理论,而学习编程/编码就像学习如何弹奏特定乐器。
从理论上讲,你可以学习一个而不能学习另一个,但是如果你同时学习两者,那么你的经验将更加丰富。
另一个区别是,虽然 CS / CE / SE 是你可以学习的东西,但是学习编程只是通过实践才能实现的。实际上,大多数大学和学校将要做的是正式教授一种语言以教授编码的基础知识,然后将重点放在 CS,CE 和 SE 的教学上,让学生学习如何通过练习和完成家庭作业来编程。
CS vs CE vs SE
你应该在 CS,CE 和 SE 之间进行下一个区分。简而言之,尽管有很多重叠之处,但“计算机科学”与计算机或科学无关,而更多地是研究可计算性概念的应用数学领域。计算机工程与 CS 类似,但倾向于将重点更多地放在低级硬件上,就像计算机科学和电气工程之间的交叉。最后,软件工程更多地是关于如何构建大型而复杂的程序,同时防止因为一些因素导致软件崩溃,软件工程理论较少。
关于这三个概念的论述,你可以在 https://www.reddit.com/r/learnprogramming/comments/2k569h/eli5_computer_science_vs_software_engineering_vs/ 找到更详细的。
编程与编码
最后,编程 vs 编码,这两个术语之间的差异很小-许多人可以互换使用它们。通常,术语“编程”似乎比“编码”具有更积极的含义。如果你说“我是程序员”,则表示你具有一定的专业水平-这表示你不仅可以编写代码,而且对基本原理和理论有扎实的了解,知道如何与客户沟通和工作与其他人等。
相反,如果你说“我是编码员”,则通常意味着你的注意力仅集中在编写代码上,而其他方面则更少。
但是,这里的不同含义仍然很小 - 在绝大多数情况下,您可以互换使用这两个术语。
C,C ++,Objective-C 和 C#有什么区别
C 语言是这些语言中最小和最早的一种。它最初是作为 Unix 操作系统的系统编程语言创建的,如今仍广泛用于应用程序编程。
C++ 是一种非常流行的通用编程语言,最初是基于 C 的。通过一些调整,大多数 C 代码都可以编译为 C++ 代码。但是 C++ 添加了大量语言功能,这些语言功能与使用 C 的方式相比,大大改变了使用该语言的方式。用 C++ 编写 C 风格的代码通常被认为是不好的做法。
Objective-C 是 C 的严格超集,这意味着所有有效的 C 代码也是有效的 Objective-C 代码。Objective-C 的普及程度不及 C 或 C++,它目前主要用于 Apple OS X 和 iOS 平台的开发中。
从任何技术意义上讲,C# 都不基于C。C# 是 Microsoft 设计的通用语言,在许多方面与 Java 相似。它可以编译为在虚拟机中运行的中间形式,这与之前的三种语言都被编译为本地机器代码不同。尽管 C# 借鉴了 C 和 C++ 的语法元素(就像 Java一样),但它与这些语言没有真正的技术关系。
Java 和 JavaScript 有什么区别
很多人经常会把 Java 和 JavaScript 搞混,其实这两者语言除了叫法有点关系外, Java 和 JavaScript 在任何技术意义上都不相关。它们共享一些语法,因为它们都受 C 的影响,仅此而已。Wikipedia 很好地解释了为什么存在名称相似性:https://en.wikipedia.org/wiki/JavaScript#JavaScript_and_Java
工具和版本控制
什么是源/版本/版本控制?我应该使用它吗
软件开发是一项协作的技能。版本控制系统(VCS)是一种可跟踪代码更改的工具,可让你执行诸如撤消编码错误之类的方便工作,并查看代码随时间的变化。现代分布式版本控制系统(DVCS)还使您可以轻松地与其他程序员使用同一代码。应该说你绝对应该使用版本控制系统!
目前最受欢迎的应该就是 git
了。
你可以通过阅读 git 入门 https://cgordini.blogspot.com/2013/05/git-101.html 以及免费的 gitbok https://git-scm.com/book/en/v2 来使用 git。
当然廖雪峰的 git 讲解的也非常好 https://www.liaoxuefeng.com/wiki/896043488029600
什么是 IDE,我应该使用吗
IDE 是一个集成开发环境,它是一个 GUI 应用程序,通常包括带有代码完成和语法突出显示功能的文本编辑器,一些项目管理功能,一个编译器或解释器(可配置或包含)以及许多其他用于编写的精美功能。运行和测试代码更加容易。使用 IDE 的替代方法是自动自行执行 IDE 为你执行的操作。此方法要求程序员使用单独的工具,并且对开发过程有更深入的了解。
对于初学者来说,这两种开发方法都有争论:
使用 IDE 意味着你不必对开发过程有太多了解,不必使用命令行界面,也不必配置这些工具即可正常工作。IDE 提供了一种快速的方法来建立代码,甚至可以为你编写一些代码!
另一方面,从命令行工作意味着您不必适应 IDE 设计人员的思维方式,并且由于隐藏了更少的开发过程,因此你可以更好地了解软件构建过程。
使用 IDE 而不是使用单独的工具通常取决于个人喜好(除非你的雇主/学校当然需要使用特定的开发环境)。如果您以前从未使用过 IDE,请下载一种流行的 IDE 并进行修改。而且,如果您从未使用过命令行中的 vim 或编译的代码,请尝试一下,看看你是否喜欢它。
常见的 IDE 和轻量级文本编辑器都可以在 https://www.reddit.com/r/learnprogramming/wiki/tools 中找到。
电脑和操作系统
我应该使用哪种操作系统
许多初学者经常遇到的一个问题是,他们应该使用哪种操作系统 - Windows,Mac 或 Linux。
坦白地说,这无关紧要 - 在当今时代,你可以使用的工具的质量和成熟度在所有平台上都将大致相同,并且任何完善的编程语言都将在所有操作系统上使用。
话虽这么说,你最终应该对这三种操作系统有一定程度的了解,以免遇到新的操作系统不知所错。
这个规则有两个例外
如果要在 Windows 平台上开发,请选择 Windows 计算机
如果要在 Mac 或者iOS 平台上开发,请获取 Mac 计算机
某些 Microsoft 和 .NET 工具仍主要针对 Windows。
虽然可以在任何计算机上开发 Mac 和 iOS 应用程序,但必须在 Mac 机器上使用 Xcode 来编译应用程序并将其提交到应用程序商店。
最后,还值得注意的是,如果我有一台 Windows 计算机,那么设置一个我可以使用的 Linux 虚拟机将非常容易,而不必担心它会干扰我现有的 Windows 操作系统。
我应该选择什么样的电脑/笔记本电脑
同样,这并不重要 - 任何中档笔记本电脑或计算机都可以。如果你已经拥有一台计算机或笔记本电脑,则应该使用它而不是购买新计算机。基本上,你可以学习编程,并且可以在现有的几乎所有计算机上编写复杂而有趣的程序。
但是,如果你碰巧需要购买一台新计算机并想将其用于编程,则应优先选择 CPU,RAM 和硬盘驱动器。如果可能,请尝试获得具有以下规格或更高规格的计算机:
英特尔 i5 CPU(3.0+ GHz)+
4 GB以上的 RAM
200 + GB硬盘
(可选)固态驱动器
如果你可以升级,则优先考虑获得更好的 CPU 和更多的 RAM 而不是获得更大的硬盘驱动器 - 更加强大的 CPU 总是有帮助的。
如果你想购买台式机,那么这些规格实际上是唯一相关的规格。如果你希望具有便携性,则应购买一台笔记本电脑,并确保其配备足够大的屏幕和键盘,以方便进行编程。但是,便携式计算机的可用性和可移植性之间达到了很好的平衡:
屏幕越大,电池寿命越短(但你愿意设置屏幕亮度的调光器,电池寿命越长)
屏幕越小,可以容纳的空间就越少,并且必须在 Windows /桌面之间进行更多的翻转。
理想情况下,你应该能够舒适的使用两个窗口
笔记本电脑越大,重量越重,随身携带的重量也越重
还还需问你自己,你打算如何使用笔记本电脑。你是否打算整天坐在办公桌上,还是将其随身携带在校园中。
如果你对机器学习,自然语言处理或图形(包括游戏开发)特别感兴趣,则可能要考虑购买配备 GPU 的机器。尽管不需要 GPU 来执行任何这些操作,但是你通常可以通过仔细编写代码来加快代码的速度,从而尽可能地利用GPU。
如果您对机器学习或 NLP 感兴趣,你可以通过相对便宜的价格通过 Amazon Web Services(AWS)或 Google Compute Engine(GCE)等服务在云中租用带有 GPU 的机器。
职业和工作
程序员赚钱吗
这个因人而异,现在 360 行行行转程序员,导致这个行业的门槛越来越低,所以一般程序员大家的薪资水平差不多,互联网的薪资相比传统行业会高不少,但是互联网对于程序员的要求也相对较高。
如何进入该行业并获得入门级工作
前提假设是你已经掌握一门语言并知道如何进行编码,获得入门级工作主要有两个阶段
制作出足以使 HR 开始邀请你面试的简历
通过面试
这两个阶段需要一些不同的策略。
阶段1:建立引人注目的简历
在第 1 阶段中,你的目标是稳步开始向简历中添加可帮助你脱颖而出(或至少可以使你与其他正在申请的申请人相媲美的项目)。
为此,一项特别有用的策略是开始构建可以向潜在雇主炫耀的项目组合。
独立副业
志愿工作,比如为一些非营利组织建立网站
课堂项目
你在工作中所做的工作,找到了整合编程的方法
研究独立的项目,或者你在学校实验室中做过的研究
过去的工作或实习项目
拥有强大的项目组合可以使雇主成功地运用编程语言,库和技术来解决问题,并为他们提供一种更准确地评估你的技能水平的方法。
一些注意事项
你的项目不一定需要外观华丽。具有技术背景的招聘人员会明白,不是所有的有趣的项目已经或需要一个漂亮的界面。更重要的是你能描述清楚你所做的工作,你所负责的事情,从而展现你所做工作的复杂性
也许主要的例外是,如果你申请的职位需要一些视觉才能。例如,如果你要申请前端 Web 设计师角色,那么拥有一些可以显示出可以打造美观且可用的网站的项目会有所帮助。
当然,从事项目并不是你唯一可以做的事情。诸如获得学位(最好是与计算机科学相关的学科)之类的事情也肯定会有所帮助。
有些人还参加训练营,以部分加快建立相关简历/作品集的过程。只需确保在参加训练营之前先做一下研究:有些很棒,有些甚至是彻头彻尾的骗局。这个需要你自己
甄别
。
阶段 2:通过面试
这个过程就需要你和面试官真刀真枪的干架
了!不过面试主要分为两种:传统软件行业和互联网公司。一般传统软件公司或者一些互联网公司会问一些你能不能快速上手解决问题的面试题,而一些顶尖的互联网却喜欢专注于基础知识和框架的深度使用
你可能会遇到的一些常见面试原型包括:
给你带来某种形式的编码挑战,通常是关于数据结构和算法的挑战,一般俗称
刷题
。你可以在牛客网或者 LeetCode 进行刷题。向你询问与面试的特定职位有关的问题-例如前端网页设计,网络安全,中间件原理,JVM 原理,框架深度使用等
要求你尝试设计一些较大项目的体系结构
向你询问简历中列出的项目(有时,通常是有时深入关注单个项目)
只是一般地讨论技术
总结
这一篇内容内容我为你介绍了小白新手如何学习编程、一步一步到高级程序员会经历哪些步骤,为你罗列了非常多优质的编程资源,以及学习中国的困惑,如何提高,在最后为你解释了一些编程中常见的问题,简历都需要注意哪些等等。
这篇内容相当于是一个使用说明手册了,你可以按照这个路线来一步一步规划你的编程生涯。最后祝你早日成为大牛(形容这个程序员的水平非常高)。
完
往期推荐
🔗
另外,cxuan 肝了六本 PDF,公号回复 cxuan ,领取作者全部 PDF 。