我们今天来了聊一聊一个话题——全栈开发
作为一个程序员,不管是Java还是C++,也不管是学Javascript还是学资深前端开发,我相信,我们都走着同一条道路
这篇文章也算是我立下的目标!
曲径以通幽
做开发的编程人员或者想走全栈道路的学生都知道,全栈开发的路可不好走!
这条路,路径是曲折的,充满荆棘与沙砾的,选择这条路就说明你需要什么都学什么都会,也需要不停的学习,也要不断思维创新,思维是第一生产力。
论一个全栈开发能多让人羡慕呢?就像你玩游戏时的全能选手,当这个公司不需要你(一般不可能!谁会拒绝一个全栈开发工程师呢?)或者当你的公司让你感受不是特别好时,你具有极高的自由职业选择权! 后端玩腻了可以干干前端,运维太烦了可以搞搞测试,实实在在的上班摸鱼有没有问题,当然,这是这样说,一个对职业热爱的开发者是要为团队着想才行,经常的变动不利于发展!
滴水而石穿
面向所有语言的学习路径肯定是混乱的,我们需要水滴石穿逐个点破,前端语言基本是没有其他路径的,而我们后端语言非常丰富多彩,面向对象的Java语言、面向过程的C语言、开发效率无人能敌的python、以及原地停留缓慢发展的Go,又或者有网站最好语言之称的PHP,等等。不管哪个,想要精通将会花费你大半的时间,而现在的后端语言,许许多多都是一主一副,来搭配开发,往往后端,才是让你掉头发的啦!
一个项目的开发人员往往极具分工,对于最重要的后端,还是少不了其他不重要的开发,红花还需绿叶衬托,才能显得娇艳欲滴,没有前端的后端是枯燥死板的;没有SQL的项目是无法储存数据的;没有硬件的支持是无法跑起来的;没有测试的程序也必定破绽百出;少了维护人员的网站也是时常被DDOS打入黑洞的;没有SEO的网站也是无法引流的。
说了这么多,当然是要告诉你,全栈开发学习线路的不容易!你需要拥有独立开发的能力就至少需要熟悉的懂得以上百分之八十的奇技淫巧以及底层知识。
坚持才是成为全栈开发的有效方法,没有捷径,这个称号是留个热爱互联网的每个玩家,半途而废的开发者是不合格的!
望所有想走全栈开发道路的各位,滴水而石穿。
尝胆以吞吴
在我们中国这个自古流传的礼仪之邦中,都从小流传着许许多多优良的传统与历史,不论年龄也不论心智,我们程序员的思维往往是走在时代最前沿的,也往往是最落后的,要让落在时代后面的人也体验互联网的飞速发展,开发的目的也不只是让科技向前发展,互联网的初衷是为了方便人的生活。
耐得住寂寞,才能等得到花开!
慢慢积累自己的知识,不断叠加,全面优化,无论在哪个领域都可以有你的一席之地,即为:有志者、事竟成,破釜沉舟,百二秦关终属楚;
也祝我们能向未来发展的开发者们:苦心人、天不负,卧薪尝胆,三千越甲可吞吴。
倚南窗以寄傲
当你真正成功的那天,或许带着无限荣光,或许流露着些许傲娇,亦不会愧于青春!
不负韶华、不负青春,几年之约,顶峰相见!
思忧以幺幺
我这句话很短,但意蕴是无穷的:程序与技术不分国界,但是程序员有国界,就像科学家一样!!!
什么是全栈开发
全栈工程师:全栈工程师既要了解后端开发,也要了解前端开发。他们是“全方位”的工程师,熟悉服务端的同时又懂客户端用户体验。全栈工程师理解Web开发进程的每一个方面,同时又会就整体策略与最佳实践对相关干系人提出建议与指导
追寻全栈的方向
对我来说全栈开发者是对每一层都熟悉的人,如果不真正对所有的软件技术感兴趣不会对它们精通。
好的开发者熟悉整个堆栈,他们是知道如何使生活周边的事更容易的人。这就是为什么在办公室我如此反对偏执的原因,当然,政治及沟通挑战在大型组织中还是按固有的套路。我认为Facebook所持有的招聘政策是:如果聪明的人用脑用心,就能在更短的时间内构件更好的产品。
全栈的层:
1.服务器、网络和服务器环境
- 知道哪里可能崩了和为什么会崩,没有什么是理所当然的。
- 适当的使用文件系统,云存储、网络资源,必须具备数据冗余和可用性的概念。
- 知道应用的伸缩性对硬件的需求。
- 什么是多线程和竞争条件?想想看,在开发机上你可能看不到这些,但是现实环境中它们就是会发生。
- 全栈coder还要能与运维并肩作战。提供有价值的错误信息和日志。确保它们是可靠的,因为运维会在你之前看到这些东西。
2.数据建模
- 如果数据模型有缺陷,业务逻辑和上层逻辑就要用奇怪的代码(很丑)来弥补数据模型的缺陷。
- 全栈开发者要能够建立合理的、标准的关系模型,包括外键、索引、视图、查找表等。
- 全栈开发者要熟悉非关系型数据存储(应该指的不止是NoSQL),并且知道它们相对关系型存储优势所在。
3,业务逻辑
- 应用提供的核心价值。
- 可靠的面向对象技能。
- 可能会用到的框架。
4,API层、Action 层、MVC
- 理解外部对数据模型和业务逻辑的操作。
- 该层会有很多框架应用。
- 全栈开发者要具备编写清晰、一致和易用的接口。过高的复杂度让人厌恶。
5,UI
- 全栈coder:a)知道如何创建可读的页面布局;b)或者明白自己需要帮助设计师。A或B,关键是要能有好的视觉设计。
- 掌握HTML5和CSS。
- JS正在逐步成为语言新锐,Javascript的世界里已经完成了很多激动人心的工作(node, backbone, knockout...)。
6.用户体验
- 全栈coder要知道用户需要的就是It works!
- 一个好的系统不会废了用户的手腕和眼睛。一个全栈coder会发现和审视需要8次点击、3步操作的流程,并最终把它一键搞定。
- 提供有价值的错误信息。如果崩溃了,就要向用户致歉。有时候程序员会写出让用户自我感觉很二的错误信息。
7.知道用户和业务到底要什么
- 现在我们模糊了架构的界限,但却可能远离了实际需求。
- 全栈coder要明确知道用户使用软件时的场景,而且要领会业务。
- 对安全性的敏感,不同的层都可能有自己的脆弱点。
关于这个问题的其它方面:
- 编写高质量的单元测试能力。顺便说一下现如今连JS也可以做单元测试了。
- 持续集成。发掘程序构建中重复、可自动化的流程,在一定程度上自动完成测试、文档和部署。
- 对安全性的敏感,不同的层都可能有自己的脆弱点。
最后:
应用严重依赖一个特定的第三方实现(lib、系统、硬件等)是非常糟糕的实践。全栈开发者要知道了解全面不代表就可以走捷径。当然在抛弃原型法中,他们可以这么干。
在技术起步时很需要全栈开发者的多面技能。然而,在团队定型后,会越来越需要专注技能。
我不觉得在具备了多语言、多平台甚至跨行业的职业生涯之前,你可以称自己为全栈开发者。全栈远超“高级工程师”,它更接近是多语言的开发者并且能在更高的角度看到之间的关联
全栈开发线路
我的书单
1.算法导论
2.计算机算法基础
3.编译原理
4.操作系统-精髓与设计原理
5.数据库系统原理
6.离散数学及其应用
7.计算机网络
8.计算机组成原理
9.Essential C++(注释版)
10.java程序设计教材
11.数据结构
12.线性代数
13.高等数学
14.大学物理学
15.概率论
16.数理统计
17.模拟电子技术
18.电路原理
19.Linux服务器操作系统
20.网络设备与网络技术
清华大学计算机系12门课程
1.数据结构 严蔚敏
2.编译原理 张素琴
3.内容中心网络体系架构
4.计算机系统结构
5.图论与代数结构
6.计算机组成与结构
7.80x86汇编语言程序设计
8.C语言程序设计
9.多媒体技术基础
10.数据库系统概论
11.C++语言程序设计
12.计算机局域网
知乎书单 by ZhiSheng
C语言
-
《C程序设计语言》
-
《C语言参考手册》
C++
-
《Essential C++》
-
《C++ Primer》
-
《深度探索C++对象模型》
-
《C++程序设计语言》
-
《Think in C++ C++编程思想》
Java
-
《 Java语言规范》
-
《Java并发编程实战》
-
《Java核心技术 卷1》
-
《Java核心技术 卷2》
-
《 Java编程思想》
-
《Effective Java》
-
《深入分析Java Web技术内幕》修订版
-
《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版
Python
-
《Python学习手册》
-
《Python核心编程》
-
《Python网络数据采集》
-
《Flask Web开发:基于Python的Web应用开》发实战
GO
- 《GO并发编程实践》
Network
-
《计算机网络自顶向下方法》
-
《计算机网络》
-
《计算机网络系统方法》
-
《TCP/IP详解卷1》
-
《TCP/IP详解卷2》
-
《TCP/IP详解卷3》
算法
-
《算法导论》
-
《算法》
数据结构
- 《数据结构与算法分析C语言描述》
程序设计
- 《程序设计实践》
Unix/Linux
-
《The Design Of The Unix Operating System》
-
《 Unix环境高级编程》
-
《Unix网络编程卷1》
-
《Unix网络编程卷2》
-
《Unix超级工具》
-
《Unix编程环境》
-
《Unix编程艺术》
-
《鸟哥私房菜——基础知识篇》
-
《鸟哥私房菜——服务器篇》
-
《Linux内核设计与实现》
-
《Linux系统编程》
-
《深入理解Linux内核》
-
《 Linux设备驱动》
UML和面向对象
-
《面向对象分析与设计》
-
《UML面向对象建模与设计》
-
《UML用户指南》
-
《设计模式》
计算机组成/体系结构
-
《深入理解计算机系统》
-
《计算机体系结构量化研究方法》
-
《计算机组成与设计:硬件/软件接口》
-
《计算机组成与嵌入式系统》
-
《MIPS体系结构透视》
分布式/架构
-
《分布式系统概念与设计》
-
《分布式系统原理与范型》
-
《大型网站技术架构:核心原理与案例分析》
-
《大型网站系统与Java中间件实践》
大数据/HADOOP
- 《Hadoop权威指南(中文第2版)》
数学系列
-
《数学分析新讲》
-
《数学之美》
Git
- 《Git 权威指南》
安卓
-
《第一行代码 android》
-
《Android 开发艺术探索》
-
《安卓群英传》
其他
-
《人月神话》
-
《编译原理》
-
《事务处理》
-
《汇编语言程序设计》
-
《程序员的自我修养—链接、装载与库》
-
《代码揭秘----从c/c++角度探索计算机系统》
-
《编程之美》
-
《剑指offer》
学习方法
一定要整理适合自己的学习方法,保证学习效率,学习过程中都会遇到瓶颈,当自己无法理解新知识时就是瓶颈
1.可能是学习方法不够完善,有些知识不够融会贯通.
2.学习跨度不能太大,导致自己理解不了.
3.梳理自己的学习体系,程序语言不是死记硬背,而是靠理解和体会进行使用,一定要有自己的理解看法,而不是生搬硬套书和视频当中的看法.
学习态度
谦虚,好学,内敛,成熟 学习态度,一定要是主动学习,主动延伸,而不是被动学习. 我会主动的去使用百度学习我每一个不懂的知识点. 例如 :
- Apache 配置这个知识点,我就会去搜索 "Apache配置" 以及 "httpd.conf配置".
- MySQL 数据库这个知识点,我就会去搜索 "MySQL开发"关键词.
- 百度学习的效率如何提高,主要是在关键词的搜索上,当你学习一方面的知识时,例如HTML知识,你就搜索"HTML开发" +"空格"+"你想搜索的知识点".例如JavaScript开发 "JS开发"+"空格"+"XXX效果实现".重点关注简书、CSDN、github、Stackoverflow等网站的结果,而不是局限于百度知道,百度百科等.
知识很多,网络上资源也有很多,你不学永远是0. 量虽然很大,但请一点点进行学习,循序渐进~
全栈开发这里想说一下个人观点,有很多人说: "全栈全栈,全都懂点,全都不精,全都不会."
这个观点,我不否定,但我不认同,我投入全栈的学习,有我自己的目的,那么我为什么要和那些全都不精的人在一个圈子里.不是因为学的多,就一定学不会,那请问大神也都是什么都会啊.请不要因为别人否定自己,否则你就已经输了. 本文涉及的知识点也不是绝对的全栈,算是全栈入门,全栈水平也有高低,请勿学前自满.
学习路线
在进行学习路线学习时,会遇到很多自己不懂陌生知识点,请你毫不吝啬的使用百度吧~ 学习线路请自我规划,全栈只是一个概念,由你所决定,不必跟着前人脚步行走,如果硬要我指明一条道路,那我就只能说:任何东西都有可学习的地方,学海无涯,不断走下去,即可鹤立鸡群,龙出深潭!