一、一场技术进化之旅
我们身处于互联网的快速发展期,在互联网行业里的程序员在其职业生涯中只使用一种技术是不大可能的。回顾下从PC互联网过渡到移动互联网的技术更替史,Windows开发日渐落寞,Nokia的塞班系统消失于人们视野,iOS、Android迅速发展起来成为移动互联网主流,于此同时前端发生着巨大的变革,H5涌来,Flash遭淘汰,Web APP兴起并占有一席之地,微信服务号、小程序被发明出来,人工智能、AR/VR、区块链技术火热起来。伴随技术演变的是互联网公司和互联网产品的兴衰演变,旧的技术生存空间越来越小,即使你抵触学习新技术,不愿变换自己的技术,身处在这个环境也是相当困难的。
一些技术网站每年都会统计程序员的收入,你的薪水是由什么决定的?很大可能你的薪水在统计图表中的位置是由你的技术水平相对与市场上同行的技术水平决定的,技术决定了程序员的收入,决定了能否早点在城市里买到房子。当新技术开始流行时,市场上开发者的稀缺导致薪水变高,2012年时刚开发过一个APP的iOS应届生可能要比技术娴熟的Windows开发者薪资高,APP技术火热起来对于以前从事Windows开发的程序员来说未必不利,当写过多年C++的程序员改写Objective-C之后在一两个月后迅速成为了APP开发高手,超越了比他们多半年经验的同行,原因是技术的同源性,C++程序员早已在内存管理,多线程同步,数据处理方面积累了实践经验,这些经验在APP开发上依然有用。然而也有坚持C++开发不愿转向APP开发的一类人,工作选择范围越来越窄,最终会被迫转向新技术。
既然技术对我们自身有这么大的影响,我们不妨做技术的朋友,对新技术的出现保持欢迎态度。既然互联网技术在进化,那么我们自身的技术也应该进化。要在进化中立于不败之地,请记住三句话:人无我有,人有我精,人精我通。
什么是人无我有?
新技术流行起来并为大众所知时,往往技术的传播速度比技术普及速度快一两年甚至几年,这时候市场上相关人才紧缺,很多公司开出高薪水,即使经验不怎么丰富的初学者也有机会拿到高薪。
什么是人有我精?
随着新技术的发展,市场上人才供给逐渐饱和,市场上充斥着太多平庸的程序员,公司的产品要保持竞争优势需要吸引精通技术的程序员进来,这时候将你的技术从普通升级为精通,保持竞争优势。
什么是人精我通?
技术进化追求的是进化效用,尽管市场上技术精通者仍然稀缺,你的技术已经达到精通水平。但一直在很细领域耕耘的你花很多时间学习但进步空间越来越小,与其在边际效用很低的领域里耕耘不如去扩展技能边界,学通相邻的领域,假如你是iOS出身,那就学Android,学前端,学服务器端。这样你就拥有了全局之眼,能系统性地看待问题,也许能给出比较优秀的方案。
通往全栈开发者之路,其实是你的技术进化之路,这条路该怎么走呢?关于学习路径,推荐先在有限范围内进化出深度,后发展出广度,在技术进化过程中坚持学习,不断将新技能纳入你的技能版图。
二,全栈开发者要面对的现实
在初创小团队里,老板缺钱缺人更缺技术高手,你做为全栈帮公司开发前端、APP、服务器端,技术发挥地淋漓尽致,犹如一把瑞士军刀,哪里缺人你补到哪里,去哪里都是把好手。然而在规模稍大的公司里,各个岗位不缺人,大家分工明确,彼此协作,似乎不需要瑞士军刀式的人,做为全栈的你只能呆在公司某一个部门使用一种技术,你辛苦掌握的其它技术长期得不到施展。
你在与同事协作上,由于前后端技术你已经融会贯通,拥有全局之眼,能从技术层面上系统性的思考一个问题,提出更好的方案。另外更重要的是,成为全栈的你很可能不但对技术有着特别大的热情,还喜欢业余时间就创作点作品,这时候你的全栈技术就发挥价值了。
你能成为全栈意味着你对学习技术有着开放的心态,对工作也不大挑剔,公司哪里缺人你就去哪里补。在收入上你也可能不差,因为你技术进化过程中先有的深度,后有的广度,凭借已经有深度的技术就能给你带来不错的收入。
至于成为全栈之后能给你带来多少收益不重要,因为你做到了全栈,你将与众不同。
三, 全栈兵器库
软件技术发展到今天诞生了许多编程语言,每种语言的生态系统中也诞生出了有很多的框架、库,全栈开发者要选出合适的来学习。选择语言和框架、库时除了他能满足你的使用目的,还要考虑它市场流行度、发展趋势、性能、上手难易度。语言和框架的选择应慎重,因为学习成本高,它应当是市场上主流群体在使用的,还没颠覆者出现,它不会很快衰退下去。能成为颠覆者的必要条件是对现有技术有足够的破坏性,解决了人们的痛点,为人们提供了渴望的解决方案。库的选择除了能达到目的还主要从性能、使用难易程度方面考虑,用户端还要考虑库的体积,一个选择技巧是去看github上的Star数,并且没有严重的issue。这里我们提到的库是指业界做项目时的必选库,一般不需要动它的源代码,所以不必考虑它的代码易读性、可扩展性。在技术进化之路上还应该遵守的一点是,学习第一手资料,寻找最佳实践。
本文已选用的技术
服务器端:Python
前端:
2C的网站:JavaScript + html + css
Single Page App和内部系统: ReactJs
APP:
ReactNative,同时需要具备一点iOS和Android原生开发能力。
服务器端:
服务器端比较热门的开发语言大概有:Go,Python,PHP,Nodejs
1. 开发语言:Python
Python容易上手,做服务器端开发需要写REST API,服务器端渲染网页,可能需要做爬虫,Python周边库完全能满足需求,这波人工智能又带火了Python,也为将来转型铺路。
Go也是不错的选择,有着比Python更高的效率,所以核心服务可以用Go来写,现在开源的区块链库大部分都是Go语言或Nodejs写的。Nodejs也有着较高的执行效率,而且对于前端开发者来说学习门槛很低,因为都是用JavaScript语言开发,而且在前端环境搭建上很可能已经在使用Nodejs了,所以Nodejs也成为众多全栈开发者的选择。与Nodejs相比较而言,Python开发体验更好,比如操作MongoDB的时候,Nodejs的mongoose库涉及到Schema和Modal概念,异步获取数据callback方式给代码带来可读性的下降,Python使用PyMongo直接是mongodb命令的封装更易理解。以上仅仅是我个人的主观感受。
作为全栈开发者的你也许并不需要精通服务器端技能,一种有效的的学习策略是花20%的时间学80%的知识,再将这些知识运用到实践中,遇到问题再研究解决。非专业服务器开发者学一门语言基本就满足大部分场景的使用了,再学第二种、第三种边际效用递减。
Python系兵器库
Flask是一个Python框架,集成了Jinja2 模板引擎和 Werkzeug WSGI(Web Server Gateway Interface)。
Flask文档地址:http://flask.pocoo.org/
Jinja2文档地址:http://jinja.pocoo.org/docs/2.10/
Werkzeug文档地址:http://werkzeug.pocoo.org/
Flask-RESTful
配合Flask使用,使得写REST APIs更方便
Flask-RESTful文档地址:http://www.pythondoc.com/Flask-RESTful/quickstart.html
Requests
Python的HTTP请求库,文档地址:http://docs.python-requests.org/en/master/
PyMongo
MongoDB的Python库
文档地址:https://api.mongodb.com/python/current/
redis
redis库
文档地址:https://pypi.python.org/pypi/redis
Scrapy
Python的网络爬虫库,文档地址:https://docs.scrapy.org/en/latest/intro/install.html
virtualenv
你可能在不同项目中使用了不同版本的Python,使用virtualenv可以让项目的Python环境不与其他项目的冲突。
virtualenv文档地址:https://virtualenv.pypa.io/en/stable/
服务器端项目可能涉及到多个服务,我一般分为两个服务:一个核心服务,一个WEB-SERVER服务。
核心服务:
提供REST APIs给前端,APP,WEB-SERVER
由于通常情况下不需要渲染页面,所以用不上Jinja2模块。
WEB-SERVER层:
主要工作:接收从浏览器发起的HTTP请求,向核心服务发起请求获取数据,用获取到的数据使用Jinja2渲染html页面,返回给浏览器。
前端
前端技术发展到今天出现了两个分支:服务器端渲染和前端渲染,早先的时候都是服务器端渲染,开发网站服务器端可以一手包办,后来前端渲染应时代而生,构建复杂的Web App成为可能。两者有什么区别呢?服务器渲染的特点是容易做SEO优化,方便爬虫爬取数据,相比前端渲染,首次加载页面速度快。前端渲染的特点不容易做SEO优化,首次加载速度慢,一旦加载完操作体验会很好。明白了这个区别,我们看看哪些采用了服务器端渲染,我们在浏览器里浏览大部分页面都是服务器端渲染的,比如百度,京东,淘宝,美团,58等。前端渲染常见于Single Page App,比如微信服务号,微信小程序。一些企业内部系统,因为不需要做SEO。有的项目还使用了服务器端渲染与前端渲染结合的方式,比如收费的课程网站,它既需要做SEO的页面,也需要封闭性好、体验好的页面,给网络爬虫设置了一定的门槛。你遇到了哪些使用前端渲染的项目,哪些既使用服务器端渲染又使用前端渲染的项目?欢迎留言,一起讨论。
前端渲染为什么会慢,原因是前端犹如一个APP,先下载到本地,再去执行,当第二次打开运行时速度明显快很多,因为前端这个APP包已经缓存在本地了,如果还嫌慢,那就采用一些优化措施吧,首屏用服务器渲染,其余页面前端渲染,包拆分为几块,由于第三方库不常更新而主体包经常改动,拆分开,当有新的主体包时仅下载主体包。至于SEO优化也有解决办法,一种通用的方法是在服务器端对发来的User-Agent做判断,如果是搜索引擎的Spider,就在服务器端吐一个带数据的简易页面。另外React有服务器端渲染方案,需要结合NodeJs做,既支持前端渲染又支持服务器端渲染叫做同构。
一,服务器端渲染
由于是页面在服务器端渲染,主要的工具已经在服务器端那节课提到过了,使用Flask框架自带的Jinja2模板引擎。
写JavaScript可以使用ES6语法,然后使用Babel转成ES5,写css可以使用less,最后转成css,写css的时候可以属性不带前缀,为兼容其他浏览器,可以使用autoprefixer。这些工具大大提高了开发效率,最后使用Gulp来完成代码转换、压缩、输出到目标目录等工作。
从你写的ES6代码,less文件,浏览器并不能识别,要想让浏览器执行,需要执行一系列工作,Gulp就是为你制定工作流的。文档(中文版):https://www.gulpjs.com.cn/
Gulp提供了几个简单的API,执行工作需要使用一些插件来完成,比如:gulp-babel,gulp-less,gulp-postcss,gulp-uglify。
二,前后端分离
React
Facebook出品的前端UI库,不同于模板式渲染,React使用JavaScript语言写页面和组件。
React文档地址:https://reactjs.org/
React仅仅是个UI库,数据管理还需要借助其它库:Redux或Mobx。
Redux文档地址:https://redux.js.org/
Mobx文档地址:https://mobx.js.org/中文文档:http://cn.mobx.js.org/
webpack
网友评论