编程之路 一
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
《微信小程序入门与实战》这门课程在慕课上线快20天了。陆陆续续收到不少好评,得到了同学们认可,心里还是很开心的,这种喜悦和当年创业时通宵上线一个新版本一样,成就感满满。后面也会在课程中加入一些诸如如何在小程序中使用ES6、LESS和SASS等小知识,使课程更加饱满和丰富。
这篇文章篇幅会比较长。我并没有打算把它写成鸡汤,它更像是我这些年对编程、对管理、对市场的一次总结与回顾。如果这篇文章,能让每个读他的人有那么一点点儿收获,那就值得。我很懒,很少舍得花时间写这么长的文字,既然它很长,那么请允许我占用一点儿篇幅来向一些人做一个致谢。
首先要向慕课的教学老师——性感小龅牙以及慕课的教学团队,致谢。小程序9月22日公测(最早时候,开发工具腾讯还不开放,还要破解才能用。),我大概在9月27日完成了课程这个demo的第一版。最开始做这个项目并不是为了出课程,而是想从技术和商业的角度分析和预测一下小程序。文章阅读量不错,很多TMT媒体都转载了这篇《换一个角度,再来看看小程序的发展与开发》。我自己编写小程序的过程中,确实觉得很 简单,但踩了不少的坑,我整理的问题记录差不多有30多条,多半官方在后来都修复了。我不能说本课程是最好的小程序学习课程,但它确实是最好的踩坑指南,将帮助同学们节约很多时间(其实我一直觉得这是视频课程最大的价值)。商业价值,我并不是太关心,但站在学习的角度,我意识到了小程序是绝好的前端入门平台。随后便开始和慕课老师讨论这门课程。我并不想做官方文档的搬运工,所以决定上来就做实战,把API都融合到项目里,用项目贯穿整个课程。为了保证课程的质量和小程序接口的稳定性,我们一直等到11月3日小程序正式公测后,才开始课程的设计、研发、录制(是的,不只是编程,课程同样需要研发)。做视频真的非常的耗时间,产出1个小时的视频差不多需要12个左右的时间。前期需要构思、设计,考虑如何把知识点巧妙的串接到项目中;中期要录制,一小段一小段的录,录不好就要重录(舌头打卷儿了重录、这段没讲透彻重录、电话响了重录、外卖来了重录、有狗叫了要重录、小龅牙不满意了要重录。。。)。然后就是慕课要花大量时间精剪、后期处理,教学经理们并不比我们轻松。这门课程的顺利上线,有一半儿功劳要归功于慕课的教学团队。这个时代,能静下心来做内容的团队真的不多,这也是我选慕课做课程的最主要原因。
其次要向课程群里的好几位同学致谢。他们经常在我没看到群消息的时候,主动帮我解答其他同学的问题,让课程群一直保持着一个不错的活跃度与回答率。除了图中的,还有很多同学。甚至有同学把我课程的笔记都整理了出来,分享给大家。
做这门课程的初衷,倒不是像很多文章吹嘘的那样小程序多么多么有前景,秒天秒地秒App。实践才是检验真理的唯一标准,小程序的未来还需要持续观察,毕竟现在才公测,应用市场还没开放。我不会因为做了这个课程就使劲儿吹这个东西有多好,技术人就要站在技术的角度来分析问题,小程序未来如何,每个开发者都应该有自己的分辨力。我做这门课程一半是想做一个非常好的小程序入门课程。我常以为万事开头难,编程尤其如此,一旦入门,那提升与进阶都只是时间的累积问题。但怕就怕在折腾了很久,结果是“从入门到放弃”。所以,不要轻视入门课程的价值,它往往比高级进阶课程更重要,更加难以讲解。很多时候我们认为课程里一个知识点很简单,那是因为我们已经有了一定的编程经验,但对于入门学习者来说,却并没有任何的相关经验。比如,我们讲Java的注解或者Python的装饰器,我们就不能说:这个概念很好理解,它和C#里的元属性一样。虽然他们在概念和设计模式上都一样,常用来做AOP,但我们却不能在入门级课程里这么类比。不能类比,就像作文里比喻句被禁用,讲课的难度提升了无数个等级。
另外一半是因为,我认为小程序是绝好的入门前端的平台,非常适合两类开发者:1类是没有任何编程经验又想 进入前端领域的开发者;2类是服务器开发者想转做前端或者想学习一下前端的知识。
学习前端,最难的不是JavaScript语言本身,而是有太多的框架要学习,最基本的JQuery必须会,NG、Vue、React三者选其一、Grunt也要会。这任何一门技术的学习成本都远远的超过了小程序的学习成本。小程序由于比较封闭,不支持DOM元素,大量的已有库都是不可以使用的,也没有必要使用,这就减少了初学者很大的学习压力。而小程序里的很多思想比如数据绑定、模块儿化的JS、模板编程,同现在主流的MVVM框架异曲同工。由小程序入门去前端,再反向进阶大前端,是比较好的路径,学习曲线会相当平滑。
对于已经有很好前端基础的同学,我建议不要把小程序看成是一个什么新技术,他不是iOS和Android,你就把小程序就当做是一个普通的Javascript框架(但实际上它是一个平台),就像你学习AngularJS、React、Vue、JQuery一样。我认为这种心态很划算,花学习其他框架四分之一的学习成本,就能掌握一个可以开发出接近于原生App体验的技术。即使你不是从事微信开发,你的公司也没有微信的业务(但现在的公司没几个能和微信脱边儿的吧),那么自己没事儿快速做做小项目、实践一下自己的小想法、创业初期拿来过度、做做原型给客户先看看、接一些外包的单子,小程序非常合适,很多业务都没有必要动不动就操起iOS和Android的大刀,用用轻巧灵便的小程序足矣。
好了,硬广就不打了,我们还是来说说编程那些事儿。
给这篇文章定个基调,它不是鸡汤,无论我的建议如何,都是从客观上分析现在的市场与环境,谈的是趋势和现实,并不代表绝对。总有那么一小波人,可以逆流而上,不走寻常路也可以“惊起一滩鸥鹭”。但那毕竟是少数,这不仅需要努力还需要一定的运气加持。我们按照常理来出牌,规划出一条稳定的线路学习编程。而中间如果有奇遇,那更是锦上添花,而如果没有也大可不比 慌张。
编程需要理性,选择也需要理性 。但无数的先驱事例告诉我们,最终的选择往往都是非理性的。如果人人都能理性的思考问题并且做出选择,那么白起、岳飞不会冤死、大明王朝不会覆灭、诺基亚手机依然长青,当年的校内网也不会一落千丈,凡客和陈年也还可以安安稳稳的卖他的白衬衫。喜好和性格才是决定选择的最本质原因。所以,本文内容仅供参考,真正的选择请遵从自己的内心,喜欢就是最好的理由,没有道理。有不同意见的同学,也请不要在意,一笑而过。
我看到课程群里有很多还在上大学的同学已经开始不断的学习编程,让我不禁回想我当年上大学的时候都在做什么,除了通宵游戏、整天踢球、混学生会,对编程最有意义的高等数学、统计学、线性代数完全没有听过课。从大学开始学习的同学,你们需要的是坚持。等工作几年后你就会有体会,为什么当初大学的时候先人一步的去练习编程、实现是那么的重要。互联网的一年时间,真的是足够改变太多。什么是成功,对于这世上绝大多数人,不是先定一个小目标赚它一个亿,而是你永远先人一步,上学的时候做别人工作时候的事情,工作前两年做别人工作四五年该做的事情。
我大学时也帮老师做过一些小项目,当时也会一些C++,但真正做东西的时候用的是dephi,传奇的Borland公司死掉后,Dephi这个优秀的语言也渐渐淡出了人们的视野。当时大概是09年还处于桌面时代与Web时代的交接点,C#是唯一可以替代Dephi的语言。于是就开始做C#,这一做就是5年。中间陆陆续续的做了Flex和Silverlight,在当年这种富客户端技术盛行的年代,我依然坚信Javascript这种由ECMA开放组织控制的语言才会笑到最后。当然,当年我只是坚信Javascript不会死掉,但我没想到,JS会发展的这么好,甚至有了Node.js这种服务器技术。
假设你是一个没有任何编程经验的0基础初学者,你肯定会问我第一门语言学什么好呢?
我的推荐是:Java。无论你是准备做前端还是服务器还是移动端,我都推荐你第一门语言学习Java。说到语言选择,我们引用一张TIOBE 2016年10月的编程语言排行榜:
我们从其中提炼一些常见的主流编程语言:
- C、C++、Objective-C
- Java、C#
- PHP、Python、Ruby、Go、Swift
- Javascript、Lua
第一行中的C类语言,是最为经典的编译型语言。这些语言运行速度快,性能好。但谈到学习嘛,不推荐,除非你准备以后从事系统级别的研发或者iOS开发。这些语言语法晦涩不够现代化,概念较多,不利于上手学习,很容易让人望而却步。特别是OC。
第二行 Java和C#两大经典的工业型设计语言(Java和C#都不算严格意义上的编译型语言),他们牢牢的占据着企业应用开发市场。这两哥们儿相爱相杀很多年,C#不断借鉴Java社区的思想比如MVC、ORM,推出了http://ASP.NET MVC 、http://ASP.NET Web API、EnityFrameWork,而Java不断的借鉴C#语法的优势,比如Lambda表达式。从语言层面讲,C#要强于Java,更简单更自然更容易理解,而Java更加的古典与传统,遵循着编程里很多经典的设计思想。但Java在框架创新力上我认为是要强于.Net的,且社区的创新力与活跃程度也要高于.Net。微软有很多很好的东西,比如说SignalR,一个做实时应用的框架,可以用长连接和WebSocket兼容各个浏览器。当年我们创业时,做了一个类似于国外很出名的Sass应用Slack,选择的核心框架就是SignalR,当时NodeJS还很不成熟,SignalR几乎是唯一的选择。只可惜微软的东西在国内太不招开发者待见~~~。但我说我的编程基础和思想全是C#给的,这一点儿都不夸张。
第三行 基本属于解释性(函数式)语言。随着互联网的火热,这些语言风生水起,火热程度已经大大的超过了Java和.Net(大家要知道Java和.Net不仅仅是用来做Web的,甚至他们诞生的时候Web还不那么流行)。这些语言代表着Web开发的另外一个阵营,他们以快速开发著称。很多同学喜欢拿PHP作为入门级的语言,我并不推荐,开发确实简单,内置了大量的全局函数,但面向对象的概念很弱。Python比较特殊,也是我最喜欢的语言,既有脚本类语言的特点,又有很强的面向对象的特性。
第四行 脚本类语言。Javascript已经快一统江湖了吧。Lua虽然份额低,但大量的游戏脚本、插件都是用Lua来开发。著名的Redis也是使用Lua来做扩展。
那这么多语言,为什么选择Java。第一是因为编程的基本思想和思路非常重要,也就是我们说的基础要扎实,现在编程语言太多,很容易让人迷茫。而Java是一个经典的语言,其语法的设计即经典又现代化,并且它很全面,其他语言有的Java里有,其他语言没有的Java里也会有,比如大家津津乐道的NodeJS特性异步非阻塞 IO,Java一样可以很好的实现。但是当处理CPU密集型操作的时候,NodeJS就无能为力了,因为它的场景是用来处理大量IO操作的。其次是因为,面向对象的应用始终是新手和老手之间的区别。OO的3个特性无数人倒背如流,但没有几个能正在的在实际项目中很流畅的应用OO的。面向对象是什么,是自然世界在计算机里的映射和延伸,不是我们学到几个概念就能叫会面向对象了,这需要大量的实践和体会。这是一道儿坎儿,需要不断的思考,才能有所提高。选择Java作为入门语言对以后深入理解面向对象非常有帮助。但像Javascript、PHP这些函数式语言,也有面向对象的概念,并且也可以实现绝大多数面向对象的特性,但这个实现并不是那么的自然,是为了“面向对象”而“面向对象”。这一点在JS里尤其显著,利用Prototype可以实现绝大多数的面向对象的特性,但既不优雅,也不容易理解(当然ES6的出现解决了部分这样的问题) 。函数式本身就和OO是两个世界的东西,它有它的写法和模式,不应该强行的去OO。所以函数式语言的学习,我建议是在对经典OO掌握之后,再去学习他们。
再者推荐Java是因为,Java的学习资源太、太、太丰富了,成套的极其详细的视频教程到处都有,还是免费的。不信你看慕课的实战课里有涉及到Java的吗(Android不算!),没有,为什么?因为Java的视频教程已经出烂了,什么基础的、实战的、Web的、桌面的、游戏的满大街都是,出这个肯定没有NodeJS、Python好卖。
其实,说到入门语言,C#比Java更加合适,但国内C#的市场小,机会少,很多人是瞧不起C#的,理由是.Net不开源。。。市场小、发展受限是真的,C#目前在国内主要是很多传统企业、外包企业和政府项目会选择C#,互联网公司选择C#的真的是少之又少。国内可能上海.Net的氛围还不错吧。但说到不开源,这个就很搞笑了,Java开源有几个人又去读过源码,很多人连开源是什么意思都没搞清楚,几种开源协议GPL、BSD、MIT是什么也不都知道,谈什么开源。何况Java也不是全部都开源,只是标准的那一部分开源。开不开源真的不重要,跟我们屁关系都没有,对初学者来说就更无关紧要了。开源最主要的是能够拥有一个良好的社区氛围,Java社区一直比.Net更有创新力原因就是在于它开源。但在国内,大多数开发者都是只索取不贡献的,开源对个人提升来说就更无关紧要了。推荐Java而不是C#的原因还是在于未来的发展上,C#在很多互联网公司眼里你会和不会没什么区别,你说你有5年C#开发经验,1年Java经验,很多互联网公司是直接忽略掉你这5年C#经验的。不过,微软现在也开始拥抱开源了,.Net Core、VSCode、Win10 Bash 就是一种态度。
当然也不是说你现在是做.Net的就跳坑里了,如果你一门语言很精通,我相信你学习其他的语言也不是难事。我也做了差不多5年的C#,但未来发展的路径确实比Java要窄很多,至少在国内是这样。京东早年是.Net结构,后来还是全部更迭为Java。现在绝大多数公司早期创业时,都会选择使用PHP,后期再替换为Java,比如淘宝的技术演进就是趋于这样的一个替换过程。淘宝早年的PHP代码还是从国外买的。目前我知道的国内用.Net的互联网公司,貌似就是携程、当当网和CSDN。早年经常用C#写代码,当时也没什么语言之间好和坏的概念,纯粹就是觉得VisualStudio真好用。
讲了些题外话,我们接着说Java。那么学习Java要学到什么程度?那看你以后打算做什么方向。如果你只打算做前端方向,那么把Java的高级语法和特性学完即可,要能够理解面向对象、同步异步、多线程、并发模型、反射、正则、线程的同步与线程锁,但你不需要学习任何一个Java框架。Spring、Jersey、Hibernate、Structs都不需要去学习。
如果你打算做服务器方向,那么Java你是必须精通!精通!再精通!经典的SSH(Spring、Structs、Hibernate)、AOP切面编程、Maven这些你都需要精通,还要去找一个标准的Restful API框架,这里我推荐Jersey。除此之外如果你想做服务器,那么Java虚拟机(JVM)的相关知识一定要精通,关于这方面的知识很多求快的同学都不会放在心上,但我可以说这方面的知识非常非常重要,如果你不了解这些知识,编程之路越往后,就越难做,很多问题你将以一种似是而非的方式来理解,因为你不了解代码在底层的运行原理,你的代码bug量会比其他基础好的同学多很多。JVM原理也是大公司校招的时候必会涉及到的经典面笔试题。
关于数据结构和算法要不要精通,这个讲起来挺长,我们放到后面再说。我认为不需要急于去学习数据结构,没有几年的工作经历,数据结构对你来说和中学语文课本一样,过目就忘,你也不知道这些东西学了干撒?考试?这到是个不错的理由。
这里还有一个建议就是,学习语言的时候,特别是0基础开发者,不要去使用任何的IDE工具,比如Eclipse或者Intellij,使用简单的文本编辑器比如VSCode(我不推荐NotePadd++这种太简单的,没有必要),然后自己手动的去引入类库、编译、执行代码。麻烦是麻烦了点儿,但日复一日的重复这些操作,就像有如神助一样,受益颇深。当然我说的是在学习阶段,去公司做项目还是老老实实的用IDE吧,学习和做项目是两回事儿,别人不会因为你用记事本写项目就对你刮目相看,公司永远把工作效率放在第一位。技术不是运营和销售,但技术同样可以通过提高研发效率来为公司获取利润。编程这东西,只要有时间,每个人都能慢慢磨出来,我们又不是去做航母、卫星、人工智能,我们写的绝大多数代码,都不是开天辟地的,你都能在网上搜索到。那区分一个优秀的开发者和一个普通的开发者的关键点就是写代码的效率。
如果你还在上学,完全可以先不慌不忙的认认真真的先把Java学好。不要看着什么火就学什么,也不要担心我学这个语言会不会淘汰啊(小程序才公测,就有同学问我,会淘汰吗。。。后面我们在说关于小程序的事儿)。前面我提到的语言,你只要不是点子太低碰到像Dephi这种。。。基本上10年内不会衰败。就算运气不好,学的.Net,哪天微软被纳德拉玩挂了,那还有开源社区会接管.Net的。而且学好我说的Java,你再去学其他的语言,真的轻轻松松(我说的是学好,会编程 != 学好)。
第一门语言的选择,还是看你自己。你是想就在这个行业混口饭吃,还是想深耕于编程这个职业,如果是想混口饭吃,那么XX天精通X语言,非常适合你。而如果是想在编程的领域里做出点儿成就,对于未来有很强的规划,那么还是老老实实的学Java吧,不慌不忙,不急不躁,付出肯定有回报。