本文送给励志成为优秀程序员却无从下手的朋友们。
编程从来不是一件无趣的事情,相反,它会带给你无穷无尽的快乐。这是一种创造事物的快乐,就像上帝创造世间万物一样,在代码世界里,你就是无所不能的造物主。
可是如何以最快的速度入门,这才是广大新手最关心的问题。本文就来谈谈编程入门的学习路线。
本文适用对象:打算做软件研发工作的人、无明确目标的在校学生。
如果你符合以上两点中的任意一点,就请一定耐心读完这篇文章,保证对你大有帮助。
我看到过很多推荐教程的文章,参考书列了一大堆,根本不是初学者能够看得进去的。学编程需要一步一个脚印,循序渐进才能掌握牢固。私以为,没有理解能力差的学生,只有写的晦涩的书。只要有好的学习方式,每个人都可以轻松学会编程。
因此,本文针对每项技术只推荐最好的教程,这些教程一定是兼顾深度和趣味性的,保证你会爱不释手地看下去。大部分推荐的教程(包括书和视频)都是我学习过程中对比后选出的,有些老师讲课的幽默程度堪比相声,这才是真正的寓教于乐。
闲话少说,下面进入正题。
一、技术路线介绍
本节只介绍纯IT领域的技术路线,而对于更高级的技术(例如计算机视觉、机器学习、人工智能等等)不予考虑。
技术路线是一条通往该行业的道路,掌握了处于这条路上的所有技术,就具备了该行业的从业能力。因此,我们可以从各个公司的招聘职位中找到技术路线的分类。
目前,软件开发技术路线主要有:Web后端、Web前端、Android、iOS、Windows客户端、数据库、嵌入式等。本节我们将依次对这些技术路线作简要介绍,具体的学习内容会放到后面章节细讲。
1、Web后端
这是当今互联网浪潮中软件开发的主力军。几乎所有互联网公司都要提供基于Web的服务(相对于基于客户端的服务),这些服务的核心就在于Web后端,或称为服务器端。
与Web前端相比,后端程序运行在服务器上,看不见摸不着,但却扮演着至关重要的角色。日常生活中我们用百度搜索、发新浪微博、看腾讯视频、在淘宝购物,这些功能都由后端程序来实现。
Web后端编程又可以根据编程语言的不同分为几大类:Java、PHP、Node.js。
Java是种古老的编程语言,在Web后端的应用也足够久,由于Java代码通常架构清晰、可扩展性强,因此适用于大型Web项目,比如淘宝网就是用Java开发的。
PHP是一种专门用于Web后端的脚本语言,简单易用,适用于小型Web项目。
Node.js是一项新兴技术,采用Java语言开发后端,轻量高效,性能好。
除了这三种主流技术外,使用Ruby on Rails、Python、ASP.NET也可以做后端开发,但并不常用,本文就不予考虑了。
2、Web前端
Web前端是个大一统的世界,就是我们常说的 HTML+CSS+Java,最新的版本是HTML5+CSS3+Java。所以前端程序员只要学好了这三门语言,就可以大有作为了。
3、Android
在移动互联网时代,Android成为最广泛使用的移动端操作系统,自然需要大量的开发人员。与Java Web类似,Android开发同样使用Java语言。
4、iOS
iOS是苹果手机的操作系统,由于iPhone推出之后在全球市场备受追捧,iOS开发的需求量也很高,而且通常薪资水平高于Android。iOS过去使用Objective-C开发,近年来苹果公司发布了新的编程语言Swift,开始逐渐替代Objective-C,成为iOS系统的主流开发语言。
5、Windows客户端
Windows操作系统几乎占领了个人电脑的绝大部分市场,而Windows客户端编程就是为你的个人电脑编写桌面应用程序,我们日常使用的Office、电脑版QQ、迅雷影音、Photoshop等等都属于这个范畴。
虽然我们每天都在用Windows客户端程序,但在云计算日益发达的今天,客户端已经不再是各个互联网公司首先考虑的平台。与Web相比,客户端显得太笨重,而且无法及时更新。只要是能够通过浏览器提供的服务,就不必考虑开发客户端软件,只有那些运算量、数据量非常大的软件,才需要开发客户端版本。因此Windows客户端开发的岗位需求并不大,主要集中在专业软件领域,比如Adobe公司开发的各种图像处理软件、软件编程IDE、大型企业内部的管理系统等等。
Windows客户端开发的常用技术有:WinForm,Qt。
WinForm是微软官方提供的Windows客户端软件开发框架,采用C#语言,属于.NET框架的一部分。使用Visual Studio开发WinForm程序非常方便、快捷。
Qt是一个跨平台的软件开发框架,一套程序可以同时运行在Windows、Linux、Android、iOS、Windows Phone等主流操作系统上,功能非常强大。对于想开发跨平台客户端的公司来说,使用Qt的确可以节约很多成本。Qt主要使用C++语言实现功能,同时可以选择使用QML语言描述界面。
除了这两种技术,还有MFC、WPF。MFC是微软早期的客户端框架,由于年代久远,开发效率低,现在用的不多了。WPF则是微软推出的比WinForm更优秀的客户端框架,但由于推广不利,至今没有得到广泛使用。因此本文不再考虑这两项技术。
6、数据库
数据库开发作为单独的一条技术路线,似乎有些单薄。但鉴于各大互联网公司都有数据库工程师这一职位,所以也把它单独列出来比较好。
实话讲,数据库这一技术路线我不太熟悉,按照我的理解,应该就是针对公司使用某一款数据库系统,比如Oracle,做相关开发和性能优化。
7、嵌入式
嵌入式开发更偏底层,似乎离IT越来越远了。但结合现在日益火热的物联网来看,嵌入式将迎来新的高潮。
如果有一些名词你不了解它的意思,请在评论区提问,或自行百度,或者先放着也行。毕竟作为一个编程初学者,这些技术路线恐怕也不太好理解。所以继续往下看吧,等知识积累到一定程度这些概念就自然明白了。本节只对这些技术路线做了大概的介绍,下一节让我们开始踏上学习的道路。
二、编程语言
作为一个什么都不懂的小白,学习编程的第一步当然是掌握一门编程语言。本节就来介绍常见的编程语言的学习路线。
首先,先明确一个观点,作为一个程序员,只会一种编程语言是远远不够的。最好精通1~2门语言,基本掌握其它所有常见的语言。这听起来有些吓人,但其实没那么困难。因为大部分编程语言都是很相似的,比如C语言、C++、C#、Java可以称为类C语言,它们都是从C语言开始一步步扩展得到的,掌握了其中一种,其它的可以触类旁通。
1、C语言
信息类专业的大学生通常都会在一年级上C语言这门课,也很可能是大学期间唯一的一门编程语言课。所谓师傅领进门,修行在个人,通过学习C语言迈入编程世界的大门是再合适不过了。虽然也有人提倡学习Python作为第一门编程语言,可我觉得那未免太浮躁了。刚开始应该打好基础,而不是追求炫酷的效果。C语言是一门高级语言,又与计算机硬件息息相关,通过指针操作可以真切感受到数据的流动,这是Python无法做到的。因此,我的建议是,不管今后打算从事哪个技术路线,C语言都是必学的第一门语言。
然而遗憾的是,我由于是在课堂上学的C语言,所以这方面的优秀教材了解的也不多。无论是学校使用的各个版本的《C语言程序设计》,还是国外大牛写的《The C Programming Language》,都未免太过枯燥。据说有一本科普性质的《啊哈C》写的非常通俗易懂,麻烦读过的同学点评一下是否真的如此。其它好的教程也希望同学们帮我补充。
2、C#
学完C语言很多人会产生疑问,不知道C语言能干什么。如果不及时消除这一顾虑,恐怕会让大部分人丧失学下去的信心。然而C语言的用途对于初学者来说很难体现出来,所以下一步我们转向C语言的增强版本——C#语言(读音:C sharp)。
C#语言是微软推出的面向对象编程语言。“面向对象”将是一个伴随程序员一生的词汇,因此从此刻开始,我们要随时尝试理解:什么是面向对象。
简单来说,面向对象是相对于面向过程而言的。C语言是一个典型的面向过程语言,因为C程序的执行流程可以很容易地画一张流程框图来表示,它强调程序员编写程序时是面向程序执行过程考虑的。而C#则是一个典型的面向对象语言,C#程序的执行流程通常很难用流程图表示,这是因为程序员编写C#程序时考虑的不是一个完整的从头到尾的执行流程,而是各个对象之间的调用关系。
虽然我已经尽力了,但上面这段话肯定无法让初学者真正理解面向过程和面向对象的关系。不过不要紧,编程思想从来不是纸上谈兵得来的,必须经过充分的实践才能领悟。
幸运的是我收集到了一套完整的C#视频教程,以及后续的WinForm视频教程。学完这两个,就会对面向对象编程有一定的理解。虽然今后并不一定从事Windows客户端的开发,但学习这两个内容可以帮助更好地理解后续更深层次的Java Web和Android。看视频的同时一定要照着在自己电脑上写一遍,这样才能印象深刻。
这是视频教程链接:C#,WinForm。这套视频也许是我看过的最有趣的视频了,希望大家不要错过。
3、Java(建议精通)
如果学过C#再学Java,你会发现两者惊人的相似。Java从难度上来说和C#一样简单(甚至更简单),而用途却比C#广泛得多。这在很大程度上得益于Java的跨平台特性,也使Java成为了Web项目的主力军。
正在学习Java中的朋友们需要学习资料交流平台可以加群
点击链接加入群【java②】:https://jq.qq.com/?_wv=1027k=45qzsS6 JAVA学习交流 559743457(←长按可复制)
每天晚上都有大神与你高清视频免费分享交流行业最新动态 凑热闹就不要加了 群名额有限 !
4、C++
并非每个同学都需要学习C++,Java和C++精通其中一门即可。但C++与Java并不是效能重复的编程语言,相反,它们分别统治着各自的领域,就像Java统治Web领域一样,C++统治着性能敏感的基础设施、视频图像处理等领域。精通Java或C++都不容易(特别是C++,堪称最难编程语言),因此两者择一即可。
C++方面仍然没能找到优秀的视频教程,需要大家帮忙提些建议。倒是有比较优秀的书籍,比如《C++ Primer》,值得一看。
5、Java(建议精通)
Java是前端开发的利器,对于前端工程师来说,精通Java是必须的。近年来Java甚至蔓延到了后端编程,以Node.js为代表的后端Java框架使它成为全能的编程语言,大有一统江湖之势。
这是与Java和C++一样建议精通的语言,当然只是对前端工程师有这个要求,后端工程师倒不必花太多精力在这上面。
5、Python(建议精通)
Python是近年来日益火爆的一门编程语言。随着Python库的层出不穷,Python在科学计算、Web、大数据与机器学习等领域都展现了惊人的实力。
与Java类似,Python也是一门优秀的面向对象编程语言,而且更简洁。但这不是重点,与前面所有语言不同的是,Python是一门动态类型语言。
前面提到的四种语言C、C#、Java、C++都是静态类型语言,它们需要一个称作“编译器”的东西,把源代码编译成机器码,才能在计算机上运行。而这一特点导致了所有变量都必须事先规定类型,比如我们习以为常的写法
int i = 0;
就事先规定了变量i是int类型。因此它们被称为静态类型语言,即类型是静态的,不能改变。
以Python为代表的动态类型语言则打破了这个限制,我们完全可以直接这样写
i = 0;
既不用规定变量类型,又可以随时给它赋不同类型的值,这就是动态类型语言的特点。这样做方便了许多,但代价是Python代码需要运行在Python解释器上,而不是直接运行在CPU上,因此执行效率会低很多,也就是通常说的动态语言比静态语言“慢”。
有了前几种语言的基础,学Python是很简单的事情,因此不必推荐教程了,只要去网上随便搜一篇介绍Python语法的博客看看就搞定了。
正在学习Python中的朋友们需要学习资料交流平台可以加群
点击链接加入群【python】:https://jq.qq.com/?_wv=1027k=42CGd8i 部落官方学习群号 463024091(←长按可复制)
每天晚上都有大神与你高清视频免费分享交流行业最新动态 凑热闹就不要加了 群名额有限 !
6、PHP(可选)
程序员中流传着这样一个说法——“PHP是世界上最好的编程语言”。从提出这句话的那一刻起,就免不了一场编程语言界的腥风血雨。以至于PHP似乎成了其它编程语言的敌人,备受人们攻击。然而在这样艰苦的环境中存活下来,而且能占据很大一部分Web市场,只能说PHP有其强大的优势。PHP开发Web项目非常快,而且轻量,是一种脚本语言,嵌入到HTML里面就可以运行。因此小公司使用PHP很容易搭建起自己的Web业务。然而Web项目规模大到一定程度时,PHP就有些难以胜任了,需要Java这样重量级的Web框架才可以支撑。因此,根据应用场景选择合适的技术才是最重要的。
PHP教程尚待发掘...
7、Lisp
Lisp是一门古老的语言,老到大部分人早已忘记它的存在。我也是近两年才了解到这门编程语言。随着历史消逝的编程语言数不胜数,能够在50年后仍然保持活跃生命力的语言少之又少,Lisp是其中之一。1958年人工智能的先驱约翰·麦卡锡(John McCarthy)为了解决人工智能领域的问题而发明了Lisp语言,比C语言的发明早了14年。然而Lisp中包含的编程思想却比现在最流行的语言早了几十年。看看《黑客与画家》的作者、硅谷创业之父保罗·格雷厄姆是怎么说的
如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。
Python模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能,也一起模仿了。至于Ruby,如果回到1975年,你声称它是一种Lisp方言,没有人会反对。
编程语言现在的发展,不过刚刚赶上1958年Lisp语言的水平。
——《为什么Lisp语言如此先进?》,保罗·格雷厄姆
之所以我在这里提到Lisp语言,不是因为它多么有用(事实上Lisp的确没多少实际的应用),而是因为它蕴含的强大的编程理念,一种完全不同于C系列语言的理念。然而我对Lisp的了解,或许根本谈不上了解,仅仅局限于道听途说,最早是通过王垠的博客,后来是《黑客与画家》。这两大高手对Lisp的强力推荐,使我想要做些尝试。无奈一直没能抽出时间专心研究,而且网上Lisp的参考资料又少得可怜。目前Lisp最流行的两大方言是Common Lisp和Scheme,感兴趣的朋友可以关注一下,如果遇到有好的教程也可以分享给大家。
8、其它语言
还有一些应用不那么广泛但在特定领域非常流行的语言,比如Objective-C,Ruby,Go等等,它们都有着各自不可替代的作用。不过在初学阶段,不必太关心这些小众语言,因为从上面那些大众语言转到这些小众语言上是很容易的。
三、计算机基础
现在才学计算机基础,是不是有点晚?
当然不是,现在刚刚好。有了上面的编程基础,我们才能深入学习计算机体系结构、操作系统、计算机网络、算法等知识,这些知识不像编程那样能看到实际的效果,但却是提升水平的关键。
1、计算机体系结构
计算机体系结构告诉我们计算机由哪些硬件组成,它们各自完成什么工作,如何结合成一个有机的整体。它们是物理上真实存在的东西,相当于计算机的骨架,支撑着位于其上的软件系统。
对于程序员来说,这部分知识倒不必过于深入,推荐一本必读书:
《深入理解计算机系统》 Randal E.Bryant,David R. O'Hallaron
建议阅读英文版,因为读过这本书后我深深感受到原来英语可以写得这样通俗易懂,甚至是一些让我觉得无法用中文说清楚的地方。
最好买一本纸质书,这样就能多做笔记,以后需要的时候也能翻看。如果经济不允许的话,可以从这里下载电子版,但是扫描的质量很差,可能会影响阅读心情。
我在阅读这本书的过程中写了一系列博客《深入理解计算机系统》,欢迎前来交流~
2、操作系统
操作系统是运行在计算机上的最重要的系统软件,从一开机它就开始运行,直到关机才最后一个结束。操作系统对运行于其上的应用软件是至关重要的,从而也导致了Windows和Linux两大派系的世纪之争。学习操作系统,才能更高效地开发应用程序,这一点应该不难理解。
操作系统方面的课程尚待补充。
3、计算机网络
互联网是这个时代最伟大的发明,学好计算机网络才能胜任今后的各项工作,因为这些工作无一不与互联网相关。
推荐一套计算机网络视频教程:
《六个月成为网络专家》 美河制作
这套教程内容很多,讲解非常详细。耐心看完整套教程,你就能看透计算机网络的本质。
4、算法
算法无疑是程序员的基本功,推荐书籍:
《算法导论》
这本书介绍的算法很全面,把它认真读完并最好亲手实践每一个算法,一定会大有收获。
5、其它
其它一些计算机基础知识,比如数据库技术、计算机图形学、多处理器编程、网络与信息安全,也都是很值得学的内容,但是大家都精力有限,没必要样样精通,可以选自己感兴趣的部分补强。
四、Java Web后端开发
学习了第二节和第三节提到的知识,基本上可以称为一个合格的程序员了。下一步的发展就要根据市场行情,选择一门专项技术,准备进入求职阶段。
前面的内容可以称得上是“九阳神功”,修炼你的内力,而后面的内容就是“九阴真经”,能够征战沙场的武器。两者相辅相成,缺一不可。
本节从后端开发谈起。第一节中讲到主流后端开发有三种:Java Web、PHP和Node.js,三者的思想是一致的,只不过在实现方式上有所不同,因此我主要以Java Web为例介绍。
从简单的C语言控制台程序,到WinForm窗体应用程序,我们接触到越来越复杂的软件形式。而Web应用程序,又与前面两种完全不同。我们习以为常的软件都是通过一个Setup.exe安装包在计算机上安装得到的,因此它们称为Windows客户端。而另外一些软件,比如百度搜索、腾讯新闻、淘宝网等等,我们习惯称之为网站,但实际上,它们也是软件,称之为Web应用程序。这种软件运行在服务器上(服务器就是放置在机房里的一台高性能电脑),用户通过浏览器访问它们。
我们需要先搞懂Web程序的工作原理,为什么用户通过浏览器可以访问到服务器上运行的程序?它们如何利用HTTP协议通信?用户数据存在哪里?弄明白这些基本逻辑,再学习如何写程序实现想要的功能。
学习完这套教程,就能够开发简单的网站了,但还不足以应对实际工作的需求。
为了提高开发效率,市面上出现了许多优秀的Web开源框架。在Java Web领域,有三大框架之称的——Spring、Struts和Hibernate为开发者提供了许多便利,基本是Java Web程序的标配。学习这三大框架,可以更深入地理解如何设计软件架构,比如MVC、IOC等等。
需要提醒大家的是,Web技术发展日新月异,各种框架层出不穷,即使是三大框架,也有过时的一天(目前看来,其实大部分互联网公司都已经转向更轻量、高效的框架了)。所以我们学习并不是为了学会用一种工具,而是要掌握它们的设计思想,当你掌握了三大框架的设计理念,相信面对其它新兴框架,就可以很容易透过现象看本质,找到共同的地方。
五、Web前端
Web前端与Web后端合作完成整个Web项目的开发。前后端分离也正是Web软件最优秀的设计理念。
前端需要用HTML语言制作网页,用CSS描述网页的样式,用Java给网页提供动态特性。这几样技术在第二节中已经给出了教程,很容易掌握,在逻辑方面并没有后端程序那么复杂。
但前端技术不止于此。与后端类似,前端框架也是层出不穷,有过之而无不及。如今流行的各种框架例如React、Angular.js、Vue.js、Bootstrap等等,都需要我们多多尝试,深入理解为何需要这些框架,它们能帮助我们做哪些事情。对各个框架有个基本的了解,才能在技术选型时游刃有余。由于前端水平有限,我就不做过多推荐了,有一篇非常好的文章推荐给大家看:
前端工程——基础篇
正在学习web前端中的朋友们需要学习资料交流平台可以加群
击链接加入群【web前端交流群】:https://jq.qq.com/?_wv=1027k=40SIadZ,群号码:133868702【长按复制】
每天晚上都有大神与你高清视频免费分享交流行业最新动态 凑热闹就不要加了 群名额有限 !
六、Android
安卓经过近些年的快速发展,成为目前世界上最优秀的移动端操作系统,至今仍活力不减。学习安卓,主要是学习使用Android SDK提供的API实现各种功能,同时深入理解Android的运行机制。
推荐一本参考书:
《第一行代码Android》郭霖 著
这本书思路清晰,讲解生动,很适合初学者阅读。有了这些基础,等到真正做实际项目的时候,当你遇到更多实际的问题,比如图片缓存、界面卡顿、屏幕适配等等,到时候只要针对性地查找解决方案,或者利用现有的开发框架就可以了,经验也会随之慢慢丰富。
七、成为编程大牛
这篇文章从开始到现在,已经过去了几个月,中间屡想终止,最后还是坚持写完了。常常感到惭愧,因为我实在称不上编程领域的大牛,却斗起胆来写这么一篇宏大的文章,岂不是误人子弟。所以如果你看到了这里,请一定对本文的所有文字持保留态度,这里没有真理,只是我的一些分享,不一定适合所有人。
当然,如何成为编程大牛,我更是一点经验也没有。不过经过这些年的摸索,还是想给大家提几点具体的建议:
去公司做实际的项目,而不是在学校做简陋的实验品。找个靠谱的公司实习,接触实际的项目,会学到远多于在校期间的知识。
善于做记录,不要学了新知识忘了旧知识。写博客就是一个很好的方式,把看的技术书籍、项目中用到的技术、遇到的问题用博客的方式总结下来,会加深自己的理解,而且方便今后回顾。
最后,祝大家在技术的道路上勇往直前,成为编程大牛!