学习了前面文章中的入门级经验和知识后,你可能会有两种反应。
一种反应可能是,你对编程有一点的兴趣了,甚至有一点点小骄傲,可能还会四处炫耀。我想说,请保持这种感觉,但是你也要清醒一下,上面的那些东西,还不算真正的入门,你只是入门了一条腿。
另一种反应也可能是,你被吓着了,觉得太难了。感觉不是一般人能玩的,如果是这样的话,我想鼓励你一下–“**无论你做什么事,你都会面对各式各样的困难,这对每个人来说都是一样的,而只有兴趣、热情和成就感才能让你不畏惧这些困难**”。所以,你问问你自己,是否从中收获了成就感,如果没有的话,可能这条路并不适合你。如果有的话,哪怕一丁点儿,你也应该继续坚持下来。
这篇文章,我主要是让你成为更为专业的入门程序员。请注意,此时,你可能需要读一些比较枯燥的书,但我想说,这些是非常非常重要的。你一定要坚持住。
# 编程技能
在系统地学习编程技能之前,我希望你能先看一下" [The Key To Accelerating Your Coding Skills](http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/)", 这篇文章会告诉你如何有效地快速提高自己的编程能力。
然后接下来是下面几大块内容,但还只是入门级的。
**编程技巧方面** - 你可以开始看怎么把程序写好的书了,这里推荐的是《[代码大全](https://book.douban.com/subject/1477390/)》。这本书好多年没有更新了,其中有一些内容可能有点过时,但还是一本非常好的书,有点厚,你不需要马上就看完。在你的编程路上,这本书可以陪你走很久,因为当你有更多的编程经验时,踩过更多的坑后,再把这本书拿出来看看,你会有更多的体会。**好的书和不好的书最大的区别就是,好的书在你不同的阶段来读,你会有不同的收获,而且还会产生更多的深层次的思考!** 《代码大全》就是这样的一本书。
**编程语言方面** - 这个阶段,你可以开始了解一下Java语言了,我个人觉得Java是世界上目前为止综合排名最好的语言。你一定要学好这门语言。推荐《[Java核心技术(卷1)](https://book.douban.com/subject/26880667/)》,除了让你了解Java的语法,它还会让你了解面向对象编程是个什么概念(如果你觉得这本书有点深,那么,你可以降低难度看更为基础的《[Head First Java](https://book.douban.com/subject/2000732/)》)。然后,既然开始学习Java了,那就一定要学Spring,推荐看看《[Spring in Action](https://book.douban.com/subject/26767354/)》或是直接从最新的Spring Boot开始,推荐看看《[Spring Boot 实战](https://book.douban.com/subject/26857423/)》。关于Spring的这两本书,里面可能会有很多你从来没有听说过的东西,比如,IoC和AOP之类的东西,能看懂多少就看懂多少,没事儿。
**操作系统** - 这里你可以看看《[鸟哥的Linux私房菜](https://book.douban.com/subject/4889838/)》,这本书会让你对计算机和操作系统,以及Linux有一个非常全面的了解,并能够管理或是操作好一个Linux系统。当然,这本书有很多比较专业的知识,你可能会看不懂,没关系,就暂时略过就好了。这本书的确并不适合初学者,你能看多少就看多少吧。
**网络协议** - 你需要系统地了解一下HTTP协议,请到 MDN 阅读一下其官方的 [HTTP的文档](https://developer.mozilla.org/zh-CN/docs/Web/HTTP)。你需要知道HTTP协议的几个关键点:1)HTTP头,2)HTTP的请求方法,3)HTTP的返回码。还有,HTTP的Cookie、缓存、会话,以及链接管理,等等,在MDN的这个文档中都有了。对于HTTP协议,你不需要知道所有的东西,你只需要了解这个协议的最关键的那些东西就好了。
**数据库设计** - 你需要系统地了解一下数据库设计中的那些东西,这里推荐慕课网的一个在线课程:数据库设计的那些事。每个小课程不过5-6分钟,全部不到2个小时,我相信你一定能跟下来。你需要搞清楚数据的那几个范式,还有SQL语句的一些用法。当然,你还要学习和使用一下数据库,这里推荐学习开源的MySQL。你可以看官方文档,也可以看一下这本书《[MySQL必知必会](https://book.douban.com/subject/3354490/)》。
**前端方面** - 前端的东西不算复杂,你需要学习几个东西。一个是和JavaScript相关的 [jQuery](https://jquery.com/),另一个是和CSS相关的 [Bootstrap](https://getbootstrap.com/),学习这两个东西都不复杂,直接上其官网看文档就好了。最重要的是,你要学习一下如何使用JavaScript Ajax请求后端的API接口,而不是再像前面那样用后端来向前端返回HTML页面的形式了。这里,你需要学习一下,JavaScript的Promise模式。[阮一峰翻译的ES6的教程中有相关的内容](http://es6.ruanyifeng.com/#docs/promise)。当然,你Google一下,也可以找到一堆学习资料。
**字符编码方面** - 在你处理中文时有时会发现有乱码出现,此时需要了解ASCII和Unicode这样的字符编码。这里推荐一篇文章 - “[关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)](http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC%8C%E4%BD%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84.html)” 或是英文文章 “[The history of Character Encoding](http://www.developerknowhow.com/1091/the-history-of-character-encoding)” 以及 [Wikipedia - Character encoding](https://en.wikipedia.org/wiki/Character_encoding)。还有GitHub上的这两个Awesome仓库:[Awesome Unicode](https://github.com/jagracey/Awesome-Unicode) 和 [Awesome Code Points](https://github.com/Codepoints/awesome-codepoints)。
# 为什么转成Java语言?
相信你可能会问,为什么之前学习的Python和JavaScript不接着学,而是直接切到Java语言上来,这样会不会切得太快了。这是一个好问题,这里需要说明一下,为什么我会切到Java这个语言上来,主要是有以下几方面考虑。
Java是所有语言里面综合实力最强的,这也是为什么几乎所有大型的互联网或是分布式架构基本上都是Java技术栈。所以,这是一个工业级的编程语言(Python和JavaScript还达不到这样的水准)。
之所以没有用Java来做入门语言而是用了Python,这是因为编程是一件比较费脑子的事,一开始学习时,兴趣的培养很重要。Python比较简单,容易上手,能够比较容易地提起兴趣,而用Java则可能比较难。
在你有了一些编程语言的基础后,有了一些代码的逻辑后,切到工业级的编程语言上来,更为专业地学习编程,是非常有帮助的。像Python和JavaScript这样的动态语言用着是很爽,但是,只有像C、C++和Java这样的静态语言才可以让你真正地进阶。
对于一个合格的程序员,掌握几门语言是非常正常的事情。一方面,这会让你对不同的语言进行比较,让你有更多的思考。另一方面,这也是一种学习能力的培养。很多时候,一些程序员只在自己熟悉的技术而不是合适的技术上工作,这其实并不好,这会让你的视野受限,而视野会决定你的高度。综上所述,这就是在入门的时候我故意让你多学几门语言的原因。
# 编程工具
编程工具方面,你需要开始学习使用下面这些工具了。
**编程的IDE**。传统一点的,你可以使用Eclipse([教程](http://www.runoob.com/eclipse/eclipse-tutorial.html))。当然,我推荐你使用Intellij IDEA([教程](https://www.gitbook.com/book/dancon/intellij-idea/details))。这两个工具都可以开发各种语言,但是主要用在Java。**如果你想玩得更时髦一些的话,使用Visual Studio Code也不错,这个工具潜力十足**,用其开发Python、JavaScript、Java、Go、C和C++都能得心应手([教程](https://www.gitbook.com/book/jeasonstudio/vscode-cn-doc/details))。
**版本管理工具**。版本管理工具是非常重要的编程工具。传统的有P4、 SVN、CVS等,但都会被Git取代,所以,你就只用学习Git就好了。学习Git的教程网上有很多,这里我推荐非常系统的 [Pro Git 第二版](https://git-scm.com/book/zh/v2/) (如果你觉得Pro Git比较枯燥的话,备选[猴子都能懂的Git入门](https://backlog.com/git-tutorial/cn/)),然后你要学会使用GitHub。关于一些Git环境安装和准备以及GitHub使用,你可以自行Google(比如:这篇[GitHub and Git 图文教程 ](https://github.com/JiapengLi/GitTutorial) 或是这篇[Git图文教程及详解](https://www.jianshu.com/p/1b65ed31da97))。
**调试前端程序**。你需要学会使用Chrome调试前端程序,Google一下会有很多文章,你可以看看 [超完整的Chrome浏览器客户端调试大全](http://www.igeekbar.com/igeekbar/post/156.htm)。
**数据库设计工具**。你需要学会使用MySQL WorkBench,这个工具很容易使用。相关的手册,你可以看一下[官方文档](https://dev.mysql.com/doc/refman/5.7/en/)。
# 实践项目
这回我们需要设计一个投票系统的项目。
业务上的需求如下:
- 用户只有在登录后,才可以生成投票表单。
- 投票项可以单选,可以多选。
- 其它用户投票后显示当前投票结果(但是不能刷票)。
- 投票有相应的时间,页面上需要出现倒计时。
- 投票结果需要用不同颜色不同长度的横条,并显示百分比和人数。
技术上的需求如下:
- 这回要用Java Spring Boot来实现了,然后,后端不返回任何的HTML,只返回JSON数据给前端。
- 由前端的JQuery来处理并操作相关的HTML动态生成在前端展示的页面。
- 前端的页面还要是响应式的,也就是可以在手机端和电脑端有不同的呈现。 这个可以用Bootstrap来完成。
如果你有兴趣,还可以挑战以下这些功能。
- 在微信中,通过微信授权后记录用户信息,以防止刷票。
- 可以不用刷页面,就可以动态地看到投票结果的变化。
- Google一些画图表的JavaScript库,然后把图表画得漂亮一些。
# 小结
上面那些书和知识你要看完,还要能理解并掌握,我估计你最少也要花1-2年左右的时间。如果你能够走到这里,把前面的那些知识都了解了,不用精通,能独立地做出上面的那些实践项目,那么,你就算是真正的入门了。
而且,你已经是一个“全栈工程师”的样子了,在这里我要给你一个大大的赞。如果这个时候,你对编程还有很大的热情,那么我要恭喜你了,你可能会是一个非常不错的程序员。加油啊!
上面的那些技术已经算是比较专业的了。如果你已经大致掌握了,我相信你可以找到至少年薪20万以上的工作了,而且你的知识面算是有不错的广度了。但是深度还不够,这个时候,是一个比较关键点了。
你可能已经沉醉在沾沾自喜的骄傲的情绪中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的开发,成为一个搬砖的码农。你也可以开始选择一个方向开始深入。
我给你的建议是选择一个方向开始深入。**因为你并不知道你未来会有多大的可能性,也不知道你会成为什么样的人,所以为什么不再更努力一把呢?**
后面,我们就开始非常专业的程序员之路了。这也是一般程序员和高级程序员的分水岭了,能不能过去就看你的了。
下面是《程序员练级攻略(2018)》系列文章的目录。
- [开篇词](https://time.geekbang.org/column/article/8136)
入门篇
- [零基础启蒙](https://time.geekbang.org/column/article/8216)
- [正式入门](https://time.geekbang.org/column/article/8217)
- [程序员修养](https://time.geekbang.org/column/article/8700)
- [编程语言](https://time.geekbang.org/column/article/8701)
- [理论学科](https://time.geekbang.org/column/article/8887)
- [系统知识](https://time.geekbang.org/column/article/8888)
- [软件设计](https://time.geekbang.org/column/article/9369)
- [Linux系统、内存和网络(系统底层知识)](https://time.geekbang.org/column/article/9759)
- [异步I/O模型和Lock-Free编程(系统底层知识)](https://time.geekbang.org/column/article/9851)
- [Java底层知识](https://time.geekbang.org/column/article/10216)
- [数据库](https://time.geekbang.org/column/article/10301)
- [分布式架构入门(分布式架构)](https://time.geekbang.org/column/article/10603)
- [分布式架构经典图书和论文(分布式架构)](https://time.geekbang.org/column/article/10604)
- [分布式架构工程设计(分布式架构)](https://time.geekbang.org/column/article/11232)
- [微服务](https://time.geekbang.org/column/article/11116)
- [容器化和自动化运维](https://time.geekbang.org/column/article/11665)
- [机器学习和人工智能](https://time.geekbang.org/column/article/11669)
- [前端基础和底层原理(前端方向)](https://time.geekbang.org/column/article/12271)
- [前端性能优化和框架(前端方向)](https://time.geekbang.org/column/article/12389)
- [UI/UX设计(前端方向)](https://time.geekbang.org/column/article/12486)
- [技术资源集散地](https://time.geekbang.org/column/article/12561)