0x00 语言的两大特性
大多数程序员,学习一门新的语言,只需要3天时间。
编程语言是一门百花齐放的学问,有古老的C,也有成熟的 Java,有新兴的 Go,也有最好的 PHP。当我们初次踏上编程之路时,为了学好其中的一个门类,通常需要经年累月的练习,才能掌握。
但奇妙的是,当我们开始接触第二个门类、第三个门类…… 所花费的时间,会越来越少,以至于无限趋近于“3天”这个时间变量。之所以有这个感受,是因为计算机世界的基础是 C 奠定的,无论多么牛逼的软件,深入到底层,都是 C 的天下。
编程的本质,是对规则的灵活运用。
当我们学会了第一门编程语言时,并不意味着我们只学会了如何写语法,而是掌握了包括数据结构、逻辑控制、异常处理、并发模型等在内的一系列通用编程规则,虽然除此之外还需要学习语言的特性,如数据类型与函数类型,但共性的知识已经学会,第二门语言只需要学习与上一门语言的差异点就可以了。
至于新特性怎么玩、某个函数怎么写,用到的时候查一查字典就可以了。所以很多人通常会有一种感受,就是学习新语言时,一边写代码,一边百度函数怎么写,其实这都是很正常的现象,用的多了,也就不需要百度了。
共性的规则,与特性的知识,是语言的两大特性。
0x01 学习过程的方法
虽然说学习新语言是为了解决最终的问题,但学习的过程却是一种新鲜感与矛盾感相互交织的过程。新鲜感就在于初看学习纲领,好像不用细看就理解了所有的内容,细翻每一章节,嗨,不还是之前的那一套嘛。
但实际上手,却又处处别扭:缩进不同了、编译器不同了、快捷键不同了,甚至是如何跑起来都不一样了。比如学习 Java 的都会学著名的 Spring 框架,但学会了这套框架的思维体系,不一定代表你能反向写出这套框架。所谓的学习与实践,一码归一码,大概就是这种情况。
学习,本质上就是一个从“难者不会”到“会者不难”的过程,重要的还是发散、收敛、再发散、再收敛的过程。
学习语言的方法之一,便是学习语言的基础。买书也好,读文档也罢,初次看时,一定有很多不懂得方法与概念,这个时候是学习最艰难的阶段,贵在坚持。
学习语言的方法之二,便是动手能力。学习过了语言的特点,便要动手搭建编程环境,直到成功的写出“Hello World”。接下来可以试着写一个99乘法表,或者是更进阶一点,写一个简单的小游戏,在这个过程中不断解决遇到的各种问题,例如Google是个好助手,询问别人也是个可行的方法。
学习语言的方法之三,便是总结知识点,升华为体系方法。用 Xmind 画脑图也好,用Word整理提纲也罢,将语言的特点动手写下来,印象便会进一步加深了。
学习语言的方法之四,便是重视规范,向高手请教了。规范方面可以选择学习 Google 的规范方法,也或者是读一读《代码整洁之道》;而向高手请教,更是有 GitHub 这种高手云集的代码平台,寻找高赞项目,学习编写的思路。
0x02 如何用一本工具书
工具书与一些进阶的书籍不同,阅读的时候不需要纠结顺序,通常搭配一些其他的学习资料,碰到不会的知识点时可以快速的查阅问题。
另外,并不是每个人都能够熟练的阅读 python tutorial 这样的英文资料,买一本中文的工具书也是个不错的选择。
笔者买了一本图灵的《Python 编程 从入门到实践》,书籍组织的顺序与笔者写的略有不同,但也遵循了知识点 - 动手 - 总结的三阶段方法。
学习知识点,书籍的学习顺序,便是前文提到的“数据结构、逻辑控制、异常处理、并发模型”中的前三点,例如 pyhon 最重要的数据结构:列表和字段;最重要的数据模型:函数与类;常用的逻辑控制:if 与 while …… 通读知识点,遇到动手练一练便实操一下,基本上基础也就掌握了七七八八。
书籍赠送了一个速查地图,展示了需要学习的各个知识点的大体总结,当后续实操项目遇到遗忘的内容,便可以迅速定位到具体的章节查看。
这里插入一个议题:很多人喜欢用电脑+搜索引擎来学习知识,但也有很多人依旧喜欢买实体书籍来学习知识,两者只有形式上的不同,谈不上对错。例如 Python 有海量的在线资源可以学习,方便又实用;
但如果在台灯之下打开一本笔墨香的书籍,则是能够唤醒上学时刻苦读书的记忆,依旧是很多人高效学习的秘籍。只要是适合自己的学习方式,怎样用都是对的。
动手方面,书籍包括了三个实例:小游戏、数据可视化与 Web 应用程序。绝大多数的编程语言,都以开发 Web 应用为最终目的,但由于实际项目中多采用已成熟的框架,因此很容易忽略一些语言的细节。
因此对于初学者而言,项目实例是不可多得的练手项目,对于老鸟来说,数据可视化等一些语言的冷门应用方向,也值得动手尝试一番。
书籍的最后,是最经常被人忽视的章节,确是很实用的部分。例如笔者使用的是 Sublime Text 文本编辑器,对于随手格式化代码、保存某些好的代码就很有帮助;寻求帮助中的网址与 Git 版本控制,也是下一步迈向专业开发所必备的技能。
0xFF 学习过程的心得
很多人用“码农”来形容编程的人,但用“艺术农民”这个词会更准确一些。因为编程是一件想做很容易、实际做很难的事情,如果我自己的代码只有我自己看,那么代码就是一件很容易的工作,但绝大多数的场景下,你写出来的代码,不仅要给别人看,还要交给别人继续写下去,这个时候,如何让别人准确的理解你的意图,就是一件很困难的事情。
尽管代码上会有注释,但文字的东西永远都是站在自己的视角下看待问题,缺少了背景、意图与这么做的理由,简单的说明一下这行代码做了什么事,是起不到简化理解的作用,反而可能引起更大的误解。
编程是程序员独有的沟通艺术。
Google 有一项非正式的价值观,即“不作恶”。许多人会把这项宗旨引申到商业战略上,而忽视了不作恶在日常工作中的应用。不作恶不仅仅指写出来正确的代码,而是指如何写才能不坑害未来接受的人。
程序员可以很轻松的理解需求意图,但如何通过一行行简单的代码让别人通过推理来理解自己当时的意图,让系统不会因为自己的代码产生更多的复杂度陷阱,是一项很艰苦的工作。
尽管这些工作会浪费掉自己很大的一部分时间,甚至自己的成绩都会因此受到影响,但比起未来这种复杂性所带来的更多修复代价,依然选择不作恶的行为,才是我们面对世界的价值观与态度。
编程之难,难在自己的心性,难在价值观的抉择,而看书的过程,既是学习编程的过程,也是修养自己心性的过程。
上京东
享受 6.8折优惠