全民编程时代,如何入门计算机行业?

大咖周周秀是万门最新的分享项目,每周一位万门终身VIP将自己所学分享出来,与所有VIP共同成长。只为分享知识,传播知识;让学习不孤单,让知识有回声。

本文根据大咖周周秀语音文件《全民编程时代,如何入门计算机行业》进行整理和校对,如有疏漏之处向各位读者致歉,请多多包涵。

本期分享嘉宾

万门终身VIP4群 陈欣

(玩哪儿CTO全栈导师)

大家好,我是陈欣。感谢万门的邀请,分享这一期的大咖周周秀。

首先介绍一下我自己:我接触计算机及编程近30年,现在主要从事供应链相关软件产品的开发和咨询,同时也在尝试做全栈技术的教学。

这期的主题是”全民编程时代,如何入门计算机行业?”我将分为:破题,解惑,展望,三个部分来做这一次的分享。

破题

全民这个词,未必是一个褒义词。比方说全民炒股,全民直播,甚至全民创业,我个人也不是完全的认同。

因为中国人口众多。人口红利,会成就一些事业和公司,但是方向错了,也会弄坏一些本来的好事,因为凡事都会有机会成本。

与全民编程相比,全民英文来得更早一些,我觉得这是个很好的比拟对象。

而且我认为全民编程和全民英语一样,无论对国家,对个人,都是一件百利而无一害的好事。

做作为程序员的我,虽然英语并不擅长,但是得益于全民英语的风气,在访问各种技术文档时,不至于一脸茫然。

我相信很多人,都是全民英语的得益者,现在中国人不断走出国门,英语不再是一个最大的障碍,这就是佐证之一。

现在,全民编程也是方兴未艾,已经从一小撮技术宅男的玩物,扩展到大部分人都可以来参与学习和掌握的东西。

首先要感谢Jobs,伟大的iphone让一个2岁的孩童都可以玩上智能手机,自行去figure out里面的各种功能,使我们可以接触到高性能电子产品的时间直接前推到学龄前。

小学生开始学编程的条件已经成熟,所以现在开始的全民编程将是现在的孩童、未来的栋梁必备技能之一,无论在哪行哪业,文科理科,就像刚才说的,英语、开车(有驾照)、在10年,20年前,可能会是一个很好的谋生手段。

但是到了现在,对不起,有编程的思想,不是一个充分条件,而是会成为一个必要条件。

如果您是一个将要或者刚刚踏入大学校门的同学,无论您是否会以计算机为终身职业,编程的知识,计算机科学的一些常识,在未来的职场是必须的,我想强调的不只是会一点Office,Word排版,Excel做表格,PPT做presentation,这些除外,编程的知识会让你知道,哪些是可以做的,哪些是很难实现的。

最近有一个非常受人关注的事件,产品和前端打架。事情是真的,原因可能是个段子。所谓像段子的这个原因,是说产品有个要求,希望APP的色彩主题可以根据用户手机壳的颜色而改变。

网上有很多帖子,说这个要求怎么实现?这个我就不做讨论了。

我想说,如果产品可以多一些编程的知识就可以避免血的教训。同时,我也要为产品说一句话,所谓主题改变,是一个make sense的要求。

反而很多前端程序员会把色彩字号等,写死在CSS或者其他地方,我们称为hard coding,事实上好的做法,就是一个主题做成一个theme文件,(日语叫テーマ),可以根据场景,随时更改。

如果您已经步入职场,我相信计算机行业的一些入门知识,包括编程,也会使您现在的本职工作受益匪浅,让您的工作效率大大提高,减少许多简单重复劳动。

即便您本身不是个程序员,编程的知识也可以帮助到您去和身边的程序员沟通,让他们为您的业务写出更优秀的工具或产品,让您的工作事倍功半。

这三张图呢是说明excel,既可以做售前的预算;又可以做售后的分析报表,也可以做项目途中的进度管理。

作为一个程序员,很容易通过公式和VBA,做出上面三个功能。就算你是项目管理人员,或者是业务人员,如果你懂得程序原来可以做这些,那您就可以和程序员沟通,让他们帮你做出这些工具。

解惑

我将根据自身和计算机结缘的经历和经验介绍编程到底是什么?如何入门计算机行业?入门以后,如何更快,更好,更有效的学习计算机各项课程和技术。

1编程是什么?

简单讲,就是对计算机、软件应用,智能电话或网站发出指令,告诉它们你想要做什么。一些教育者和专家称之为 new literacy (新知识)建议每个孩子都需要掌握其基本原理,才能在未来快速变化的世界脱颖而出。

我第一次接触计算机,要追溯到上世纪的80年代,那时我刚小学毕业进入初中。

处于改革开放初期的上海,已经有了从我们的邻国日本,引进的任天堂公司的FC(Famicom)游戏机,也就是后来所说的红白机。不久,中国的广东省,出现了小霸王学习机。它仿制了红白机的游戏功能,同时可以进行一些简单的编程。

我PO了几张图在这里,有BASIC语言和LOGO语言。还有小霸王学习机当年的广告,所以那时起,我就接触到了编程。

BASIC是一门比较早期的解释型语言(计算机编程语言的分类,我稍后会有所提及)。即便没有学过编程,看Basic的代码,应该也能猜个八九不离十。

第一段,有一个循环,循环5次,然后输出 三角函数 sin(1),2,3,4,5的值;

第二段,打印一个π的近似值,由南北朝数学家祖冲之发现的π约等于355/113;

第三段,是一个正切函数;

第四段,输出当前的日期和时间。

再来看Logo语言的例程,这是数学上的分形,用到了递归,所以程序本身非常简洁。对于没有学过程序的同学来说,也许有点烧脑。

我们今天说全民编程的时代,要懂一些编程思想。编程思想,我会把它分为几个等级,稍后我会详细叙述。而懂得递归是其中的一个等级。

致力于做一个优秀的程序员,递归当然是必须要过的坎。但对于只是想了解一些计算机的入门知识的同学而言,这部分不掌握也无妨,知道个名词即可。

即使是现在,我仍然觉得1966年,50年前设计出的LOGO语言仍然是一个很好的启蒙语言。因为它的初衷是为了向儿童教授计算机编程技能。Logo的原型来自另一个计算机语言LISP,稍后介绍人工智能语言的时候,我会介绍LISP。

2如何入门计算机行业?

接触了编程语言,知道了编程是什么之后,我踏上了程序员这条人生的不归路。之后,从高中开始的IOI信息学奥林匹克竞赛,到大学时代ACM大学生程序设计竞赛。

直到现在,我的业余兴趣爱好之一,就是在leetcode和paiza(日语)上刷题解闷。(https://leetcode.com/https://paiza.jp/)

计算机其实有很多前导课程。我并不想罗列出很多的数学来吓到同学们,但事实上,的确有很多数学知识是通往高级程序员必备的。

这里我只想强调一点,就是线性代数。其他的数学,可以暂时把优先度放低,而线性代数一定要学得扎实。

在后续的计算机课程里,很多地方都要用到。如果您是一个文科生,在大学本科教育里没有学过线性代数,也没有关系,可以试试回想中学学过的解析几何,可能暂时也是可以过关的。

刚才说到BASIC,LOGO时,我挖了一个坑,现在我把它填上。关于计算机编程语言有很多分类方法。

编程语言,根据是否需要编译,可以分为编译语言Compiled language 和解释型语言 Interpreted language

这里牵涉到计算机原理的知识,我稍作解释,计算机硬件只能要执行它能读得懂的机器指令。

机器指令是0101的二进制序列,非常难以记忆。所以后来又发明了汇编程序,将机器指令和汇编代码做对应。

汇编语言已经是人类可以记忆的,可以实际操作的编程语言了。

我在1998年刚刚毕业的时候,进入一家日本的游戏公司。当时为百代公司的WonderSwan和任天堂的GameBoy做游戏,分别是Z80的汇编和8086的汇编。

而正巧Z80和8086分别是精简指令集RISC和复杂指令集CISC的两种CPU设计模式的代表。

虽然微指令系统也可以属于软件设计(虽然是固化到CPU里的),一般而言CPU的设计属于硬件设计,是Double E.计算机科学的兄弟院系。对于初学者来说可能有点难了,我就点到为止,按下不表。

一般而言,汇编语言与仍然属于比较低级的语言。这个低级和高级并不是说难度低所以没有价值,而是说层次上,它更接近机器,而不是人类的思想。

所以一般人用汇编语言写程序的时候,更容易去考虑如何控制计算机硬件的内存,寄存器,程序指针等,而忽略程序逻辑本身的构架。

相对高级的语言相继出现,各种高级语言分别有各自的思路,总体而言就是让程序员用高级语言的语法,用人类的思维去构造逻辑,而具体怎么样,让程序在机器上运行交给编译器或者解释器去操心,所以我们现在所谓的学习编程语言就是指这一些高级的语言。

编译型

优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高,可以脱离语言环境独立运行。

经典的C语言,较新的GoLang都是以执行速度快著称。

缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,有时候改一个宏(MACRO),C语言的工程全部编译的话,会非常浪费时间。

不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

C语言在不同硬件和操作系统环境里表现会不同,所以才有后来的JAVA横空出世,标榜一次编译,到处运行,就是要解决多平台的问题。

解释型

优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。

比方说Basic,PHP,Python。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

按照类型来分:

有动态语言和静态语言

动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。

Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

类型语言的强弱来分:强类型定义语言和弱类型定义语言

强类型定义语言强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。

举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理,强类型定义语言是类型安全的语言。

弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。

另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!

例如:

Python是动态语言,是强类型定义语言(类型安全的语言);

VBScript是动态语言,是弱类型定义语言(类型不安全的语言);

JAVA是静态语言,是强类型定义语言(类型安全的语言)。

综上所述,按照三总分类方法,我们可以把常见的一些编程语言,分成各种类别。

分类不是我的目的,我只是想把这些编程语言介绍给同学们。然后告诉大家,在开始学计算机时,选择怎样的语言作为入门比较合适。

一般而言我会建议同学们先学一门大语言,所以,我要定义一下什么叫大语言。

编程语言是否能语言自举,是一门编程语言是否成熟的标志。刚才说过了编译,也就是说这个编程语言的编译器,是否用这个语言本身写出来的,这个称为自举。

比方说,C,Java,Go都是自举的。C的编译器用C写的。

Java编译器javac,新学的同学可能会奇怪,在windows里,javac是javac.exe文件,应该是c或者其他编译出来的,而java的bytecode应该是class文件。

那么我可以偷偷告诉你,如果您愿意学习,在JDK的安装目录下的lib目录下,有很多Jar文件,可以把他们解开,在sun目录(不是java package)下会有javac的class文件,你完全可以通过java命令调用javac类,把自己的java文件编译成class文件,而不需要javac.exe,这就是我说的自举,java的编译器是用java写的。

我的建议是,一开始要学一门强类型的、语法糖较少的大语言。

语法糖我稍作解释不过多展开,有一些语言提供些便捷的功能,而没有这些功能,也可以用一些基础语法来实现。

现在各个新生的编程语言互相学习彼此的优点。语法糖也趋于相同,这样的语法糖是可以使用的。

特别举例,Rx系列,比方说RxJs,Rxjava,RxSwift等,大家可以在学会某一种语言后,尝试使用Rx,因为已经在各种语言里都通用了。

而一些比较特殊的,只有本语言自己发明并使用的语法糖,可以考虑暂缓学习。

所以,对于新学计算机的同学来说,我不建议过多的直接使用语法糖。

大家应该用更基础的语法单元。这样,以后需要使用没有语法糖的编程语言时,不至于不知所措。

我举个例子,excle的编程,需要用到VBA,而vba是一门很老的语言了,甚至在循环里没有continue,break这2个功能,已经会一些程序,学过循环的同学,可以闭着眼睛想一想,如果没有continue和break,你该怎么办?

Java是一门相对较推荐的入门语言,语言排行榜上10几年的第一,也不是空穴来风。

虽然现在Oracle和Google的Java官司,让Java的前途蒙上阴影。但是,作为入门的学习,Java依然是一门很好的语言。

原因在于:

1.适用范围广,不管是C/S结构,B/S结构,Java都能胜任,特别是后端,得益于Java有很棒的Spring框架,它把依赖注入(DI)发挥到极致,什么叫依赖注入,我就不展开了,有机会介绍spring时,会详细说明。

安卓现在依然可以用Java开发,以后就算以后会向Kotlin转,对于学会Java的同学,语法上不会太难。虽说语法上,换一种编程语言,不是太难的事儿,

但是,我还是要强调一点。后端的Spring的java和前端的安卓的Java,思路上是完全不同的,比方说,前端的工程师必须清楚自己的程序,哪些程序在画面线程里运行,会造成阻塞;

而后端工程师也必须清楚哪些SQL会锁住数据库。

这图是一个死锁相关的段子,同学们能看懂么?这个笑话有点冷。

说完了大语言,我想说,同学还应该再学习一门脚本语言,script语言,前面说过的解释型语言,但是我并没有说脚本语言。

脚本通常是解释运行而非编译,脚本语言通常都有简单、易学、易用的特性。目的就是希望能让程序员快速完成程序的编写工作。

相比刚才说的大语言,它更易学,更容易上手。

所以,先学脚本语言还是大语言?怎样向同学们推荐,我也非常的纠结。有点像《笑傲江湖》里的华山剑法,先学心法好呢,还是学剑法好。

不过,我建议大一的新生,先学大语言。要学得非常扎实。其他各种语言都能触类旁通。

如果您已经开始工作,我建议从脚本语言开始,那样更快更容易上手。可以很快的在工作中使用。

现阶段,脚本语言可以推荐JavaScript和Python。JavaScript的发展,可以参考这篇文章。(https://www.barretlee.com/blog/2015/12/10/after-framework-we-gonna-to-hug-data/)

从09年的基础类库完善到13年的爆发式增长,现在已经非常的成熟,特别是三大框架(Facebook的ReactJS,Google的Angular,尤雨溪的VueJS)都非常的棒。

我个人更喜欢Angular,因为它用的语言是TypeScript,是JavaScript的一个超集,刚才的语言的类型分类图里可以看到,JavaScript是一种弱类型的语言,而我个人更喜欢强类型的,对自己严格要求,对自己狠一点。

与此同时,NodeJs的出现,让javascript也可以做后端,让JS完成了全栈语言的完美转身。

虽然NodeJs因为npm依赖的设计问题,直到现在坑还是非常的多。但是无论如何,是一个非常值得关注的后端框架。

从学习成本上看,如果您是一个已经就职,并没有太多时间学习的同学,想快速学习,入门,或转行,JavaScript是完全值得考虑的。加上Html和CSS,前端您一个人可以搞定,后端用NodeJs,这样就全栈了。虽然,坑会非常多,总是可以蹭过去的。

再说一下Python,就是我前面说的语法糖比较多的语言之一。用好了,程序会非常简洁,用不好,也会造成非常难读懂。

2017年,是Python大爆发的一年。由于Python的易学易入门,社区非常活跃,Google的人工智能框架TensorFlow的界面语言使用Python,Python的科学计算框架功能强大,使之成为非常好的大数据分析的语言。

Flask设计RESTful api也非常容易上手。总之,python在后端,是一个非常好的并且易学的语言。

现在的趋势,前端还是要render生成出Html,所以还是会使用前面说的三大框架。

学完一门语言,再加上一门脚本语言。

我相信同学就会有一种感觉,似乎掌握了计算机里面的一个工具,可以让自己做很多事,可以控制所有计算机能让你控制的东西。

这个时候,你会真正的感觉到,自己已经真正的入门了。然后不断的学习,可以使自己的水平不断的提高。

程序员的水平怎么样分等级,我有我的一些看法,和大家交流一下:

1.会使用基本的语法。看别人的程序,每行代码都能看懂。但是自己写起来比较累,不太会debug,就是说,自己的代码不会调试,出错不知道错在哪里怎么修改。

2.if-else。等分支语句,for-while等循环语句。能够熟练的掌握。能够独立完成功能模块,知道怎么debug,看别人的优秀程序,可以学到别人代码的长处。

3.能够使用并构建各种数据结构:数组,堆,栈,队列,链表,树,图,散列表等,这个时候,算法已经基本入门

4.能写出回溯和递归的程序,比方说图的广度优先搜索,深度优先搜索。比方说快速排序,八皇后问题。可以算是中等水平的算法达人。

之前,我说的在LeetCode或者其他网站上刷题,就是训练做这类算法题。这里网站,做题都是有作用的。

比方说我在日本的paiza上做题,因为成绩比较好,我都挑最难的S级的题做。差不多都要达到ACM中国国家队的训练题的水平。就会有一些新型初创公司,向我发interview邀请。给的offer的薪水都还蛮高的。

5.知道23种编程范式,用它来指导自己的代码框架。

这个时候,已经不是在玩技巧,而是回归本真。算法都已经会了,不需要再去炫技。现在需要规范自己的代码。

而这5个等级,您的学习目标定到哪里?请您自己选择。如何入门我就介绍到这里。

展望

熟练精通一门计算机编程语言,不是一蹴而就的事。所以在学习编程语言的同时,肯定会涉及到计算机原理,操作系统,数据库等计算机的核心课程。

而那些更基础的数学,线性代数,概率与统计,之前,我没有说,是怕吓到大家。但等你真的入门之后,这些课程的学习会变成一个自然而然事儿。

等到这个时候,我会恭喜您,您已经进入了计算机业界的坑,再也不能回头。

您或许,会先找一份前端工程师的工作,进入一个互联网的公司。每天要和产品经理勾心斗角,同时要对付测试小姐姐的骚扰.

您或许,像我一样,关注某一个行业。成为这个行业的专家,运用自己的的计算机的知识,在这个行业内开发出优秀的产品,尽自己微薄之力,提高这个行业的效率,改造并服务于社会。

您或许更喜欢数学,更喜欢后端,有志成为数据专家。可以做大数据分析,或者用大数据进行人工智能的训练。

或许更喜欢管理,可以成为项目经理,或许您更喜欢设计产品,成为产品经理。

总之,入门学习了计算机,您有无限的可能。有巨大的想象空间,是我在这里不能罗列,将由同学们自己去发挥和创造。

另外,如果您也有一颗分享的心,我们诚挚地邀请您加入万门大咖秀讲师团。学了不等于会了,输出才是最好的输入。

如果您也打算参与分享

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180816A0FWIX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券