Files
CategoryResourceRepost/极客时间专栏/左耳听风/程序员练级攻略/71 | 程序员练级攻略:正式入门.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

147 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="71 | 程序员练级攻略:正式入门" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f9/a5/f97a813671302d323569f3dd83caf3a5.mp3"></audio>
学习了前面文章中的入门级经验和知识后,你可能会有两种反应。
<li>
一种反应可能是,你对编程有一点的兴趣了,甚至有一点点小骄傲,可能还会四处炫耀。我想说,请保持这种感觉,但是你也要清醒一下,上面的那些东西,还不算真正的入门,你只是入门了一条腿。
</li>
<li>
另一种反应也可能是,你被吓着了,觉得太难了。感觉不是一般人能玩的,如果是这样的话,我想鼓励你一下–“**无论你做什么事,你都会面对各式各样的困难,这对每个人来说都是一样的,而只有兴趣、热情和成就感才能让你不畏惧这些困难**”。所以,你问问你自己,是否从中收获了成就感,如果没有的话,可能这条路并不适合你。如果有的话,哪怕一丁点儿,你也应该继续坚持下来。
</li>
这篇文章,我主要是让你成为更为专业的入门程序员。请注意,此时,你可能需要读一些比较枯燥的书,但我想说,这些是非常非常重要的。你一定要坚持住。
# 编程技能
在系统地学习编程技能之前,我希望你能先看一下&quot; [The Key To Accelerating Your Coding Skills](http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/)&quot; 这篇文章会告诉你如何有效地快速提高自己的编程能力。
然后接下来是下面几大块内容,但还只是入门级的。
<li>
**编程技巧方面** - 你可以开始看怎么把程序写好的书了,这里推荐的是《[代码大全](https://book.douban.com/subject/1477390/)》。这本书好多年没有更新了,其中有一些内容可能有点过时,但还是一本非常好的书,有点厚,你不需要马上就看完。在你的编程路上,这本书可以陪你走很久,因为当你有更多的编程经验时,踩过更多的坑后,再把这本书拿出来看看,你会有更多的体会。**好的书和不好的书最大的区别就是,好的书在你不同的阶段来读,你会有不同的收获,而且还会产生更多的深层次的思考!** 《代码大全》就是这样的一本书。
</li>
<li>
**编程语言方面** - 这个阶段你可以开始了解一下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之类的东西能看懂多少就看懂多少没事儿。
</li>
<li>
**操作系统** - 这里你可以看看《[鸟哥的Linux私房菜](https://book.douban.com/subject/4889838/)》这本书会让你对计算机和操作系统以及Linux有一个非常全面的了解并能够管理或是操作好一个Linux系统。当然这本书有很多比较专业的知识你可能会看不懂没关系就暂时略过就好了。这本书的确并不适合初学者你能看多少就看多少吧。
</li>
<li>
**网络协议** - 你需要系统地了解一下HTTP协议请到 MDN 阅读一下其官方的 [HTTP的文档](https://developer.mozilla.org/zh-CN/docs/Web/HTTP)。你需要知道HTTP协议的几个关键点1HTTP头2HTTP的请求方法3HTTP的返回码。还有HTTP的Cookie、缓存、会话以及链接管理等等在MDN的这个文档中都有了。对于HTTP协议你不需要知道所有的东西你只需要了解这个协议的最关键的那些东西就好了。
</li>
<li>
**数据库设计** - 你需要系统地了解一下数据库设计中的那些东西这里推荐慕课网的一个在线课程数据库设计的那些事。每个小课程不过5-6分钟全部不到2个小时我相信你一定能跟下来。你需要搞清楚数据的那几个范式还有SQL语句的一些用法。当然你还要学习和使用一下数据库这里推荐学习开源的MySQL。你可以看官方文档也可以看一下这本书《[MySQL必知必会](https://book.douban.com/subject/3354490/)》。
</li>
<li>
**前端方面** - 前端的东西不算复杂你需要学习几个东西。一个是和JavaScript相关的 [jQuery](https://jquery.com/)另一个是和CSS相关的 [Bootstrap](https://getbootstrap.com/)学习这两个东西都不复杂直接上其官网看文档就好了。最重要的是你要学习一下如何使用JavaScript Ajax请求后端的API接口而不是再像前面那样用后端来向前端返回HTML页面的形式了。这里你需要学习一下JavaScript的Promise模式。[阮一峰翻译的ES6的教程中有相关的内容](http://es6.ruanyifeng.com/#docs/promise)。当然你Google一下也可以找到一堆学习资料。
</li>
<li>
**字符编码方面** - 在你处理中文时有时会发现有乱码出现此时需要了解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)。
</li>
# 为什么转成Java语言
相信你可能会问为什么之前学习的Python和JavaScript不接着学而是直接切到Java语言上来这样会不会切得太快了。这是一个好问题这里需要说明一下为什么我会切到Java这个语言上来主要是有以下几方面考虑。
<li>
Java是所有语言里面综合实力最强的这也是为什么几乎所有大型的互联网或是分布式架构基本上都是Java技术栈。所以这是一个工业级的编程语言Python和JavaScript还达不到这样的水准
</li>
<li>
之所以没有用Java来做入门语言而是用了Python这是因为编程是一件比较费脑子的事一开始学习时兴趣的培养很重要。Python比较简单容易上手能够比较容易地提起兴趣而用Java则可能比较难。
</li>
<li>
在你有了一些编程语言的基础后有了一些代码的逻辑后切到工业级的编程语言上来更为专业地学习编程是非常有帮助的。像Python和JavaScript这样的动态语言用着是很爽但是只有像C、C++和Java这样的静态语言才可以让你真正地进阶。
</li>
<li>
对于一个合格的程序员,掌握几门语言是非常正常的事情。一方面,这会让你对不同的语言进行比较,让你有更多的思考。另一方面,这也是一种学习能力的培养。很多时候,一些程序员只在自己熟悉的技术而不是合适的技术上工作,这其实并不好,这会让你的视野受限,而视野会决定你的高度。综上所述,这就是在入门的时候我故意让你多学几门语言的原因。
</li>
# 编程工具
编程工具方面,你需要开始学习使用下面这些工具了。
<li>
**编程的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))。
</li>
<li>
**版本管理工具**。版本管理工具是非常重要的编程工具。传统的有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))。
</li>
<li>
**调试前端程序**。你需要学会使用Chrome调试前端程序Google一下会有很多文章你可以看看 [超完整的Chrome浏览器客户端调试大全](http://www.igeekbar.com/igeekbar/post/156.htm)。
</li>
<li>
**数据库设计工具**。你需要学会使用MySQL WorkBench这个工具很容易使用。相关的手册你可以看一下[官方文档](https://dev.mysql.com/doc/refman/5.7/en/)。
</li>
# 实践项目
这回我们需要设计一个投票系统的项目。
业务上的需求如下:
- 用户只有在登录后,才可以生成投票表单。
- 投票项可以单选,可以多选。
- 其它用户投票后显示当前投票结果(但是不能刷票)。
- 投票有相应的时间,页面上需要出现倒计时。
- 投票结果需要用不同颜色不同长度的横条,并显示百分比和人数。
技术上的需求如下:
- 这回要用Java Spring Boot来实现了然后后端不返回任何的HTML只返回JSON数据给前端。
- 由前端的JQuery来处理并操作相关的HTML动态生成在前端展示的页面。
- 前端的页面还要是响应式的,也就是可以在手机端和电脑端有不同的呈现。 这个可以用Bootstrap来完成。
如果你有兴趣,还可以挑战以下这些功能。
- 在微信中,通过微信授权后记录用户信息,以防止刷票。
- 可以不用刷页面,就可以动态地看到投票结果的变化。
- Google一些画图表的JavaScript库然后把图表画得漂亮一些。
# 小结
上面那些书和知识你要看完还要能理解并掌握我估计你最少也要花1-2年左右的时间。如果你能够走到这里把前面的那些知识都了解了不用精通能独立地做出上面的那些实践项目那么你就算是真正的入门了。
而且,你已经是一个“全栈工程师”的样子了,在这里我要给你一个大大的赞。如果这个时候,你对编程还有很大的热情,那么我要恭喜你了,你可能会是一个非常不错的程序员。加油啊!
上面的那些技术已经算是比较专业的了。如果你已经大致掌握了我相信你可以找到至少年薪20万以上的工作了而且你的知识面算是有不错的广度了。但是深度还不够这个时候是一个比较关键点了。
你可能已经沉醉在沾沾自喜的骄傲的情绪中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的开发,成为一个搬砖的码农。你也可以开始选择一个方向开始深入。
我给你的建议是选择一个方向开始深入。**因为你并不知道你未来会有多大的可能性,也不知道你会成为什么样的人,所以为什么不再更努力一把呢?**
后面,我们就开始非常专业的程序员之路了。这也是一般程序员和高级程序员的分水岭了,能不能过去就看你的了。
下面是《程序员练级攻略2018》系列文章的目录。
- [开篇词](https://time.geekbang.org/column/article/8136)
<li>入门篇
<ul>
- [零基础启蒙](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)