在 IT 工程师和培训机构多如牛毛的时代, 拜师学艺并不难但自学编程对于毫无基础的同学来说却可能是个问题, 相信有过类似经历的朋友都有一把辛酸泪和一肚不吐不快的体会让我们从一个故事说起
故事
某君在一个普通大学读着自己不喜欢的专业, 以打游戏刷段子和睡觉度日, 突然有一天想学点什么学编程好像挺酷, 而且听说 IT 行业充满了机会, 没准一不小心就和大佬一起改变世界了
那么第一个问题来了, 他该选择什么语言?
是世界上最好的语言 PHP? 还是语言之母的 C? 幸好还知道个编程语言排行榜, 找到一看几十种不带重样, 这要逼死天秤座的小朋友选 PHP 吧? 上非诚勿扰都要被灭灯, 而且就只能做个网页万般纠结之后我们选 C 吧, 听起来既高级又底层, 说不准还能考个计算机二级
接下来得干正事儿了在这个便捷的网络时代, 自学可选择的方式非常丰富除了在网络上收集资料阅读干货外, 某君还向一些前辈咨询了自学的方法
网络上流传的编程学习方式有:
看书 (这是最容易想到的方法)
观看视频教程
阅读官网文档
读源码
到大学蹭课或者报名培训 (不知道还算不算自学, 没交学费都算吧?)
某君又得纠结一番了, 大学蹭课和培训并不一定有合适条件, 且不符合自学的气质; 观看视频教程, 前辈们觉得比较 low; 阅读官网文档和源码, 这不适合初学者总得来说看书算是比较中肯的方法, 至于看什么书呢, 前辈推荐了 C Primer Plus, 据说是学习 C 语言的经典之作
好吧, 不再纠结, 直接啃这本大部头, 虽然有人说看原版好一些, 但是实在能力有限, 还是看中文版吧一口气花了一周时间读完这本书, 果然是经典, 变量语句条件判断甚至指针都知道怎么回事了
某君决定按照书中的说法实践一下了, 于是打开了记事本, 折腾很久装了 GCC, 把书上的第一个例子抄了下来, 在控制台的小黑窗输出了 Hello World, 成就感满满决定上手写点高级的的东西一试身手, 合上书咦, 为什么会报错? 哦, 原来少个分号不禁陷入思考: 为什么学了两个月还是只能在这个黑窗口算算秋水仙数? 网友还说要看官网文档要读源码要看英文原版, 我一样都不能做到, 我一定是能力不够, 编程果然是天才做的事情
正经话
上面的故事是我编的, 但其中的纠结却是自学者或多或少都经历过的实际上, IT 从业者并不像传说中那样需要天才般的智商, 要点在于能否找到合适的入门途径, 再加上一点点坚持和思考比较可惜的情况是一些人没能找到适合自己的学习方法, 并在纠结和碰壁后失去信心, 然后沮丧的认定自己并不适合干这行学编程很多时候就是一个趟坑的过程, 但不是每一个坑都有必要趟, 写这篇文章的目的是希望能够帮助初学者尽量少趟一些坑
IT 世界的地图
初学者遇到的一个典型问题是对 IT 世界没有一个大的图景比如大多数的 Java 书籍, 教完你基础语法知识和秋水仙数的求法后就结束了, 并没告诉你接下来能干什么我曾经为此感到非常困惑, 学完 Java SE 后做了一个非常简陋的 GUI demo, 就失去了后续的 Java 学习方向, 带着对 Java 的偏见, 这成为了我一段令人沮丧的学习经历关于这个话题一本书可能都不够, 简单来说, 我尝试从计算机科学知识和技术实践两方面来聊聊成为一名 IT 工程师需要具备哪些东西
计算机科学基础
首先初学者要具备一些非常基础的知识, 这些知识在你踏上工作岗位后能被实际的用到, 比如计算机运行原理网络的传输常用数据结构和算法等这部分属于计算机科学, 也是应该被计算机专业本科课程涵盖的, 不要伤心错过了大学本科的相关课程, 我会分享一些有用的资源
这里我罗列了一些计算机专业的学生一般需要学习的课程, 当然每个学校专业设计都不一样, 甚至采用的教材名字也不一样, 仅供参考大学计算机科学课程往往包括: 高等数学离散数学电子电路数据结构程序设计计算机组成原理编译原理计算机网络软件工程数据库原理等有些学校会有一些额外的课程, 例如通信原理汇编语言线性代数 C 语言 Java 语言等
图片来源于网易 - 计算机专业的课程体系
尽管 IT 行业知识更迭非常快, 但是基础知识并不容易过时, 因此有大量的资料可以选择可以选择从计算机经典丛书系列开始, 比如佛罗赞和莫沙拉夫的计算机科学导论, 甚至可以阅读一些计算机科普类读物例如穿越计算机的迷雾另一种直观的方式是观看大学精品课和去跟慕课课程, 比较推荐的有几个:
中国大学精品开放课程, 高等教育出版社的精品课程项目, 有全国大量的名校授课视频和课件
中国大学 MOOC , 这个是中国大学 MOOC 和网易合作的, 提供了上文附图中计算机课程体系中所有课程
果壳网的 MOOC 学院, 主打翻译全球名校的优秀课程, 比如斯坦福的编译原理和 MIT 的 Python
从知识到实践
除此之外, 还需要了解实际应用于设计软件或者开发网站中的实践类知识, 包括某个特定语言以及周边的库框架和工具等 我们可以把特定需求中用到的语言库和框架以及其他的工具称为技术栈, 在技术选型上通常也是被这样考虑的, HR 常常会根据技术栈来寻找需要的工程师比如需要学习 SSH 三大框架和 Java 的 Java 技术栈; 为服务器 web 开发而生的 PHP 技术栈; 在移动开发领域流行的 iOS 安卓技术栈等当然这里面有一些重合和共用的技术也需要学习, 比如版本管理器 GitSVN 就是每个合格的工程师需要去学习的
换句话说, 大学课程主要定位在上面说到的计算机科学基础知识, 而市面上的培训机构主要是告诉你在怎么在实际工作中运用, 所以大学和培训机构都有他们的价值
想要更加详细的了解这部分内容, 这里有一些开源的技能图谱可以参考:
图片来自: http://skill-map.stuq.org/
如何挑选你的兵器?
在介绍完计算机领域的大致图景后, 就需要选择一门合适的编程语言, 一个较为形象的例子是把编程语言比喻成兵器, 因为我们深知编程语言对于工程师而言是实实在在的工具, 我们不是为了学它而学, 学编程不仅仅是学语言特性, 一般来说我们也不用知道赋值语句像茴香豆蔻的茴字有四种写法
当然语言之争从来没有停止过, 如果把编程语言比喻江湖武器的话十分有趣
C 语言是 M1 式加兰德步枪, 很老但可靠
C++ 是双截棍, 挥舞起来很强悍, 很吸引人, 但需要多年的磨练来掌握, 很多人希望改用别的武器
Perl 语言是燃烧弹, 曾经在战场上很有用, 但现在很少人使用它
Java 是 M240 通用弹夹式自动机枪, 有时它的弹夹是圆的, 但有时候不是, 如果不是, 当你开火时, 会遇到 NullPointerException 问题, 枪会爆炸, 你就会被炸死
JavaScript 是一把宝剑, 但没有剑柄
来自网络
老实来讲 IT 行业的最终目的是交付可用的软件, 编程语言也是适应市场的这对于初学者或许有些残酷, 在工作中我们发现最好的语言是用来处理工作任务或者构建合适的应用, 并不是出于爱好或者某种 Geek 精神
对于初学者而言, 在选择合适的入门语言时至少需要考虑两点:
是否能适用于构建你想要的应用如果你的目标是创建一个运行在 iPhone 上的 App, 那么最好选择 Objective-C 或者 Swift, 学习 web 开发可以选择 PHP 或者 JAVA 实际上我们仍然可以用汇编做出网页, 但是这样做成本高昂
是否容易学习, 在满足第一点的条件下请尽量选择容易学习的语言容易不仅仅指语法简单, 包括环境搭建部署等都需要考虑在内, 以及能不能容易找到好的学习资料, 因此尽可能的选择主流语言
别忘了非常重要的一点, 学习编程语言还包括平台提供的 API, 比如 Win 32 之于 C++/C#/VB, 以及周边的库和框架 (这些库框架和工具能在上面说的技术图谱中找到)IT 历史上甚至出现框架和库引领编程语言走向的情况: jQuery 和 Angular 改变了前端开发的思想; Rails 抢走了 Ruby 的名气; 而 SSH 三大框架一度代表了 Java 世界
最后我为初学者整理了一个流行编程语言和用途的表:
另外还需要注意的是开发工具, 可以选用 IDE 和有代码提示的编辑器, 但尽量不要在这上喋喋不休, 这就像用来盛放你锋利兵器的架子, 用着顺手就行, 也不推荐使用纯文本编辑器, 这看起来像赤手空拳 推荐一些编辑器和 IDE
挑选合适的资料和有效的阅读
对初学者而言, 我仍然推荐好的视频教程, 虽然我已经听到不下 5 个人声称是靠阅读官方文档或者看源码学会编程的, 而且认为观看视频教程见效太慢但这个思想对初学者很危险, 不得不承认阅读文档和源码能更准确找到自己想要的信息, 这对深入技术原理非常有用, 但视频能比文字传达出更丰富的内容, 有更直观的演示和细致的讲解, 我想没有比这个更适合初学者了
除了上面提到的精品课程和慕课教程, 国内有像网易云课堂, 国外有 lynda.com 这种在线学习视频网站, 甚至在优酷和土豆都能找到足够的教程资源
如果选择了阅读技术类书籍, 我们来聊聊怎么有效的阅读一本技术书籍
读 IT 类书籍和读考试类书籍的方式不同, 初学者需要选择更接地气并且能告诉你最终能做出什么案例的书籍你不需要通读整本书, 而是需要搭建好和书中版本一致的环境, 然后把书中的每行代码敲入电脑, 观察这些代码怎样被运行, 在遇到问题时去请教朋友或者到搜索引擎中寻找解决办法, 直到示例程序能被正确运行
可能一个月才能读完一本书, 但慢点并没什么坏处, 敲过一遍的代码才能算是你的, 否则永远存在于纸上的代码清单中对于关键的概念和知识点, 可以在阅读的同时做一些笔记, 去尝试使用思维导图来做你的笔记吧, 这让你的笔记跟上你的思考, 并形成一个知识网络
自我激励
自学无疑是寂寞的编程学习耗时较长, 如何保证在这个阶段能坚持下去?
我们知道很多人都能对游戏产生强烈的兴趣愿意为之投入时间, 这其中的秘密就是游戏的奖励规则杀死一个怪物就能得到一些金币, 通过完成任务获得满足感, 通过关卡的设计产生持续吸引力, 进而形成正向的反馈
其实学习编程也一样, 实现一小段程序并运行, 足以让人感到成就感和满足, 借鉴这个简单的心理学技巧, 定期给自己设定一些有实际意义但是不太难的目标和任务太难会让人失去耐心, 太简单又很无聊, 最好设定一个跳起来刚好摸得着的任务每完成一个目标就给予自己奖励, 可以是完成任务的成就感, 也可以是其他的物质奖励
这个时候一个代办记事的清单就可以帮上忙了, 可以是一个 to do list 的软件, 或者自己手写一张卡片贴到墙上, 关键在于不要忘了在任务达成后给予自己适当的奖励
来源: https://kb.cnblogs.com/page/575255/