笔记:怎么学习编程


我自己的一点感想

关键点一:不断更新自己的信息来源

这就需要定期整理自己的信息,大概分析下这些信息的来源,评估一下哪些是低效的,二手以上的信息,哪些是高效一手的信息。

目前相对可靠又十分便捷的信息渠道是:

  • GitHub
  • Google
  • medium
  • 官方文档
  • 长期更新的高质个人博客
关键点二:养成记录、分析数据的习惯

这里强调对自己平常的时间花费进行记录。比如这种:小实验:对17年两周的作息时间分析

关键点三:定期回顾积累的知识

这是一种看似慢节奏耽误时间的行为 ,但其实稍微把周期拉长一点去看,这是一种高效的行为。这其实是区分短视的人和有远见的人的一个标准。看似一个小的转变,背后其实反映了很多很多。

回到复习知识上来,对系统级别的,整体的知识积累特别需要执行好这点。并且重点还不是执行了复习这一行为就行了,重点是不断思考积累的知识之间的关联,层级。这很费精力,所以大部分人只走个复习的形式,逃避思考。

具体的做法是:留好大段的整块时间专门用来思考,边回顾边思考,要切实的感觉很累为止,并且如何判断是否执行了思考的标准是——思考完后一般都有很多想记录下来的想法,很多想通了的那种兴奋。


怎么练习语言和框架

参考自文章:演进:在工作的前三年里快速成长(练习篇)

  1. 买本相关的书籍,或者寻找份教程、官方指南。

  2. 再找个合适的Demo,熟悉基础概念,并掌握好相关基础

  3. 在Demo的基础上,实现一些业务功能,了解各种特性、功能

  4. 查看官方文档,查有没有漏掉了什么重要的东西

  5. 撰写博客、日志来记录这个过程


工程实践怎么练习:模仿开源软件

软件工程实践包括:

  • 使用版本管理
  • 使用持续集成
  • 完整的测试用例
  • 代码检视
  • 等等

这方面可以参考优秀的开源软件。他们为了保证好的项目质量,拥有者往往付出很多精力提高软件工程的实践。

所以练习提高软件工程实践最好是去模仿开源软件,并且自己去创造一些轮子。


如何正确练习提高

框架用多了其实提升很少。真正的提升方法:

  • 阅读开源软件与重构代码
  • 造自己的轮子来重写应用
  • 结合设计模式
  • 引入其他领域思想

展开这四点,以下引用原文:

阅读开源软件与重构代码

如果在工作环境中,没有代码写得比较好的人,那么我们就只能从开源代码中去学习。笔者之前写过一篇《如何以“正确的姿势”阅读开源软件代码》的文章,文中我建议的阅读开源软件代码的方式是:

  • clone 某个项目的代码到本地。
  • 查看这个项目的 release 列表。
  • 找到一个看得懂的 release 版本,如1.0或者更早的版本。
  • 读懂上一个版本的代码。
  • 向后阅读大版本的源码。
  • 读最新的源码。

可只读这些代码,不能让我们显著的提高水平,我们应该结合『重构』这个技能来练习。从我的练习经验看来,对于重构的练习是最有意思的。我们可以见证,一段不好的代码在我们的调教之下,焕发出新的光彩。当我们重构一段坏味道的代码,对比重构前后的代码,便会发现自己竟然有这样神奇的能力。

如果找不到合适的练习项目,可以到 GitHub 上找一些 star 多,但是没有测试、缺少 CI 等的项目练习,这样的项目在 GitHub 上也是蛮多的。

有一次,我在寻找一个迷你的 Markdown 解析器,看到 GitHub 有一个精巧的实现。它有 100+ 的 star,但是没有测试、四百行的代码里,有一个方法有三百多行等等的坏味道。于是,便花了几天的时间,边思考边重构这个项目。这样对编码的提升比较大,因为工作的时候,完成任务是第一优先级,然后才是质量。

因此,对于我们练习来说,我们只需要:

  • 找一个不错的开源库。
  • 阅读其中的代码。
  • 找到代码中设计不好的地方。
  • 对自己认为设计得不好的代码重构。
  • 结合《重构》一书,来改进设计。

需要注意的是:不同的人对于代码设计,有着不同的观点。因此,在这时如果只是因为代码的设计不好,而不是代码里有各种坏味道(code smell),那么,就不应该去给别人的代码提 Pull Request。

造自己的轮子来重写应用

与阅读代码、重构相比,造一个自己的轮子,来实现同样的功能,便是一个更不错的选择。在 Web 开发领域,大部分的开发框架本身都是『通用型』的框架。即它拥有相当多的功能,其中有很多的功能都不会用到。如你使用 jQuery 的时候,你可能只会使用到其中的 Ajax、Event等功能,那么你就可以写一个新的框架,兼容这两个接口。

练习时间充裕的时候,便可以自己动手去做一个。上面说到的阅读框架代码,是一种好的方法。除此无论是前端还是后端,我们都可以找到从零创建框架的资料,来帮助我们理解框架的组成。

通过阅读诸如 Python 里的 Flask、 Ruby 里的 Sinatra 等轻量级的框架,我们就能理解一个框架所需要的元素,并模仿他们做出一个新的系统。这些框架的关注点是:处理 HTTP 请求的 CGI、与数据库交互的 ORM、控制逻辑的 Controller 层、返回 HTML的 View 层等等。除了相关的框架,我们还能在 GitHub 上看到很多人模仿这些框架。做一个这样的后台框架,搭建自己的博客,那就能理解好这一系列的逻辑了。

对于前端来说,也是类似的,诸如 Building React From Scratch,可以让我们在 250 行理解 React 的原理,并做出一个类似的框架。除了 MVC,还有模块化设计、数据请求等等的内容。在两三年前,《JavaScript框架设计》就是这方面一个不错的选择。

我曾经造过一个名为 Lettuce 的前端框架,它的主要目的就是用于:学习前端框架的设计,便在自己的多个业余项目上使用这个框架。而在前端领域,定制自己的 UI 框架、CSS 框架也是一个很不错的选择。再用到自己的博客上,再写上『自豪地采用xx框架』,岂不是更加的自豪?

在底层领域,又有各式各样的《自制操作系统》、《自制编程语言》、《自己动手设计物联网》等等的书籍,它们都能让我们从底层理解一个系统的组成。除此,还有各种各样的剖析类书籍,可以让我们理解底层机制的同时,也能让我们制作出一个框架。

最后,我们只需要能不改写或少数改写代码,将我们的应用运行在上面,便是成功的一个仿造的轮子了。

结合设计模式

设计模式,不同的人有不同的看法。在我看来,一个优秀的程序是要能『看懂』的。即不一定要精通,但要能识别出来,它是一种设计模式。当我们看到了一次又一次的相似设计时,应该猜想到,其背后应该是一种设计模式。如在前端开发框架中的『双向绑定』,它实际上就是发布-订阅模式,又或者称观察者模式的一种实现。

在笔者看来,模式就是一种高级的语言。当别人一说『工厂模式』,多数人瞬间就明白了,不犹得会发出:原来如此,这一类的感叹。认识了一些模式后,一遇到一些特定的场景,我们就能一下子套用这种模式。

可只凭阅读 GoF 的《设计模式》一书,又或者《Head First 设计模式》、《重构与模式》等设计模式书籍,我们所学的知识便是有限的。我们要做的是:

先熟悉书本上的示例代码,来对不同的设计模式有一个大的了解。

识别日常代码中的设计模式。

练习这些设计模式,并掌握常见的设计模式。

尝试在日常的代码中,套用设计模式。

重构现有的代码到设计模式。

要对设计模式进行练习,不是一件容易的事。并且很多时候,容易模棱两可的情况,即适合使用 A 模式,又适合使用 B 模式。这是因为我们是在为设计而设计,因此会尽可能的贴近现有情况。

引入其它领域的思想

不同的领域里,都有自己领域的优秀思想。如我们熟知的设计模式,便是受建筑领域的《建筑的永恒之道》中描述的 253个 建筑模式的启发。又如今天流行的精益思想,最早是来自汽车制造业,可它对软件行来说,有着令人受益匪浅的启发。好的框架、软件是会相互学习,如 iPhone 与 Android,都在不断地借鉴——通知中心,但是又在那之上做一些改进。

又比如,今天的前端框架里,很多思想都是从后端“借鉴”过来的。如 Angular 中采用的依赖注入,便是深受 Java 语言的影响。近一点来说,Redux,框架最初是用在 React 上,但是它已经被推广到了 React 和 Vue.js 上。

因此,当我们发现一个新的优秀思想产生时,便可以尝试引入到自己的领域里。又或者我们所处的领域,正遇到一些难题,答案可能就在别的领域里。可在这方面的练习,往往都是一些创新性的练习。多数时候,我们的探索可能没有结果,但是它往往能对自己有更大的启发。

找到合适的时间练习

每天能有半小时、一小时甚至更长时间的稳定练习,比三天打鱼两天晒网的效果要好得多。清理出一些固定的时间,用于为自己腾出时间来提高自己。既然,你都有时间到这篇文章,那么你应该属于能腾出时间的人。

如果不能的话,那么我们也可以尝试去挤出一些时间,如从上下班去寻找空间。即使是同一公司,不同的人都有不同的上下班时间,所花费在路上的时间也有所不同。有的人,需要在几环外坐个一个多小时的地铁,再转公交才能到公司;有的人,只需要出门左转,走个十分钟就到公司了。因为在路上花费的时间不同,也在一定程度上影响了学习、练习等等的时间。

因此,如果可能的话,应该减少花费在上班路上的时间,才能避免继续陷入这样一个恶性循环:租不起近的房子,花费大量的时间在路上,没有时间提升技能。

早上

早上的练习,是一种慢慢进入一天工作状态的感觉。一旦上班时间到来的时候,就已经进入工作姿态了——对于“资本家”来说,可谓好事一件。早晨刚醒来,总会想不起昨天项目做到哪一步,便更容易反思哪里做得有问题。

如笔者已经习惯了,每天七点起床、洗漱,随后写会代码,再去上班。有时候,可以有一个半小时的练习时间,有时候会有半个小时,将这些时间浪费在梦里总是有些可惜。同时,之前为了能成功地上公交,便提前半个小时到公司,写一些开源软件的代码。毕竟,作为一家非产品公司,你无法和别人解释说,我们做了些什么、取得了哪些成就。

在很多地方,这是一个很好的策略:错开高峰期上下班,路上就不容易堵车。所花在路上的时间就缩短了,那么我们就有时间来练习了。

需要注意的是:练习的时候不要关注时间,而是关注怎么于提高。关键点在于:让每天进步一点。

中午

吃完饭后,因为米饭血糖指数高的缘故,容易犯困。对于北方的同学来说,因为主食不是米饭,所以这就不算是一个问题了。这个时候,身体会妨碍我们进行一些练习。可如果你的午休时间比较长,那么也可以做一些练习,再去休息片刻。

碎片时间

对着屏幕写代码,时间一久,集中力就会开始涣散,便应该休息会儿。刷刷资讯、朋友圈,又或者收集各种资料,开放我们的视野。接收各种新的知识,来扩大自己的视野,以便于自己了解整个市场的水平。

常见的方式有:

阅读个人博客、微信公众号。

维护自己的 Awesome 列表——寻找自己觉得好的开源项目。

IT新闻、技术文章聚合网站——我很不喜欢聚合网站,大部分的聚合站点的行为无异于文章抄袭。

GitHub Trending。

将这些内容存储到 Evernote、WunderList、OneNote 等各式各样的云笔记里,然后定期清理、定期清理、定期清理。收集只是一种方式——没有啥用的方式,因此建议先读完一遍,再去收藏这样的文章。多数时候,我们会发现自己收藏了很多的内容、买了很多的书,但是却没有时间去读。

晚上

经历了漫长的加班,回到住的地方,可能就会想休息了。如果白天没时间练习,晚上也不能抽出时间练习,长期以往,一年的工作经验就要变成五年来用了。

晚上练习的同时,我们应该注意:在睡觉前 30~60 分钟停止编码,否则上床的时候,脑子里可能还是这些代码,就容易失眠。万一灵感一来,那就还要爬起来继续写。这个时候,可以阅读一些相关或者无关的书籍、资料。在阅读的过程中,尽管我们已经不在思考内容。但是潜意识里还在思考中,这时就能很容易就会遇到一些灵感。

最后,休息的时候,尽情睡觉吧~。

怎样才能持之以恒下去

在上文里,我们只谈论一些方法和技巧,可是它们并没有什么用。每个人都知道所谓的『一万小时理论』,但是真正要坚持下来,并没有我们想象中的那么容易。

我们需要从娱乐时间里抽到一部分,原本舒适的玩游戏、睡觉、刷微博时间,现在要成为另外一种『痛苦』?可是,既然这些“无聊的事情”我们都能上瘾,那么我们是不是没有找到合适的路?

设定目标与 SMART 原则

按上文中的分法,练习可以分为:日常固定时间的练习,及针对某一特定主题的练习等多种类型。当我们开始练习某一个具体的技术、框架、模式时,最好能制定一个简单的练习计划,如每几天练习某一内容、多少天内用某一个框架实现什么功能。

先设计一个小的目标,并且能在短期实现。当发现自己可以轻松地坚持下来时,再慢慢的扩大目标,直至我们能做得更好。可是,设定一个练习目标也不是一件简单的事,它也有很多考量的地方。

毕业的时候,在公司接受了针对于毕业生的培训,期间学习到了一个用于制定任务、目标的 SMART 原则:

具体的(Specific)。即我们要有一个明确的目标,如在一周内用 Django 写一个博客系统,而不是用 Django 写个东西。

可度量的(Measurable)。即衡量是否达成目标,我们只需要能创建、查看、删除博客,那么我们就算完成了这样的任务。它可以用来不断地突破自己。

可实现性(Attainable)。即这个目标一定是可以实现的,不能实现的目标没有啥意义。与些同时,练习初期定下的目标不能困难。

相关性(Relevant)。即目标与其他目标的关联情况,如我们练习 Django 是为了提高 Django 或者后台的技能。如果我们的大目标是提高前端技能,那么这个目标对于当前的意义并不是太大。

时限(Time-based)。即时间限制,如上面提到的一周内用 Django 写一个博客系统的期限。

经常能在微信朋友圈看到,朋友的 100 天英语阅读计划,这样的目标就是合理的——可实现的、具体的、有时间限制、可度量的。

如果我们想每天固定时间进行练习,那么我们应该做一个短暂的尝试,如七天,再慢慢的不断扩大时间目标,二十一天、两个月,随后再扩大到一个更大的目标。

坚持与激励自己

我们可以使用 GitHub 上的 Contributions 来激励自己,每一天的痕迹都很明显,甚至于可以拉拢一些小伙伴,与我们一起参加类似的活动。GitHub 本身具有社交属性,可以让我们看到别人做了什么,做了多久。

由于 GitHub 的服务器在国外,访问的时候可能会受限于网络。国内的开源中国的码云和 Coding 也有类似的活跃度,建议访问 GitHub 有问题的读者,可以使用这些服务。

上文中提到的朋友圈 100 天英语阅读计划,也是相似的,它可以让别人监督你是否完成——前提是,有人一起和你做相同的事,因此可以找个人和你一起练习,相互监督。

刚开始练习的时候,练习的内容基本上很充实。时间一长,可能就会陷入一些瓶颈:要么找不到合适的练习内容,要么觉得练习过于乏味。因此这个时候,可以切换不同类型的练习项目——如,做一些自己觉得有意思的小项目练习。又或者,当我们完成一个目标时,给自己一些奖励,以此来鼓舞自己。

总结

练习完之后,还有一种很好的提高方式,就是输出、总结。整理自己练习过程中学到的知识,将之与我们需要的技能做对比,我们就会发现:在哪些地方还需要提高。我们就能制作出下一次练习的目标,不断地反复,以些来提高自己。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容