ARTS-2020-05-31 Review: 快速提升编程能力的关键

2022-12-08,,,,

https://github.com/LiuKay/the-way-to-upgrade/blob/master/ARTS/ARTS-2020-05-31.md

1 Algorithm

最近两周刷了一些 Leetcode 上 ArrayList 相关的基础题

(leetcode 中英文切换可以直接将https://leetcode.com/XXX改为https://leetcode-cn.com/XXX跳到对应题目)

1.1 比较有代表性的题

Array:

  • Container With Most Water

  • 3Sum

  • Climbing Stairs

  • Move Zeroes

  • Remove Duplicates from Sorted Array

List:

  • Reverse Linked List
  • Merge Two Sorted Lists
  • Swap Nodes in Pairs
1.2 思路清奇的题解
  • Plus One

  • Reverse Linked List

1.3 刷题总结

正在实践 覃超推荐的“五毒神掌”–五遍刷题法,有时间做题目的时间比较分散,往往会忘记做题的时间,所以应该还是得记录一下每天做了什么题,按照时间线来进行复习。

在这两周的做题中发现一些固定的模式,

  • 一是双指针法的使用,要理解清楚每个指针的作用是什么,以及何时会改变,还有边界在哪里
  • 解题的过程应该是从简单的思路开始,再到慢慢优化出最佳方案,有时间看到一个题目,直觉里有一个比较模糊的解法,但是在实现的过程中就会忘记一些必要的条件和限制,而这样的限制可能是在最直接的解法里面最明显的。
  • 左右两边往中间逼近的策略,如 contain water,有点让我想起高数里面的"夹逼准测"
  • 升维的思想,比如双指针其实是一种 一维上二维的思想
  • 空间换时间。时间和空间是算法里面最重要的2个维度,当然在目前来看时间的效率更为优先。
  • Discuss区的最高投票里面总能看到各路大神的精彩解答

2 Review

The Key to Accelerating Your Coding Skills - KEN MAZAIKA

作者的个人主页:https://kenmazaika.com/about/

作者在这篇文章中说明了快速提升编程能力关键

2.1 起步阶段:
  • 学习领域相关知识(domain-specific knowledge),比如用 Ruby怎么写循环,用代码从数据库读取特定数据, 这方面的知识往往与具体的编程环境相关
  • 要成为一个自学自足开发者的第一步就是能够完成具体的任务。
  • 对初学者来说,最重要的技能是能够关注细节,一是能够读懂错误信息,能够Debug error message, 知道发生了什么,二是能够从每一个你犯的错误中去学习,当下次再遇到的时候就能够快速的解决
  • 善用 Google 进行搜索
  • 你永远不可能知道所有的知识来解决所有的问题,要保持终生学习的态度

当下面这些情形发生的时候,说明你已经度过起步阶段进入下一阶段了:

  • 当你遇到很多错误信息时你已经不在像开始时那样害怕,反而能够知道怎么去解决他们
  • 当你十分擅长通过搜索引擎来寻找解决方案
  • 当你能够从曾经写过的代码中来学习,而不是从头开始一步一步的重新来过
2.2 转折点

这个阶段称为The Inflection Point, 虽然只是整个学习过程的一部分,但却是最重要的一个阶段,因为在这个阶段你将要面对的是那些没有现成答案的问题。

很多时候你会觉得自己并没有准备好,而且倾向于去做一些基础性的工作,比如一些Get started工作。这个阶段你甚至会怀疑自己是不是真的适合做一名开发人员。一个很重要的原因是:

During the inflection phase, you will be coding 10-20 times SLOWER than in the previous phase

在这个转折点上,你的编码速度将会比入门时慢10到20倍

尽管在感觉上你会觉得自己进步很慢,甚至自我怀疑,但是实际上,你其实在那些最重要的事情上取得进步。

这里作者引出了相对于domain-specific knowledge 的另一种知识:procedural knowledge

Procedural knowledge is the ability to teach yourself what you don’t know along the way.

简单来说就是在学习过程中如何自学自己不知道的东西的能力。比如你要实现一个新的功能,你该如何开始,如何设计,如何实现?

对于开发者来说,domain-specific knowledgeprecedural knowledge同样重要。

作者给出了对开发者的中肯建议:

For the rest of your life, go outside your limits every single day

对于很多工程师来说,他们一旦找到自己的舒适区就会裹足不前,他们大多数以维护者的身份出现。而你应该追寻的是那些每天都在寻找突破自己能力限制的人,尝试去解决那些在你技术栈之外的问题,以此来扩展你的技能。

2.3 两个拐点
  1. The web development inflection point

    你有能力构建任何数据库驱动的系统 ,我们通常来说叫掌握了CRUD

  2. The algorithm and data structures inflection point

    算法和数据结构,掌握数据结构和算法意味着掌握了某一门编程语言的基本知识,以及操纵数据和能够理解一些性能上的取舍

2.4 关于拐点的结论

When learning to code,domain-specific knowledge doesn’t matter in the grand scheme of things

当学习编码时,domain-specific knowleage其实并没那么重要,真正重要的是:

  • 你对 web 开发框架有一个扎实的理解
  • 能够掌握用任何一种你所熟悉的语言写出复杂算法的实现

这里作者用各大厂为什么如此看重算法和数据结构来举例说明,真正重要的东西其实就是这2样。

2.5 在拐点你将学会的

对于开发者来说,最好的参考就是你曾经写过的类似的代码,当你完全理解了你所写的东西,你根本不用去记他们,所以每次开发一个新的功能时请先反问一下自己 :“我是不是写过类似的代码?”如果是,请翻出以前的代码并逐行解释给自己,现在是否能够重用?

2.6 高效通过拐点的策略

During the tutorial phase, take breaks from going over structured material and give yourself challenge problems along the way

  • try to do something that is outside the scope of the tutorial - 尽量做一些超出入门教程的尝试
  • Try to use tutorials as little as possible - 少使用辅导教程,多参考 GitHub 文档
  • Focus on the essentials and use repetition - 刻意练习,重复练习

通过拐点是一件很有挑战性的事,理解这些能够帮助你更好的学习:

  • 明白这个阶段本身就是困难和不那么轻松的,
  • 明白在这个阶段其实是在跟你自己的信心做斗争,你的感受其实很常见,想想那些比你牛的人
  • 持续的努力,但是不要过度透支自己
2.7 如何知道自己已经通过拐点

The final stage of the inflection point process is acceptance. Acceptance that software
development is a process of continuous learning

终于明白编程其实是不断持续的学习,去解决更为复杂的问题。

学习是为了找到方法,而不是问题的答案。

3 Tips

Typora + PicGo + Gitee 完全使用Markdown 写作

Typora 是一个所见即所得的 Markdown 编辑器,支持 Windows, Mac 等,用它来进行 markdwon 写作简直不要太爽。但是众所周知 markdown 写作的一个问题就是图片链接,在本地写作时,插入的链接可以是本地图片的路径,这就导致了在需要发布文章的时候,需要手动将图片上传到图床上去,然后替换为网络地址。所幸的是 Typora 也帮我们解决了这个问题。 Typora 本身不支持上传图片,但是它支持使用第三方的图床工具,比如我们这里要用到的 PicGo

PicGo 是一个强大的开源的图床工具,支持各大图床如腾讯云COS, 七牛云等,甚至还能使用 GitHub 作为图床仓库,上传图片自动返回图片链接到Typora

在安装好了 PicGo 之后,进入 Typora 的偏好设置->图像->上传服务设定选定 PicGo 的安装程序即可。

需要注意的是,如果使用 GitHub 作为图床,由于网络原因有时候图片可能出现无法显示的问题,这个时候其实可以替换成以Gitee(码云)作为图床,需要在 PicGio 安装github 的一个插件,如下图,配置和 github 类似,可以参考 PicGo 的使用文档,这样在国内的环境下图片显示还是很稳定的。

可以参考这篇文章进行 Gitee 作为图床的配置以及 PicGo 的官方文档, 这些地方都有详细的教程,我就不再赘述。

Gitee图床+PicGo+Typora便捷在博客中使用图片

PicGo

4 Share

在我看来作为一名软件开发者,应该是有最基本的职业素养的,而不是说只要功能能跑就行了,这当然是最低的标准,但是如果仅仅只是满足于功能能跑就行,那也只能在日复一日的重复劳动中度过。

工程师也应该站在客户的角度去理解问题,即所谓的business value,你所做的工作到底能够给用户带来多大的价值,这是公司评判你贡献的标准,如何提高这方面的输出,才是公司愿意给你高薪的理由。